Bài 8. git
Tác giả: Nguyễn Văn Quân
1. Git là gì?
Git là một hệ thống quản lý phiên bản phân tán (Distributed Version Control System – DVCS), nó là một trong những hệ thống quản lý phiên bản phân tán phổ biến nhất hiện nay. Git cung cấp cho mỗi lập trình viên kho lưu trữ (repository) riêng chứa toàn bộ lịch sử thay đổi.
2. Version Control System – VCS là gì?
-
VCS là viết tắt của Version Control System là hệ thống kiểm soát các phiên bản phân tán mã nguồn mở. Các VCS sẽ lưu trữ tất cả các file trong toàn bộ dự án và ghi lại toàn bộ lịch sử thay đổi của file. Mỗi sự thay đổi được lưu lại sẽ được và thành một version (phiên bản).
-
VCS giúp bạn có thể lưu trữ nhiều phiên bản khác nhau của một mã nguồn được nhân bản (clone) từ một kho chứa mã nguồn (repository), mỗi thay đổi vào mã nguồn trên local sẽ có thể server nơi đặt kho chứa chính.
-
Mỗi phiên bản bao gồm: nội dung file bị thay đổi, ngày giờ sửa đổi, người thay đổi là ai, lý do thay đổi hay tên phiên bản, …
3. Các thuật ngữ Git quan trọng
3.1 Branch
-
Các branch (nhánh) đại diện cho các phiên bản cụ thể của một kho lưu trữ tách ra từ project chính của bạn.
-
Branch cho phép bạn theo dõi các thay đổi thử nghiệm bạn thực hiện đối với kho lưu trữ và có thể hoàn nguyên về các phiên bản cũ hơn.
3.2 Commit
Một commit đại diện cho một thời điểm cụ thể trong lịch sử dự án của bạn. Sử dụng lệnh commit kết hợp với lệnh git add
để cho git biết những thay đổi bạn muốn lưu vào local repository.
3.3 Head
Các commit ở đầu của một branch được gọi là head. Nó đại diện cho commit mới nhất của repository mà bạn hiện đang làm việc.
3.4 Master
-
master
là nhánh chính của tất cả các repository của bạn. Nó nên bao gồm những thay đổi và commit gần đây nhất. -
Đối với
github
nhánh chính làmain
.
3.5 Origin
Origin là phiên bản mặc định của repository. Origin cũng đóng vai trò là bí danh hệ thống để liên lạc với nhánh chính.
Lệnh git push origin master
để đẩy các thay đổi cục bộ đến nhánh chính.
3.6 Remote
Một Remote (kho lưu trữ từ xa) là một bản sao của một chi nhánh. Remote giao tiếp ngược dòng với nhánh gốc (origin branch) của chúng và các Remote khác trong kho lưu trữ.
3.7 Repository
Kho lưu trữ Git chứa tất cả các tệp dự án của bạn bao gồm các branch, tags và commit.
3.8 Tags
Tags cung cấp cho bạn một cách để theo dõi các commit quan trọng. Các tags nhẹ chỉ đơn giản đóng vai trò là con trỏ trong khi các tags chú thích được lưu trữ dưới dạng các đối tượng đầy đủ.
Xem Git docs reference để biết thêm chi tiết về thuật ngữ liên quan đến Git.
4. Cách sử dụng cơ bản
4.1 Tạo kho lưu trữ (Repository) mới
Để làm việc với Git, trước tiên bạn cần cho nó biết bạn là ai. Bạn có thể đặt tên người dùng của mình bằng lệnh git config
:
git config --global user.name "your name goes here"
Khi nó được khởi động, bạn sẽ cần một repo để làm việc. Việc tạo một repo rất đơn giản. Sử dụng lệnh git init
trong một thư mục:
mkdir example
cd example
git init
Kiểm tra trạng thái
git status
Lệnh này sẽ cho bạn biết bạn đang ở branch
nào, những file thay đổi chưa được commit
4.2 Thêm file mới
Tạo mới một file, ví dụ hello.py
. Sau đó kiểm tra trạng thái bằng lệnh
git status
On branch master
Initial commit
Untracked files:
(use "git add <file>..." to include in what will be committed)
hello.py
nothing added to commit but untracked files present (use "git add" to track)
Sử dung lệnh git add
để thêm nó cào stage changes
git add ./hello.py
4.3 Ghi nhận thay đổi
git commit -m "creating hello.py"
[master (root-commit) 25b09b9] creating hello.py
1 file changed, 3 insertions(+)
create mode 100755 hello.py
git status
On branch master
nothing to commit, working directory clean
5 Làm việc với kho lưu trữ trên remote
5.1 Clone
Sao chép một kho lưu trữ trên remote
về local
git clone https://link/to/repo
5.2 Fetch
Tìm nạp các bản sao và tải xuống tất cả các tệp branch vào máy tính của bạn. Sử dụng nó để lưu các thay đổi mới nhất vào kho lưu trữ của bạn. Nó có thể tìm nạp nhiều branch cùng một lúc.
git fetch
5.3 Đẩy thay đổi lên remote
git push
5.4 Kéo những thay đổi tử remote
về
git pull
5.5 Branch
Xem các branch hiện có
git branch # Các branch trên local
git branch -r # Các branch trên remote
git branch -a # Các branch ở cả local và remote
Chuyển branch
git checkout <tên nhánh>
Tạo và chuyển sang branch mới
git checkout -b <tên nhánh>
Chuyển branch trên remote
git fetch --all # Tìm nạp nội dung của các nhánh
git checkout <tên nhánh>
5.6 Log
Lệnh git log
giúp bạn xem lại thông tin lịch sự commit
, nhằm giám sát sự thay đổi của dự án. Lệnh git log
có nhiều tham số để xuất ra, định dạng các thông tin hiện thị theo cách mong muốn. Bạn có thể định dạng cách các thông tin mỗi commit
được in ra khi xem, cũng như có thể lọc thông tin nào đó.
Mặc đinh thi hành git log nó liệt kê các commit theo thứ tự từ mới nhất đến cũ nhất, mỗi commit có các thông tin gồm: mã hash của commit, dòng thông báo, người tạo commit và ngày tạo commit
git log
Khi số lượng log nhiều, nó hiện thị trước một trang log, sau đó có dấu nhắc chờ lệnh để bạn điều hướng, tìm kiếm, … Để có trợ giúp về các lệnh này hãy nhấn h tại dấu nhắc lệnh
Một số phím chức năng bạn có thể nhập đề điều hướng và tìm kiếm trong log như:
- Enter - dòng tiếp theo
- w - trang tiếp
- spacebar - trang trước
- q - thoát
- ?pattern - tìm kiếm, với pattern là mẫu tìm kiếm (keyword)
- /pattern - giống ?pattern
- n - đến vị trí tìm kiếm phía dưới
- N - đến kết quả tìm kiếm phía trước
Thiết lập hay dùng với git log
Nếu chỉ muốn hiện thị một số commit log, ví dụ hiện thị log của 2 commit cuối thì cho thêm -2
vào lệnh
git log -2
Nếu muốn hiện thị chi tiết các thay đổi của từng commit thì thêm vào tham số -p
git log -2 -p
Nếu hiện thị thống kế gọn hơn về sự thay đổi thì dùng tham số --stat
, hoặc dạng ngắn gọn hơn là --shortstat
git log --stat
git log --shortstat
Định dạng thông tin chung về commit (mã hash, dòng thông tin) trên một dòng thì dùng tham số --oneline
git log --oneline
Ngoài ra các bạn có thể tìm hiểu thêm phần lọc nâng cao với git log
5.7 Xử lí conflict
git pull
Auto-merging hello.py
CONFLICT (content): Merge conflict in hello.py
Automatic merge failed; fix conflicts and then commit the result.
Khi thực hiện pull code sẽ có những lúc các bạn gặp tình trạng code ở local và trên remote bị xung đột (conflict) với nhau, xung đột sẽ có dạng:
<<<<<<< HEAD
print("Hello!")
=======
print("Hello MIM Pyhton!")
>>>>>>> [branch name]
Git đủ tốt để đánh dấu khu vực có vấn đề trong tệp, bao quanh nó bằng <<<<<<< HEAD
và >>>>>>> [branch name]
. Nội dung xuất phát sau điểm đánh dấu đầu tiên bắt nguồn từ nhánh làm việc hiện tại. Cuối cùng, một dòng với các ký tự =======
phân tách hai thay đổi.
Xử lí conflict ta xóa phần không không đúng và giữ lại phần đúng và thực hiện commit như bình thường
Đối với VSCode ta có thể chọn Accept Current Change
, Accept Incomming Change
,…
Quy trình làm việc git đơn giản
- git status - Đảm bảo răng local của bạn đang sạch sẽ.
- git pull - Tải phiên bản code mới nhất từ remote.
- Chỉnh sửa các tệp của bạn.
- git status - Tìm kiếm tất cả các file đã được thay đổi.
- git add [file] - Thêm các tệp tin thay đổi vài stage changes.
- git committ -m “message” - Thực hiện commit của bạn.
- git push origin
- đẩy thay đổi của bạn lên remote.
Tài liệu tham khảo
Tài liệu chính
- PythonCrashCourse (trang 485-493)
- Bài viết về git/github trên trang web Real Python
Tài liệu bổ sung