Hướng dẫn cơ bản về git cho người mới bắt đầu
Hướng dẫn cơ bản về git cho người mới bắt đầu
- Git là gì? Tại sao nên và cần sử dụng git?
- Cài đặt và sử dụng git?
- Hướng dẫn nộp bài tập qua
git
cho học viênpyfml
- Phụ lục
I. Git là gì? Tại sao lại sử dụng git?
- Thứ nhất, Git là 1 hệ thống quản lí phiên bản phân tán (DVCS - Distributed Version Control System) ??? Nhưng hiểu thế nào là 1 hệ thống quản lí phiên bản, rồi lại phân tán gì ở đây? Để đơn giản có thể hiểu DVCS là hệ thống lưu trữ các tập tin ( file, thư mục, …) theo thời gian, tương ứng với nhiều phiên bản khác nhau của các tập tin đó, và bạn hoàn toàn có thể quay lại 1 phiên bản xác định nào đó sau này, xem lại các thay đổi thực hiện theo thời gian hay làm việc trên nhiều
nhánh
khác nhau của 1 dự án ! Nghe thật kì diệu phải ko? - Vậy tại sao lại sử dụng git? Có lẽ mình sẽ lấy 1 ví dụ cho các bạn dễ hình dung:
Vào 1 ngày đẹp trời, 2 anh A và B cùng bắt tay vào thực hiện 1 dự án (xây dựng 1 website eCommerce cho khách hàng chẳng hạn). Tất nhiên, khối lượng công việc khá nhiều nên 2 người chia nhau làm các chức năng hay feature cho dự án đó. Bạn cứ thử tưởng tượng mà xem, anh A viết code rồi gửi cho anh B, anh B viết code rồi gửi cho anh A, vậy bạn nghĩ họ sẽ làm thế nào để có thể
có được
code của nhau để tiếp tục phát triển dự án. Có thể họ sẽ gửi file qua email hay lên paste code lên đâu đó rồi share link cho nhau ?? Lúc đó nảy sinh 1 vấn đề, giả sử anh A vô tình viết sai code dẫn đến phần mềm bị lỗi, gỡ lỗi mãi chưa được hoặc chỉ đơn giản là quay lại đoạn code trước mà anh ta thấy tối ưu hơn chẳng hạn thì giờ làm thế nào? Chắc chắn là không được và cứ thế, 2 người lại tiếp tục xây dựng lại tính năng đó và tiếp tục gửi code cho nhau như vậy !
- Có lẽ đọc mẩu chuyện ngắn bên trên, bạn cũng sẽ hiểu được 1 số vấn đề mà 2 anh A và B gặp phải:
- Việc gửi code qua email hay share link code cho nhau rất rất tốn thời gian.
- Không theo dõi được tiến độ của dự án hoặc những thay đổi của người trong 1 nhóm vào sản phẩm.
- Code ko được sao lưu và cập nhật thường xuyên khiến cho việc quay lại các phiên làm việc trước đó hết sức khó khăn !
- Và đó chính là các vấn đề mà git có thể giải quyết 1 cách đơn giản chỉ bằng 1 vài dòng lệnh !
II. Cài đặt git
1. Trên Linux:
- Ubuntu:
sudo apt-get install git
2. Trên Window:
- Trên window thì việc cài đặt sẽ khó khăn hơn 1 chút, để đơn giản. bạn truy cập vào đường dẫn: https://www.git-scm.com/downloads và tại về bản git dành cho window bao gồm cả giao diện đồ họa GUI và terminal.
III. 1 số thao tác cơ bản khi sử dụng Git - Github
- Nếu bạn dùng window thì có thể xem tài liệu hướng dẫn sử dụng git với Window
- Việc đầu tiên cần làm sau khi cài đặt git đó là thiết lập các thông số cấu hình ban đầu của git trên máy, bao gồm
username
vàemail
của bạn. Trên terminal các bạn gõ lần lượt từng lệnh:
git config --global user.name "Your name"
git config --global user.email "youremail@gmail.com"
1. Các thao tác cơ bản:
- Tiếp sau đó, bạn cần tạo
repository
haythư mục chứa code
, nơi sẽ lưu giữ toàn bộ mã nguồn của bạn. Trên terminal, bạn tạo ra 1 thư mục trên máy là truy cập vào thư mục đó:
mkdir test_repo # lệnh tạo thư mục
cd test_repo # truy cập vào thư mục test_repo
- Trong thư mục
test_repo
, bạn thực hiện lệnh:
git init
Lệnh này sẽ khởi tạo 1 thư mục .git
bên trong thư mục làm việc cuả bạn, là nơi chứa các thiết lập về git cũng như thông tin về kho chứa. Bạn có thể thấy 1 thông báo rằng đã khởi tạo 1 kho chứa thành công
(venv) ╭─phanhoang@phanhoang-PC ~/workspace
╰─➤ mkdir test_repo
(venv) ╭─phanhoang@phanhoang-PC ~/workspace
╰─➤ cd test_repo
(venv) ╭─phanhoang@phanhoang-PC ~/workspace/test_repo
╰─➤ git init
Initialized empty Git repository in /home/phanhoang/workspace/test_repo/.git/
(venv) ╭─phanhoang@phanhoang-PC ~/workspace/test_repo ‹master›
╰─➤ ls -a
. .. .git
- Giờ bạn sẽ tạo mới 1 file ( hoặc thư mục ) tùy ý và thực hiện lệnh
git status
(venv) ╭─phanhoang@phanhoang-PC ~/workspace/test_repo ‹master›
╰─➤ touch README.md
(venv) ╭─phanhoang@phanhoang-PC ~/workspace/test_repo ‹master*›
╰─➤ git status
On branch master
Initial commit
Untracked files:
(use "git add <file>..." to include in what will be committed)
README.md
nothing added to commit but untracked files present (use "git add" to track)
- Như bạn có thể thấy, sau khi bạn tạo mới 1 file trên thư mục làm việc sẽ có 1 thông báo xuất ra màn hình báo
file chưa được theo dõi
( dòng README.md sẽ hiện màu đỏ ), giả sử bạn xóa file này đi thì git cũng không quan tâm. Hiểu đơn giản, git quản lí tập tin nên nếu bạn thay đổi hay tạo mới bất cứ 1 file ( hay thư mục ) mà chưa thông báo cho git thì mọi thay đổi trên file ( thư mục ) đó git sẽ chưa thể quản lí ( theo dõi ) được. Để cập nhật file ( thư mục ) đã được thay đổi, trên terminal các bạn thực hiện lệnhgit add tên_file
, rồigit status
:
(venv) ╭─phanhoang@phanhoang-PC ~/workspace/test_repo ‹master*›
╰─➤ git add README.md
(venv) ╭─phanhoang@phanhoang-PC ~/workspace/test_repo ‹master*›
╰─➤ git status
On branch master
Initial commit
Changes to be committed:
(use "git rm --cached <file>..." to unstage)
new file: README.md
- Bạn có để ý thấy điều gì ko? Git báo file đã được cập nhật và có 1 file mới
README.md
màu xanh. Tuy nhiên, khi thực hiệngit add tên_file
ta mới thông báo cho git là file đã đc cập nhật nhưng chưa hề được đánh dấu version ( hay các phiên làm việc ). Để làm được điều đó, ta thực hiện lệnhgit commit -m "tên lời nhắn"
:
(venv) ╭─phanhoang@phanhoang-PC ~/workspace/test_repo ‹master*›
╰─➤ git commit -m 'add README.md'
[master (root-commit) 43e1e93] add README.md
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 README.md
(venv) ╭─phanhoang@phanhoang-PC ~/workspace/test_repo ‹master›
╰─➤ git status
On branch master
nothing to commit, working directory clean
-
Tên lời nhắn
chính là thao tác bạn vừa thực hiện trên thư mục đó. Lời nhắn nên để ở thì hiện tại đơn và nên ngắn gọn, dễ hiểu. Xong khi thực hiệncommit
, ta thấy git tạo ra 1 mã hashcode[master (root-commit) 43e1e93] add README.md
kèm theo đó là tên lời nhắn vừa thực hiện. Gõgit status
thì git báo chưa có gì để cập nhật hay hiện tại chưa có bất kì 1 sự thay đổi nào trong thư mục làm việc ! -
Để xem lại các commit trước, bạn thực hiện lệnh
git log
:
commit 43e1e9398960d2d686bae38a05c269152228b157
Author: huyhoang17 <hoangphan0710@gmail.com>
Date: --- --- - --:--:-- ---- +0700
add README.md
(END)
- Bạn có để ý thấy 7 kí tự đầu trên mã hashcode và tên commit tương ứng như lúc nãy mình vừa thực hiện lệnh
git commit -m "tên lời nhắn"
ko ? Vậy là bạn đã thực hiện xong commit đầu tiên, việc tiếp theo sẽ thực hành trên github.
2. Thao tác với Github:
- Git và Github là 2 thứ hoàn toàn khác nhau. Git là 1 DVCS như mình đã giới thiệu từ ban đầu. Còn Github là 1 dịch vụ cung cấp các repo online mà người dùng sử dụng để tạo các kho chứa của riêng mình.
- Đầu tiên, các bạn truy cập vào https://github.com/ và đăng kí 1 tài khoản.
- Bước tiếp theo khá quan trọng, trên terminal các bạn thực hiện lệnh
ssh-keygen
, việc này sẽ tạo 1private key
, 1public key
, sau đó copypublic key
để chuẩn bị thực hiện bước tiếp theo (bước tạo ssh-key này bạn có thể xem phần hướng dẫn sử dụng git trên window)
╰─➤ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/phanhoang/.ssh/id_rsa): /home/phanhoang/.ssh/id_rsa_test
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/phanhoang/.ssh/id_rsa_test.
Your public key has been saved in /home/phanhoang/.ssh/id_rsa_test.pub.
The key fingerprint is:
4a:8d:bc:ec:27:5a:c6:01:da:14:a6:61:57:7b:c3:f5 phanhoang@phanhoang-PC
The key's randomart image is:
+--[ RSA 2048]----+
| o +.. . |
| . = . o . . |
| . o . + E |
| + o + . |
| . . = S |
| + + |
| B |
| +. . |
| ...o |
+-----------------+
(venv) ╭─phanhoang@phanhoang-PC ~
╰─➤ cat /home/phanhoang/.ssh/id_rsa_test.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC05XxMT7Nu9X//DrANSxMMP/HcWFD6ntBX0VkXqplIkq9BmHqQr4c6rclfI5P8A8ZMKaNHiH91OjdbJYqkYvW4tvvHl3qDVcc1/5q81iW3MZeCmCroa0Z7cTCD6eHVZcXoHGq/sZ2BBirBckdoKBb9/chJdEzvEPhpQ9ar3SiQNuOuVuiObkgg67sUuZj/2VazV9usVp962aSxrsnwEesTgnIqkLbErHCAaYgaPz4RsH+xYHwogRXF+PzAFF90ec0hPpJCcktKuaiP80JmMR3nPBgnFfu0/ZmgeO28FvA5nkxJTYN+4hQI4bEC6ZCums0MpX7wfSD/iKsRwTctOZMR phanhoang@phanhoang-PC
- Sau khi đã copy key, trên tài khoản github, mọi người chọn settings > SSH and GPG keys > chọn New SSH keys. Dán key vừa copy vào
Key
, thêmTitle
và chọnAdd SSH key
.
- Bước tiếp, trên github, các bạn tạo mới 1
repository
ở góc trên cùng bên phải. Đặt tên repo, description, rồi chọn tạo mới repo:
- Ở đây có 2 tùy chọn. Thứ nhất là bạn đã có sẵn 1 thư mục trên máy là muốn link thư mục trên local đồng bộ với thư mục trên github, bạn thực hiện lệnh:’
git remote add origin `tên đường dẫn đến repo của bạn`
- Hoặc đơn giản bạn chỉ muốn kéo repo đó về, thực hiện lệnh:
git clone `tên đường dẫn tới repo của bạn`
- Ở đây để đơn giản, mình sẽ clone repo về máy:
(venv) ╭─phanhoang@phanhoang-PC ~
╰─➤ git clone git@github.com:huyhoang17/test.git
Cloning into 'test'...
warning: You appear to have cloned an empty repository.
Checking connectivity... done.
(venv) ╭─phanhoang@phanhoang-PC ~
╰─➤ ls | grep test
test
(venv) ╭─phanhoang@phanhoang-PC ~/test ‹master›
╰─➤ cd test
- Giờ cả repo trên local và trên github đều chưa có bất kì file nào. Ta tạo mới 1 file trên local rồi cũng thực hiện các thao tác cơ bản như ở trên:
git add 'tên file' và git commit -m 'tên lời nhắn'
:
(venv) ╭─phanhoang@phanhoang-PC ~/test ‹master›
╰─➤ echo "Hello Git, Github" >> README.md
(venv) ╭─phanhoang@phanhoang-PC ~/test ‹master*›
╰─➤ ls
README.md
(venv) ╭─phanhoang@phanhoang-PC ~/test ‹master*›
╰─➤ git add README.md
(venv) ╭─phanhoang@phanhoang-PC ~/test ‹master*›
╰─➤ git commit -m "add README.md"
[master (root-commit) 026a01e] add README.md
1 file changed, 1 insertion(+)
create mode 100644 README.md
(venv) ╭─phanhoang@phanhoang-PC ~/test ‹master›
╰─➤ git status
On branch master
Your branch is based on 'origin/master', but the upstream is gone.
(use "git branch --unset-upstream" to fixup)
nothing to commit, working directory clean
- Hiện tại repo trên máy mình đã có 1 file
README.md
nhưng bây giờ bạn thử truy cập repo đó trên github thì hoàn toàn chưa thấy file đó. Để thực hiện đẩy file sau khi đã commit lên github, ta thực hiện lệnh:
(venv) ╭─phanhoang@phanhoang-PC ~/test ‹master›
╰─➤ git push origin master
Counting objects: 3, done.
Writing objects: 100% (3/3), 237 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To git@github.com:huyhoang17/test.git
* [new branch] master -> master
master
chính là tên nhánh ban đầu bạn làm việc. Ta sẽ bàn về việc tạo nhánh trong phần sau của hướng dẫn. Như bạn đã thấy, git đã thực hiện thành công việc đẩy file lên github. Bây giờ bạn thử truy cập lại repo trên Github mà xem, BINGO …:
- Như vậy bây giờ, thư mục trên máy và trên github đã được đồng bộ với nhau. Giả sử bây giờ mình tạo 1 file mới ngày trên github tên
abc.py
. Khi đó để cập nhật file đó xuống dưới local, bạn thực hiện lệnh:
(venv) ╭─phanhoang@phanhoang-PC ~/test ‹master›
╰─➤ git pull
Updating 026a01e..0e3215d
Fast-forward
abc.py | 1 +
1 file changed, 1 insertion(+)
create mode 100644 abc.py
(venv) ╭─phanhoang@phanhoang-PC ~/test ‹master›
╰─➤ ls
abc.py README.md
- Đó là 1 số các hướng dẫn cơ bản khi làm việc với git và các dịch vụ quản lí repo như github.
III. Hướng dẫn nộp bài tập qua git cho học viên PyFML
- Tạo tài khoản gitlab ( gitlab cũng là 1 dịch vụ quản lí repo như github, nhưng cho phép tạo repo private miễn phí, bạn có thể xem thêm phần phụ lục ở cuối bài ):
- Thêm
SSH-KEY
trên tài khoản gitlab của bạn (tương tự như github ở bên trên). - Clone project:
git clone https://gitlab.com/pyfml/pyfml
- Kiểm tra nhánh ( branch ):
(venv) ╭─phanhoang@phanhoang-PC ~/workspace/pyfml ‹master›
╰─➤ ls
01_lecture.rst 05_lecture.rst 09_lecture.rst 12_lecture.rst FAQ.rst lectures.rst requirements-doc.txt untitled.txt
02_lecture.rst 06_lecture.rst 10_lecture.rst conf.py final-exam.rst Makefile requirements-freeze.txt whatnext.rst
03_lecture.rst 07_lecture.rst 11_flask exercises git.rst nopbai.py requirements.txt
04_lecture.rst 08_lecture.rst 11_lecture.rst exercises.rst index.rst README.rst Resource
(venv) ╭─phanhoang@phanhoang-PC ~/workspace/pyfml ‹master›
╰─➤ git branch
* master
Như bạn thấy, hiện tại chỉ có duy nhất 1 nhánh tên master
. Sau khi clone về bạn tạo mới 1 nhánh trên repo của bạn bằng lệnh git checkout -b 'tên nhánh'
:
(venv) ╭─phanhoang@phanhoang-PC ~/workspace/pyfml ‹master›
╰─➤ git checkout -b hoang
Switched to a new branch 'hoang'
(venv) ╭─phanhoang@phanhoang-PC ~/workspace/pyfml ‹hoang›
╰─➤ git branch
* hoang
master
Hiện tại thì bạn đang làm việc trên nhánh hoang
. Ví dụ bài tập tuần 3, bạn tạo mới 1 nhánh con tên hoang_bai3
chẳng hạn, sau đó tạo mới 1 thư mục hoang_ex3
chứa toàn bộ các file bài tập của tuần 3 (hiện tại bạn đang đứng trên branch hoang_bai3
:
(venv) ╭─phanhoang@phanhoang-PC ~/workspace/pyfml ‹hoang›
╰─➤ git checkout -b hoang_bai3
Switched to a new branch 'hoang_bai3'
(venv) ╭─phanhoang@phanhoang-PC ~/workspace/pyfml ‹hoang_bai3›
╰─➤ git branch
hoang
* hoang_bai3
master
(venv) ╭─phanhoang@phanhoang-PC ~/workspace/pyfml ‹hoang_bai3›
╰─➤ mkdir hoang_ex3
- Để chuyển sang nhánh khác, thực hiện lệnh
git checkout 'tên nhánh'
:
(venv) ╭─phanhoang@phanhoang-PC ~/workspace/pyfml ‹hoang_bai3›
╰─➤ git checkout hoang
Switched to branch 'hoang'
- Khi nộp bài tập, các bạn cũng thực hiện các lệnh
git add
,git commit
trên branch bài tập tương ứng từng tuần (vd: hoang_bai3) và commit lên gitlab (lưu ý: tuyệt đối không push bài tập trên branchmaster
):
git push origin hoang_bai3
- Thực hiện tạo Merge Request trên Gitlab. Chú ý chọn
Source branch
làhoang_bai3
,Target branch
làhoang
. Assign lại cho các giảng viên và trợ giảng để review code của bạn.
IV. Phụ lục:
- Git tutorial: https://git-scm.com/book/en/v2
-
How to add a new SSH key to your GitHub account: https://help.github.com/articles/adding-a-new-ssh-key-to-your-github-account/
-
Điểm khác nhau giữa Github và Gitlab:
-
Giống nhau: Cả hai đều là các dịch vụ quản lí repo ( thư mục chứa mã nguồn của bạn ), không giới hạn số lượng repo bạn tạo ra.
-
Khác nhau:
- Gitlab cho phép bạn có thể tạo repo private mà không phải trả phí, với Github bạn sẽ phải trả phí khi muốn tạo 1 repo private.
- Gitlab cung cấp giao diện trực quan hơn, nhiều tùy chọn hơn, thuận tiện hơn trong việc review bài tập của học viên.
-