Chuyển đến nội dung chính

Git liệt kê nhánh: Hướng dẫn thực hành

Tìm hiểu cách liệt kê các nhánh Git cục bộ và từ xa, và lọc chúng bằng git branch. Thành thạo khắc phục sự cố với git fetch, git checkout và git prune.
· 9 phút đọc

Khám phá cùng AI

Nếu bạn từng làm việc trên nhiều tính năng cùng lúc, tình huống này có thể quen thuộc: bạn chạy một lệnh Git, và giờ bạn không còn chắc phần việc của tuần trước đang ở đâu nữa.

Vấn đề này xuất hiện thường xuyên hơn khi dự án lớn dần. Lúc đầu, một kho chỉ có nhánh main. Theo thời gian, các nhóm tạo nhánh cho tính năng mới, sửa lỗi, thử nghiệm, phát hành và hotfix khẩn cấp. 

Đây là lúc việc liệt kê nhánh trong Git trở nên thiết yếu. Nó giúp trả lời các câu hỏi thực tế:

  • Tôi hiện đang làm việc trên nhánh nào?
  • Các nhánh nào khác tồn tại trên máy của tôi?
  • Những nhánh nào tồn tại trên kho từ xa?

Trong hướng dẫn này, chúng ta sẽ xem những điều cơ bản về liệt kê nhánh trong Git, cách thực hiện và cách khắc phục các sự cố thường gặp.

Nếu Git hoàn toàn mới với bạn, tôi khuyên bạn nên học khóa Giới thiệu về Git để tự tin hơn trước khi đi sâu vào các chủ đề quản lý nhánh chi tiết.

Tìm hiểu về các nhánh Git

Trước khi bắt đầu liệt kê, hãy phân tích nhánh Git là gì. 

Một ngộ nhận phổ biến là nhánh Git là các thư mục riêng hoặc bản sao đầy đủ của mã nguồn, nhưng thực tế, nhánh Git chỉ là một con trỏ nhẹ tới một commit cụ thể.

Bạn có thể hình dung đó là một dòng thời gian song song, nơi bạn xây dựng tính năng hoặc thử nghiệm tách biệt mà không ảnh hưởng đến mã chính ổn định. Kiến trúc này giúp việc tạo và gộp nhánh cực kỳ nhanh và hiệu quả.

git branch

Nguồn: Git

Git theo dõi vị trí hiện tại của bạn trong các dòng thời gian này bằng một tham chiếu đặc biệt gọi là HEAD, luôn trỏ tới nhánh bạn đang làm việc.Vì các nhánh chỉ là con trỏ, nên việc chuyển ngữ cảnh là tức thời và không cần di chuyển các tệp lớn.

Để biết thêm chi tiết, hãy xem hướng dẫn của chúng tôi về các nhánh Git hoặc tham khảo cheat sheet Git.

Cách liệt kê các nhánh cục bộ trong Git

Với nền tảng khái niệm đã có, hãy xem cách liệt kê nhánh cục bộ trong kho của bạn.

Một nhánh cục bộ là nhánh tồn tại trên máy của bạn. Nó nằm trong thư mục .git của kho và đại diện cho một con trỏ di động tới một chuỗi commit. Bạn có thể chuyển sang một nhánh cục bộ, thay đổi và tạo commit mới trên đó.

Hãy hình dung về nhánh cục bộ như sau:

  • Chúng thuộc về bản sao kho của bạn
  • Chúng tiến về phía trước khi bạn commit thay đổi mới
  • Chúng không tự động cập nhật khi người khác đẩy mã lên

Sử dụng git branch

Lệnh phổ biến và cơ bản nhất để liệt kê nhánh cục bộ khá đơn giản:

git branch

Khi chạy lệnh này mà không có tùy chọn bổ sung, Git sẽ hiển thị tất cả các nhánh cục bộ.

Những điều quan trọng cần nhớ về git branch:

  • Nó chỉ hiển thị nhánh cục bộ, không phải nhánh từ xa
  • Nó không kết nối internet
  • Nó không thay đổi tệp, commit hoặc lịch sử nhánh

Vì an toàn và nhanh, nhiều nhà phát triển chạy git branch như một thói quen trước khi bắt đầu công việc mới hoặc chuyển ngữ cảnh.

Hiểu đầu ra

Đây là ví dụ về những gì git branch có thể hiển thị:

 bugfix/login-timeout
  feature/payment-refactor
* main

Mặc dù đầu ra trông đơn giản, nhưng có vài chi tiết quan trọng ẩn trong đó.

Thứ nhất, dấu hoa thị (*) chỉ nhánh hiện đang được checkout. Đây là nhánh mà thư mục làm việc của bạn đang gắn với lúc này. Bất kỳ commit mới nào bạn tạo sẽ vào nhánh này.

Thứ hai, Git thường làm nổi bật nhánh hiện tại bằng màu xanh lá. Đây chỉ là hỗ trợ trực quan từ terminal và không thay đổi hành vi của Git.

Thứ ba, hãy để ý những gì không được hiển thị:

  • Không có ngày commit
  • Không có tên tác giả
  • Không có thông tin từ xa

Điều này là có chủ ý. Git giữ đầu ra mặc định ngắn gọn, giúp dễ đọc lướt và kết hợp với các lệnh khác.

Mẹo cho người mới bắt đầu: Nếu terminal của bạn có vẻ "bị kẹt" sau khi chạy lệnh Git, hãy thử nhấn q. Git thường dùng pager để hiển thị đầu ra dài, và đây là cách thoát bình thường.

Chỉ lấy nhánh hiện tại

Đôi khi, liệt kê tất cả nhánh là không cần thiết. Bạn chỉ muốn biết mình đang ở nhánh nào. Git cung cấp lệnh riêng cho việc này:

git branch --show-current

Đầu ra chỉ là tên nhánh:

main

Các tình huống thường dùng gồm:

  • Kiểm tra nhánh trước khi đẩy mã
  • Ghi log tên nhánh trong script
  • Sử dụng tên nhánh trong tự động hóa hoặc pipeline CI

Nếu Git đang ở trạng thái HEAD tách rời, lệnh này không trả về gì. Dù ban đầu có vẻ lạ, điều này thực ra hữu ích khi viết script cần phát hiện xem có nhánh nào đang được checkout hay không.

Lỗi thường gặp: Một số người dùng nghĩ Git bị "lỗi" khi không hiện tên nhánh. Thường thì điều đó chỉ có nghĩa là bạn không ở trên nhánh nào mà đang ở một commit cụ thể.

Cách liệt kê nhánh từ xa và tất cả nhánh trong Git

Liệt kê nhánh từ xa hay thậm chí tất cả nhánh trong Git hoạt động tương tự như liệt kê nhánh cục bộ.

Liệt kê nhánh từ xa trong Git

Các kho từ xa, như trên GitHub hoặc GitLab, có những nhánh riêng. Để xem chúng, thêm cờ -r:

git branch -r
  origin/HEAD -> origin/main
  origin/bugfix/login-timeout
  origin/feature/payment-refactor
  origin/main

Đầu ra ví dụ này có thể gây bối rối lúc đầu, nên hãy phân tích.

Những gì bạn thấy là các nhánh theo dõi từ xa. Đây là các tham chiếu cục bộ mà Git dùng để ghi nhớ trạng thái mới nhất của kho từ xa.

Các điểm mấu chốt:

  • Các nhánh này được lưu cục bộ
  • Chúng chỉ cập nhật khi bạn fetch
  • Chúng không tự động di chuyển

Mẹo cho người mới bắt đầu: Hãy nghĩ các nhánh theo dõi từ xa như sổ tay của Git. Git ghi lại kho từ xa trông như thế nào lần cuối bạn kiểm tra, nhưng sẽ không cập nhật sổ đó trừ khi bạn fetch rõ ràng.

Liệt kê tất cả nhánh trong Git

Để xem cả nhánh cục bộ và nhánh theo dõi từ xa cùng lúc, dùng cờ -a:

git branch -a
* main
  feature/payment-refactor
  remotes/origin/bugfix/login-timeout
  remotes/origin/main

Chế độ xem kết hợp này giúp bạn hiểu nhánh cục bộ liên quan thế nào đến nhánh từ xa.

Mẫu đặt tên cần chú ý:

  • Nhánh cục bộ hiển thị dưới dạng tên đơn giản như main

  • Nhánh theo dõi từ xa xuất hiện dưới remotes/origin/

Chế độ xem này đặc biệt hữu ích khi quyết định có tạo nhánh cục bộ mới để theo dõi một nhánh từ xa sẵn có hay không. Nếu bạn cần clone một kho và làm việc trên nhánh cụ thể, hãy xem hướng dẫn của chúng tôi về cách clone một nhánh cụ thể trong Git.

Luôn fetch trước

Nếu đồng đội đẩy một nhánh mới mà bạn không thấy, lý do phổ biến nhất là bộ nhớ đệm cục bộ đã lỗi thời. 

Giải pháp là fetch:

git fetch

Những gì git fetch làm:

  • Tải về thông tin nhánh mới nhất từ kho từ xa
  • Cập nhật các nhánh theo dõi từ xa
  • Giữ nguyên các tệp làm việc của bạn

Lệnh này an toàn để chạy bất cứ lúc nào. Nó không gộp mã hay ghi đè công việc của bạn. Nhiều nhóm coi git fetch là bước thường lệ trước khi kiểm tra nhánh.

Lỗi thường gặp: Người mới thường nhầm git fetch với git pull. Fetch chỉ cập nhật thông tin nhánh, còn pull cũng gộp thay đổi vào nhánh hiện tại của bạn.

Cách xem chi tiết hơn về danh sách nhánh Git

Đôi khi, tên nhánh là chưa đủ. Nếu bạn muốn xem thêm chi tiết, có vài cờ hữu ích có thể giúp bạn.

Xem các commit gần nhất

Để xem mỗi nhánh thực sự chứa gì, dùng:

git branch -v

Đầu ra có thể như sau:

* main   a1b2c3d Fix typo in README
  feature/payment-refactor e4f5g6h Refactor payment service

Như bạn thấy, cờ -v thêm ngữ cảnh quan trọng:

  • Hash commit rút gọn cho thấy nhánh hiện trỏ tới đâu
  • Thông điệp commit gợi ý mục đích của nhánh

Đây là một trong những cách dễ nhất để hiểu một nhánh dùng để làm gì mà không cần checkout nó.

Mẹo cho người mới bắt đầu: Nếu bạn không chắc một nhánh có an toàn để xóa hay không, kiểm tra thông điệp commit cuối là gợi ý đầu tiên tốt. Để có hướng dẫn đầy đủ về xóa nhánh, xem bài hướng dẫn cách xóa nhánh Git.

Kiểm tra kết nối upstream

Các nhánh cục bộ thường theo dõi một nhánh từ xa tương ứng. Để xem mối quan hệ này, chạy:

git branch -vv
* main   a1b2c3d [origin/main] Fix typo in README
  feature/payment-refactor e4f5g6h [origin/feature/payment-refactor] Refactor payment service

Đầu ra này cho bạn biết:

  • Nhánh từ xa nào được liên kết với nhánh cục bộ của bạn

  • git pull sẽ kéo về từ đâu

  • git push sẽ đẩy lên đâu

Nếu một nhánh không có upstream, nó sẽ không hiển thị gì trong ngoặc vuông. Điều này thường giải thích các lỗi push hoặc pull.

Lỗi thường gặp: Cố chạy git pull trên nhánh không có upstream thường sẽ thất bại. Khi đó, bạn cần thiết lập upstream trước hoặc đẩy nhánh lần đầu.

Sắp xếp nhánh theo ngày hoặc phiên bản

Để tìm các nhánh hoạt động gần đây, bạn có thể sắp xếp theo ngày commit:

git branch --sort=-committerdate

Điều này đặt các nhánh được cập nhật gần đây lên trên và các nhánh cũ hơn xuống dưới.

Với những kho có nhánh theo phiên bản, sắp xếp theo ngữ nghĩa hữu ích hơn:

git branch --sort=v:refname

Cách này tôn trọng số phiên bản và tránh trật tự chữ cái gây nhầm lẫn.

Cách lọc danh sách nhánh trong Git

Nếu bạn đang tìm một nhánh cụ thể, lọc sẽ rất hữu ích. Tôi sẽ chỉ bạn cách làm với vài cờ quan trọng.

Tìm theo mẫu tên

Đặc biệt trong các kho lớn, lọc theo tên có thể tiết kiệm nhiều thời gian để tìm đúng nhánh. Bạn có thể lọc theo tên bằng cờ --list kèm từ khóa tìm kiếm:

git branch --list 'feature/*'

Lưu ý cách dùng * như ký tự đại diện: Kết quả chỉ hiển thị các nhánh khớp mẫu, tức là bắt đầu với feature. Các nhóm thường dùng tiền tố như feature/, bugfix/ hoặc hotfix/ để tổ chức. Hãy coi chúng như thư mục cho nhánh của bạn.

Tìm nhánh đã gộp và chưa gộp

Hai bộ lọc rất quan trọng là:

git branch --merged
git branch --no-merged

Các lệnh này so sánh các nhánh khác với nhánh hiện tại của bạn.

  • --merged hiển thị các nhánh có thay đổi đã được bao gồm (tìm hiểu thêm về Git merge)

  • --no-merged hiển thị các nhánh vẫn còn commit riêng

Nhắc nhở an toàn: Luôn kiểm tra kỹ bạn đang ở nhánh gốc đúng (thường là main hoặc develop) trước khi dùng --merged. Kết quả phụ thuộc vào nhánh hiện tại.

Tìm nhánh chứa một commit

Nếu bạn biết hash commit và muốn tìm nó tồn tại ở đâu, dùng lệnh này:

git branch --contains <commit-hash>

Điều này hữu ích khi truy vết lỗi hoặc xác minh rằng một bản sửa đã được gộp.

Ví dụ, khi đồng nghiệp nói: "Tôi tìm thấy bug ở commit hash này; những nhánh nào bị ảnh hưởng?" Bạn có thể dùng lệnh này để xác định chính xác vị trí của lỗi.

Kết hợp bộ lọc cho quy trình nâng cao

Các bộ lọc tôi đã chỉ có thể kết hợp để thu hẹp kết quả hơn nữa. Hãy xem một ví dụ:

git branch --list 'feature/*' --no-merged

Kết quả của lệnh này nhanh chóng hiển thị tất cả nhánh feature/ chưa gộp và giúp nhóm giữ mọi thứ ngăn nắp.

Khắc phục sự cố thường gặp

Nếu gặp vấn đề, đừng lo; các sự cố phổ biến nhất khá dễ sửa.

Thiếu nhánh từ xa

Nếu bạn không thấy nhánh mà người khác đã đẩy, lý do có thể là bạn quên fetch. Cách khắc phục:

  1. Chạy git fetch

  2. Rồi liệt kê nhánh lại

Nếu fetch bị bỏ lỡ là vấn đề, cách sửa nhanh này sẽ cập nhật ngay chế độ xem cục bộ của bạn.

Trạng thái HEAD tách rời

Đôi khi, đầu ra git branch trông như sau:

* (HEAD detached at a1b2c3d)

Điều này có nghĩa là bạn không ở trên một nhánh. Bạn đang xem trực tiếp một commit cụ thể.

Ở trạng thái HEAD tách rời tự nó không nguy hiểm, nhưng bất kỳ commit mới nào bạn tạo có thể khó tìm sau này trừ khi bạn tạo nhánh.

Để trở lại làm việc bình thường, hãy chuyển sang một nhánh có sẵn:

git checkout <branch-name>

Giải pháp hiện đại: Từ Git 2.23+, bạn có thể dùng git switch <branch-name> — một lệnh gọn gàng và an toàn hơn được thiết kế riêng để chuyển nhánh.

Bạn cũng có thể tạo một nhánh mới từ vị trí hiện tại bằng cờ -b:

git checkout -b <new-branch-name>

Nhánh vẫn xuất hiện sau khi xóa

Nếu các nhánh từ xa vẫn xuất hiện sau khi đã bị xóa trên máy chủ, bạn có thể dọn tham chiếu cục bộ của chúng bằng lệnh sau:

git remote prune origin

Lệnh này dọn các tham chiếu đã cũ và giữ cho kho của bạn gọn gàng.

Mẹo chuyên nghiệp: Ngoài ra, bạn có thể dùng git fetch --prune mỗi lần fetch, để kho được cập nhật và dọn dẹp trong một bước.

Kết luận

Liệt kê nhánh trong Git là kỹ năng then chốt giúp bạn hiểu kho của mình. Các lệnh và cờ trong hướng dẫn này sẽ giúp bạn tránh lỗi và làm việc tự tin với người khác. 

Khi bắt đầu dự án mới, thường đáng để suy nghĩ về cấu trúc nhánh bạn sẽ cần. Để tham khảo, hãy xem hướng dẫn về chiến lược phân nhánh Git.

Sẵn sàng vượt qua kiến thức cơ bản? Lộ trình kỹ năng Git Fundamentals cung cấp khái niệm và trải nghiệm thực hành để bạn tiến từ người mới thành chuyên nghiệp.

Git List Branches FAQs

Sự khác nhau giữa nhánh cục bộ và nhánh từ xa là gì?

Nhánh cục bộ tồn tại trên máy của bạn. Nhánh từ xa phản ánh trạng thái các nhánh trên kho từ xa.

Làm sao biết nhánh nào đã được gộp?

Chạy git branch --merged để xem các nhánh có thay đổi đã được bao gồm trong nhánh hiện tại.

Xóa một nhánh sau khi liệt kê có an toàn không?

Có, nếu đã được gộp. Dùng git branch -d branch-name. Git sẽ chặn xóa nếu chưa gộp an toàn. Git coi một nhánh là "an toàn" nếu nó đã được gộp vào nhánh hiện tại của bạn hoặc đã được đẩy lên kho từ xa.

Vì sao tôi không thấy một nhánh tồn tại trên kho từ xa?

Rất có thể, thư mục cục bộ của bạn chưa fetch nhánh đó. Chạy git fetch, rồi dùng git branch -r để xem các nhánh từ xa.

git branch hiển thị gì?

Nó chỉ liệt kê các nhánh cục bộ. Nhánh hiện tại được đánh dấu bằng *. Nó chỉ hiển thị nhánh từ xa khi bạn thêm cờ -r.

Làm sao liệt kê nhánh được sắp xếp theo hoạt động gần nhất?

Hãy dùng git branch --sort=-committerdate để hiển thị các nhánh có commit gần nhất ở trên cùng. Điều này hữu ích khi bạn muốn tìm các nhánh bạn hoặc nhóm của bạn vừa làm gần đây. Bạn cũng có thể kết hợp với các cờ khác như git branch -v --sort=-committerdate để xem thông điệp commit kèm theo danh sách đã sắp xếp.

Austin Chia

Tác giả

Austin Chia

Tôi là Austin, một blogger và cây bút công nghệ với nhiều năm kinh nghiệm làm nhà khoa học dữ liệu và nhà phân tích dữ liệu trong lĩnh vực chăm sóc sức khỏe. Khởi đầu hành trình công nghệ với nền tảng sinh học, tôi hiện hỗ trợ những người khác thực hiện chuyển đổi tương tự thông qua blog công nghệ của mình. Niềm đam mê công nghệ đã đưa tôi đến với việc cộng tác viết cho hàng chục công ty SaaS, truyền cảm hứng cho người khác và chia sẻ trải nghiệm của bản thân.

Chủ đề

Liên quan