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

Git Checkout Remote Branch: Hướng dẫn từng bước

Để git checkout một nhánh từ xa, trước tiên bạn cần fetch các thay đổi mới nhất từ kho mã từ xa, sau đó có thể checkout nhánh đó về máy cục bộ bằng tên đầy đủ của nó (ví dụ: origin/branch-name).
· 4 phút đọc

Khám phá cùng AI

Khi cần làm việc trên một nhánh trong kho mã từ xa, như nhánh công việc của đồng nghiệp hoặc nhánh tính năng mới, chúng ta gặp bài toán truy cập và cập nhật nhánh đó trên máy cục bộ.

May mắn là Git đơn giản hóa quy trình này bằng cách cung cấp các lệnh rõ ràng để tạo một bản sao cục bộ của nhánh từ xa. Nhờ đó chúng ta có thể chuyển sang nhánh mong muốn, đóng góp và cộng tác hiệu quả với nhóm.

Câu trả lời nhanh: để checkout một nhánh tên <branch_name>, chạy:

git fetch origin <branch_name>
git checkout -b <branch_name> origin/<branch_name>

Trong bài viết này, chúng ta sẽ tìm hiểu các lệnh trên và cách chúng hoạt động chi tiết hơn.

Quy trình hai bước: git fetch và git checkout

Để bắt đầu làm việc trên một nhánh từ xa ở máy cục bộ, trước hết chúng ta cần đảm bảo kho mã cục bộ đồng bộ với kho mã từ xa. Sau đó, ta có thể tạo bản sao cục bộ và bắt đầu làm việc trên nhánh đó.

Cập nhật kho mã cục bộ

Để cập nhật kho mã cục bộ, chúng ta dùng lệnh git fetch. Ở dạng đơn giản nhất, lệnh này không cần tham số:

git fetch

Khi dùng không tham số, lệnh git fetch sẽ lấy tất cả các nhánh từ kho mã từ xa mặc định. Điều này bao gồm cả nhánh ta muốn, nhưng cũng sẽ chiếm nhiều dung lượng đĩa cục bộ hơn.

Nếu lo ngại dung lượng đĩa, ta có thể chỉ định nhánh muốn fetch bằng cách truyền tên nhánh làm tham số cho lệnh:

git fetch origin <branch_name>

Thay <branch_name> bằng tên nhánh mong muốn. Tham số origin chỉ tên kho mã từ xa. Theo mặc định, khi chúng ta clone một kho, remote sẽ có tên là origin.

Lưu ý rằng việc cập nhật tham chiếu remote bằng fetch sẽ không ảnh hưởng tới bất kỳ tệp cục bộ nào hay gây xung đột. Ở máy cục bộ có hai thực thể riêng biệt:

  • Thư mục làm việc hiện tại
  • Kho mã cục bộ

Những thay đổi và commit hiện tại của chúng ta nằm trong thư mục làm việc hiện tại. Đây là các tệp chúng ta thấy khi mở thư mục kho trên máy. Chúng không được cập nhật bởi git fetch. Chỉ kho mã cục bộ được cập nhật, có thể coi như một bản sao ẩn của kho mã từ xa trên máy của chúng ta.

Checkout một nhánh từ xa

Khi đã có bản cập nhật mới nhất của kho mã từ xa, chúng ta có thể tạo bản sao cục bộ của một nhánh từ xa bằng lệnh git checkout:

git checkout -b <branch_name> origin/<branch_name>

Thay <branch_name> bằng tên nhánh từ xa mong muốn. Tham số đầu sau -b là tên muốn đặt cho nhánh cục bộ. Theo thông lệ, ta dùng cùng tên cho cả hai, nhưng có thể dùng tên khác miễn là chưa có nhánh cục bộ nào trùng tên đó:

git checkout -b <local_branch_name> origin/<branch_name>

Sau khi chạy lệnh này thành công, Git sẽ chuyển thư mục làm việc hiện tại sang nhánh đó, và chúng ta sẵn sàng bắt đầu làm việc.

git checkout so với git switch

Lệnh git checkout đã tồn tại từ khi Git ra đời. Phạm vi của nó vượt xa việc tạo bản sao cục bộ của nhánh hay chuyển đổi giữa các nhánh. Chẳng hạn, nó có thể lấy các tệp cụ thể từ kho mã từ xa.

Trong các phiên bản Git gần đây, lệnh git switch được tạo ra với mục đích duy nhất là tạo bản sao cục bộ của các nhánh từ xa và chuyển đổi giữa các nhánh cục bộ.

Tôi khuyến nghị dùng git switch thay cho git checkout vì khả năng mở rộng của git checkout đôi khi có thể dẫn đến lỗi.

Để học cách thực hiện các thao tác tương tự như trong bài này bằng git switch, bạn có thể đọc hướng dẫn sau: Git Switch Branch: Hướng dẫn với ví dụ thực tiễn.

Kết luận

Tạo một bản sao cục bộ của nhánh Git từ xa là rất quan trọng để cộng tác. Bằng cách dùng git fetch và git checkout, chúng ta có thể cập nhật kho mã cục bộ với các thay đổi từ xa và chuyển sang nhánh mong muốn.

Mặc dù git checkout cổ điển cung cấp chức năng mạnh mẽ, lệnh git switch mới hơn mang đến một lựa chọn gọn nhẹ chuyên cho quản lý nhánh, giảm rủi ro lỗi.

Câu hỏi thường gặp

Tôi gặp lỗi: "please commit your changes or stash them before you switch branches." Sửa thế nào?

Git ngăn chúng ta chuyển sang nhánh khác nếu nhánh hiện tại có thay đổi chưa commit. Để xử lý, hoặc là stash các thay đổi hiện có, hoặc commit chúng.

Để commit, dùng lệnh sau:

git commit -m "Commit message"

Hoặc, nếu muốn giữ lại thay đổi mà chưa commit, bạn có thể dùng lệnh git stash để tạm thời lưu công việc:

git stash

Sau đó, bạn có thể áp dụng lại khi quay về nhánh ban đầu bằng lệnh git stash pop.

Nếu nhánh từ xa trùng tên với một nhánh cục bộ thì sao?

Tên nhánh phải là duy nhất trong Git. Nếu gặp lỗi nói rằng nhánh đã tồn tại, nghĩa là đã có một nhánh cục bộ trùng tên. Có thể rơi vào hai trường hợp:

  1. Chúng ta đã từng checkout nhánh này trước đó. Khi đó, có thể chuyển thẳng sang nó mà không cần fetch bằng lệnh git checkout <branch_name>. Lưu ý chúng ta bỏ tham số -b vốn dùng để chỉ định muốn tạo nhánh mới. Vì nhánh đã tồn tại, không cần tạo lại.
  2. Ở thời điểm nào đó, chúng ta đã tạo một nhánh khác nhưng trùng tên. Có thể khắc phục bằng cách dùng tên nhánh khác với git checkout -b <different_name> origin/<branch_name>.
Tôi có thể thay đổi trực tiếp trên một nhánh từ xa không?

Không. Việc thay đổi trên một nhánh Git được thực hiện bằng cách trước tiên tạo bản sao cục bộ của nhánh như đã nêu ở trên, rồi tạo các commit đại diện cho những thay đổi mong muốn.

Làm sao tôi cập nhật nhánh cục bộ với các thay đổi mới nhất từ remote?

Để cập nhật nhánh cục bộ với các thay đổi mới nhất từ nhánh từ xa tương ứng, ta thường dùng lệnh git pull:

git pull origin <branch_name>

Lệnh này thực hiện cả git fetch và git merge để cập nhật nhánh cục bộ. Như đã tìm hiểu, git fetch cập nhật kho cục bộ với phiên bản từ xa mới nhất. Lệnh git merge sẽ trộn các thay đổi đó vào nhánh cục bộ của chúng ta. Để biết thêm chi tiết, xem hướng dẫn Git push và pull này.

Tôi gặp lỗi: "remote branch not found." Sửa thế nào?

Lỗi này cho biết nhánh không tồn tại trong bản sao kho mã cục bộ của chúng ta. Vậy có thể:

  1. Nhánh không tồn tại, có thể do gõ sai tên nhánh hoặc đó là nhánh cũ đã bị xóa.
  2. Kho mã cục bộ chưa được cập nhật. Như đã nêu ở trên, chúng ta có thể cập nhật bằng git fetch.
François Aubry

Tác giả

François Aubry

Kỹ sư full-stack & nhà sáng lập tại CheapGPT. Giảng dạy luôn là niềm đam mê của tôi. Từ những ngày còn là sinh viên, tôi đã háo hức tìm kiếm cơ hội kèm cặp và hỗ trợ các bạn học khác. Niềm đam mê đó đã thôi thúc tôi theo học tiến sĩ, nơi tôi cũng đảm nhiệm vai trò trợ giảng để hỗ trợ con đường học thuật của mình. Trong những năm ấy, tôi tìm thấy sự mãn nguyện lớn lao trong môi trường lớp học truyền thống, xây dựng kết nối và thúc đẩy việc học tập. Tuy nhiên, với sự ra đời của các nền tảng học trực tuyến, tôi nhận ra tiềm năng thay đổi của giáo dục số. Thực tế, tôi đã trực tiếp tham gia phát triển một nền tảng như vậy tại trường đại học của chúng tôi. Tôi tận tâm kết hợp các nguyên tắc giảng dạy truyền thống với những phương pháp số đổi mới. Đam mê của tôi là tạo ra các khóa học không chỉ hấp dẫn và giàu thông tin mà còn dễ tiếp cận với người học trong thời đại số này.

Chủ đề