1. Giới thiệu về Git
Tham khảo chi tiết tại bài viết sau: Sử Dụng Lệnh Git/Git Hub Cơ Bản Trong 5 Phút
2. Các thuật ngữ Git quan trọng
Git branch
– Git branch là một tính năng cực kỳ hữu ích trong Git, cho phép bạn tạo ra nhiều nhánh (branch) làm việc độc lập từ một dự án. Mỗi nhánh như một bản sao của dự án tại một thời điểm cụ thể, cho phép bạn thực hiện những thay đổi, thử nghiệm mới mà không ảnh hưởng đến các nhánh khác và phiên bản chính của dự án. Branch đã phân nhánh có thể chỉnh sửa tổng hợp lại thành 1 branch bằng việc hợp lại (merge) với branch khác.
– Branch trong GIT được chia làm 2 loại, là branch master (nhánh chính) và các branch khác do bạn tạo ra trong quá trình làm việc. Branch master: Là nhánh đầu tiên khi khởi tạo một GIT repository, branch master thường là nơi chứa source code đang chạy ổn định. Các loại branch:
- Branch remote: là branch lưu ở remote. Branch này có thể fetch về local nhưng không tạo thêm branch ở local. Hiểu đơn giản là bạn có thể tải branch ở remote về nhưng không tạo 1 branch ở local với tên tương tự và tất nhiên sẽ không liên kết nó với một branch local nào cả. Để hiển thị branch remote có trên local dùng lệnh git branch -r
- Branch local: là branch lưu ở local (tất nhiên rồi). Nó có thể được liên kết với 1 branch ở remote hoặc không. Hiển thị branch có trên local ta dùng lệnh git branch
– Tạo brand:
git branch <branchname>
– Xoá một branch ở phía local
Cách 1:* $ git branch --delete <branch_name>
hoặc $ git branch -d <branch_name>
Cách 2:* git branch --delete --force <branch_name>
hoặc $ git branch -D <branch_name>
– Xoá một branch remote lưu ở local
git branch --delete --remotes <remote_name>/<branch_name>
hoặcgit branch -d -r <remote_name>/<branch_name>
Lưu ý:
Cách 1 chỉ xóa được branch local khi nó đã được Merge vào branch hiện tại và nó đã được push lên remote nếu nó có liên kết với một branch remote.
Cách 2 sẽ xóa được mọi branch kể cả không thỏa mãn điều kiện kể trên. Chỉ xóa được branch khi đang ở branch khác.
– Xoá một branch ở phía remote
git push <remote_name> --delete <branch_name>
VD: $ git push origin --delete <branch_name>
Chú ý:
Phải checkout ra branch cùng tên với branch trên remote thì mới xóa được. Tức là khi ta đang ở branch develop thì ta không thể xóa branch master trên remote.
– Chuyển đổi giữa các branch
Để chuyển đổi branch làm việc thì sẽ thực hiện thao tác gọi là checkout.
$ git checkout <branch>
Khi thực hiện checkout, trước tiên nội dung của lần commit cuối cùng trong branch chuyển đến sẽ được mở ra trong worktree. Và commit đã tiến hành sau khi check out thì sẽ được thêm vào branch sau khi di chuyển đến.
– Merge branches
Merge branch sẽ được thực hiện bằng lệnh merge.
$ git merge <commit>
Git Rebase
– Git rebase là một lệnh mạnh mẽ trong Git cho phép bạn sắp xếp lại lịch sử commit của một nhánh. Thay vì tạo một commit hợp nhất mới như khi thực hiện git merge
, git rebase
sẽ di chuyển toàn bộ lịch sử commit của một nhánh lên sau một commit khác.
– Cách thức hoạt động của Git rebase
- Xác định điểm bắt đầu: Bạn chọn một commit làm điểm bắt đầu để gắn các commit của nhánh cần rebase vào.
- Tạo một bản vá: Git sẽ tạo một bản vá chứa tất cả các thay đổi từ commit đầu tiên của nhánh cần rebase đến commit cuối cùng.
- Áp dụng bản vá: Git sẽ áp dụng bản vá này lên commit đích mà bạn đã chọn.
- Xóa các commit cũ: Các commit cũ của nhánh cần rebase sẽ bị xóa.
– Ví dụ:
Giả sử bạn có hai nhánh: main
và feature
. Bạn muốn hợp nhất các thay đổi từ feature
vào main
nhưng muốn lịch sử commit trông gọn gàng hơn.
# Chuyển đến nhánh feature
git checkout feature
# Rebase nhánh feature lên nhánh main
git rebase main
Sau khi thực hiện lệnh git rebase
, tất cả các commit trong nhánh feature
sẽ được di chuyển lên sau commit cuối cùng của nhánh main
.
Lưu ý khi sử dụng Git rebase
- Không rebase các commit đã được push lên remote: Điều này có thể gây ra xung đột và làm cho lịch sử commit trở nên phức tạp.
- Luôn tạo một bản sao lưu trước khi rebase: Trong trường hợp xảy ra lỗi, bạn có thể khôi phục lại từ bản sao lưu.
- Cân nhắc kỹ trước khi rebase: Việc rebase sẽ thay đổi lịch sử commit, vì vậy hãy chắc chắn rằng bạn hiểu rõ về tác động của nó.
Phân biệt rebase và merge
– Git rebase và Git merge đều là các lệnh dùng để kết hợp các thay đổi từ một nhánh vào nhánh khác. Tuy nhiên, chúng hoạt động theo những cách khác nhau và mang lại những kết quả khác nhau về lịch sử commit.
Git merge: Hợp nhất các nhánh
- Cách thức hoạt động:
- Tạo một commit mới để đánh dấu việc hợp nhất các thay đổi từ hai nhánh.
- Giữ lại lịch sử commit của cả hai nhánh.
- Ưu điểm:
- Dễ hiểu và trực quan.
- An toàn hơn vì không làm thay đổi lịch sử commit.
- Nhược điểm:
- Có thể tạo ra nhiều commit merge, làm cho lịch sử commit trở nên phức tạp hơn.
Git rebase: Viết lại lịch sử commit
- Cách thức hoạt động:
- Di chuyển toàn bộ lịch sử commit của một nhánh lên sau một commit khác.
- Tạo ra một lịch sử commit tuyến tính và gọn gàng hơn.
- Ưu điểm:
- Tạo ra lịch sử commit rõ ràng và dễ theo dõi.
- Có thể sử dụng để sắp xếp lại các commit, sửa đổi thông điệp commit.
- Nhược điểm:
- Có thể gây ra xung đột nếu không cẩn thận.
- Không nên sử dụng để rebase các commit đã được push lên remote.
Bảng so sánh
Tính năng | Git merge | Git rebase |
---|---|---|
Mục đích | Hợp nhất các nhánh | Viết lại lịch sử commit |
Lịch sử commit | Giữ lại lịch sử đầy đủ | Tạo lịch sử commit tuyến tính |
Độ phức tạp | Dễ hiểu | Phức tạp hơn |
Rủi ro | Ít rủi ro hơn | Có thể gây ra xung đột |
Khi sử dụng | Hợp nhất các nhánh thường xuyên | Làm sạch lịch sử commit trước khi tạo pull request |
Nên chọn lệnh nào?
- Chọn Git merge khi:
- Bạn muốn giữ lại lịch sử commit đầy đủ.
- Bạn muốn giữ lại lịch sử commit đầy đủ.
- Bạn muốn hợp nhất nhiều nhánh cùng một lúc.
- Bạn không cần phải có một lịch sử commit quá gọn gàng.
- Chọn Git rebase khi:
- Bạn muốn có một lịch sử commit tuyến tính và dễ đọc.
- Bạn muốn sửa đổi thông điệp commit hoặc sắp xếp lại các commit.
- Bạn muốn hợp nhất các thay đổi từ một nhánh vào nhánh chính trước khi tạo pull request.
Lưu ý quan trọng:
- Không rebase các commit đã được push lên remote: Điều này có thể gây ra xung đột và làm cho lịch sử commit trở nên phức tạp.
- Luôn tạo một bản sao lưu trước khi rebase: Trong trường hợp xảy ra lỗi, bạn có thể khôi phục lại từ bản sao lưu.
Tài liệu tham khảo:
https://www.freecodecamp.org/news/learn-the-basics-of-git-in-under-10-minutes-da548267cc91