Làm chủ Git Branching: Tạo, chuyển, xóa và gộp nhánh với git branch, checkout và switch
Hướng dẫn Git Branching từ cơ bản đến thực hành: dùng git branch, git switch, git checkout để tạo và chuyển nhánh, xóa local/remote branch, merge và xử lý conflict.
ShanverseUpdated 10 min read— viewsLoading views
Git
Developer Tools
Git Branching là nền tảng của hầu hết quy trình phát triển hiện đại. Thay vì sửa trực tiếp trên main, bạn tạo một branch ngắn hạn, hoàn thành một thay đổi rõ ràng, review rồi merge trở lại.
Bài này tập trung vào các thao tác thường dùng nhất: xem, tạo, chuyển, đổi tên, xóa, push và gộp nhánh bằng git branch, git switch, git checkout và git merge.
Branch thực sự là gì?
Một branch không phải bản sao đầy đủ của thư mục dự án. Nó là một con trỏ có tên trỏ tới một commit.
Mermaid
Loading diagram…
Comments
Khi tạo
feature/login
từ
main
, cả hai ban đầu trỏ cùng commit:
Mermaid
Loading diagram…
Sau khi commit trên feature branch, con trỏ feature di chuyển còn main giữ nguyên:
Mermaid
Loading diagram…
HEAD và branch hiện tại
HEAD đại diện cho vị trí hiện tại của bạn. Trong trường hợp thông thường, HEAD trỏ tới branch hiện tại, còn branch trỏ tới commit mới nhất của nó.
Xem branch hiện tại:
Hoặc:
Dấu * trong git branch cũng cho biết branch đang checkout:
git branch, git switch và git checkout khác nhau thế nào?
git switch được thiết kế để thao tác branch rõ ràng hơn. git checkout vẫn hợp lệ và xuất hiện trong nhiều dự án cũ, nhưng vì nó có nhiều chức năng nên dễ gây nhầm lẫn hơn.
1. Xem danh sách branch
Xem branch local:
Xem branch remote:
Xem cả local và remote:
Xem commit gần nhất của từng branch:
Xem quan hệ tracking và trạng thái ahead/behind:
2. Tạo branch mới
Tạo branch nhưng chưa chuyển sang đó:
Sau lệnh này, bạn vẫn ở branch cũ. Kiểm tra:
Tạo và chuyển bằng git switch
-c là viết tắt của --create.
Cách tương đương bằng git checkout
Tạo branch từ một điểm cụ thể
Từ một branch khác:
Từ một commit:
Từ remote branch:
Trong nhiều trường hợp, Git có thể tự suy luận:
3. Chuyển branch
Với lệnh mới:
Với cú pháp cũ:
Quay về branch trước đó:
Cú pháp tương đương:
Vì sao Git không cho chuyển branch?
Bạn có thể gặp thông báo:
Git đang bảo vệ thay đổi chưa commit. Bạn có các lựa chọn:
Commit thay đổi nếu đã hoàn chỉnh.
Stage và commit tạm có chủ đích.
Stash thay đổi để chuyển branch tạm thời.
Loại bỏ thay đổi nếu chắc chắn không cần.
Commit:
Stash:
Khôi phục sau đó:
4. Đặt tên branch dễ hiểu
Tên branch nên mô tả loại và mục tiêu của thay đổi:
Nguyên tắc hữu ích:
Dùng chữ thường và dấu gạch ngang.
Tránh tên chung chung như test, new, update.
Giữ branch tập trung vào một mục tiêu.
Không dùng branch cá nhân tồn tại quá lâu cho nhiều thay đổi không liên quan.
5. Đổi tên branch
Đổi tên branch hiện tại:
Đổi tên một branch khác:
Nếu branch cũ đã push lên remote:
Người khác cần fetch và cập nhật tracking nếu đang dùng tên cũ.
6. Push branch lên GitHub
Push branch mới lần đầu và thiết lập upstream:
Sau đó, khi đang ở branch này:
Xem upstream:
Lỗi: branch chưa có upstream
Thông báo thường gợi ý đúng lệnh:
-u là dạng ngắn của --set-upstream.
Lỗi push nhầm branch
Kiểm tra trước khi push:
Có thể push rõ branch nguồn và đích:
7. Merge branch
Giả sử bạn muốn merge feature/login vào main.
Chuyển tới branch nhận thay đổi:
Cập nhật branch chính:
Merge feature branch:
Fast-forward merge
Nếu main chưa có commit mới kể từ lúc tạo feature branch, Git chỉ di chuyển con trỏ main về phía trước.
Mermaid
Loading diagram…
Three-way merge
Nếu cả hai branch đều có commit mới, Git tìm commit tổ tiên chung và tạo merge commit.
Bạn có thể yêu cầu tạo merge commit ngay cả khi có thể fast-forward:
Việc chọn fast-forward, merge commit hay squash phụ thuộc quy ước lịch sử của team.
Squash merge trên local
Cách này đưa toàn bộ thay đổi vào staging area rồi tạo một commit mới, nhưng không ghi quan hệ merge commit như merge thông thường.
8. Xử lý merge conflict
Conflict xảy ra khi Git không thể tự kết hợp các thay đổi.
Sau khi merge báo conflict:
Mở file có marker:
Quy trình xử lý:
Đọc cả hai phía.
Chọn hoặc kết hợp nội dung đúng.
Xóa marker.
Chạy test và formatter.
Stage file đã giải quyết.
Hoàn tất merge.
Với phiên bản Git hỗ trợ, bạn cũng có thể dùng:
Hủy merge và quay về trạng thái trước merge:
Không nên abort sau khi đã thực hiện nhiều thay đổi không liên quan mà chưa hiểu chúng sẽ được xử lý thế nào.
9. Xóa branch local
Sau khi branch đã merge:
-d là chế độ an toàn: Git từ chối xóa nếu branch có commit chưa được merge vào branch hiện tại hoặc upstream phù hợp.
Ép xóa:
Không thể xóa branch đang đứng. Hãy chuyển branch trước:
Xem branch đã merge vào branch hiện tại:
Xem branch chưa merge:
10. Xóa branch remote
Xóa trên GitHub:
Sau khi branch remote bị xóa, danh sách local có thể vẫn chứa remote-tracking reference cũ. Dọn chúng:
Hoặc:
Xóa remote branch không tự động xóa local branch của từng thành viên.
Remote branch và tracking branch
feature/login là local branch.
origin/feature/login là remote-tracking reference phản ánh trạng thái remote lần fetch gần nhất.
Upstream liên kết local branch với remote branch để git pull và git push biết đích mặc định.
Cập nhật thông tin remote mà chưa merge:
Tạo local branch theo remote:
Nếu local branch đã tồn tại nhưng chưa có upstream:
Detached HEAD là gì?
Nếu checkout trực tiếp một commit:
hoặc:
HEAD không còn trỏ tới branch. Bạn có thể xem hoặc thử nghiệm, nhưng commit mới không thuộc branch có tên.
Nếu muốn giữ công việc:
Quy trình branch khuyến nghị
Trong team, ưu tiên merge qua Pull Request để có review, CI và lịch sử thảo luận thay vì merge trực tiếp vào main trên máy.
Các lỗi thường gặp
fatal: a branch named ... already exists
Branch đã tồn tại:
Hoặc chọn tên mới.
error: pathspec ... did not match any file(s) known to git
Tên branch sai hoặc chưa fetch remote:
Sau đó tạo tracking branch nếu cần.
error: Cannot delete branch ... checked out
Chuyển sang branch khác trước:
not fully merged
Git phát hiện branch còn commit chưa merge. Kiểm tra:
Merge, tạo backup tag/branch hoặc chỉ dùng -D khi chắc chắn không cần các commit đó.
Merge nhầm branch
Nếu merge chưa commit và đang có conflict:
Nếu merge commit đã tạo nhưng chưa push, hãy kiểm tra lịch sử trước khi quyết định revert hoặc reset. Trong branch đã chia sẻ, thường ưu tiên git revert -m phù hợp thay vì rewrite history.
Cheat sheet
Tổng kết
Để làm chủ Git Branching, hãy nhớ mô hình:
Dùng git branch để quản lý tên và danh sách branch.
Ưu tiên git switch cho thao tác chuyển hoặc tạo branch rõ ràng.
Hiểu git checkout vì nó vẫn phổ biến trong tài liệu và dự án cũ.
Luôn đứng ở branch nhận thay đổi trước khi git merge.
Dùng git branch -d trước -D.
Phân biệt local branch, remote-tracking reference và upstream.
Table of contents(33)
Codeplain text
1 feature/login2* main
Codeplain text
1Your local changes would be overwritten by checkout
1# 1. Cập nhật main2gitswitchmain3gitpull45# 2. Tạo branch ngắn hạn6gitswitch-cfeature/user-profile78# 3. Làm việc và kiểm tra9gitstatus10gitdiff1112# 4. Commit thay đổi13gitaddsrc/profile.jssrc/profile.test.js14gitdiff--staged15gitcommit-m"feat: add user profile"1617# 5. Push branch18gitpush-uoriginfeature/user-profile1920# 6. Mở Pull Request và review2122# 7. Sau khi merge, cập nhật main23gitswitchmain24gitpull2526# 8. Xóa branch local27gitbranch-dfeature/user-profile2829# 9. Dọn remote references30gitfetch--prune
Codebash
1gitbranch--list2gitswitch<branch-name>
Codebash
1gitbranch--all2gitfetchorigin
Codebash
1gitswitchmain2gitbranch-d<branch-name>
Codebash
1gitlog--onelinemain..<branch-name>
Codebash
1gitmerge--abort
Related posts
More articles with related topics and technologies.
Hướng dẫn Git Aliases và .gitconfig thực chiến: alias an toàn, log đẹp, cấu hình pull/push/rebase, includeIf cho tài khoản work/personal, bảo mật và chia sẻ dotfiles.
Phân tích Gitflow vs GitHub Flow vs Trunk-Based Development: cấu trúc branch, ưu nhược điểm, điều kiện áp dụng, ma trận quyết định và lộ trình chuyển đổi cho từng loại dự án.
Hướng dẫn git worktree từ cơ bản đến thực tế: tạo nhiều working tree, làm feature và hotfix song song, review PR, quản lý list/remove/prune/lock/repair và tránh lỗi phổ biến.