Chi nhánh theo dõi là gì?


173

Ai đó có thể giải thích một "nhánh theo dõi" khi nó áp dụng cho git không?

Đây là định nghĩa từ git-scm.com :

Một "nhánh theo dõi" trong Git là một nhánh cục bộ được kết nối với một nhánh từ xa. Khi bạn đẩy và kéo trên nhánh đó, nó sẽ tự động đẩy và kéo đến nhánh từ xa mà nó được kết nối.

Sử dụng cái này nếu bạn luôn kéo từ cùng một nhánh ngược dòng vào nhánh mới và nếu bạn không muốn sử dụng "git pull" một cách rõ ràng.

Thật không may, là người mới sử dụng git và đến từ SVN, định nghĩa đó hoàn toàn không có ý nghĩa với tôi.

Tôi đang đọc qua " Hướng dẫn thực dụng về Git " (nhân tiện, cuốn sách tuyệt vời) và dường như họ đề xuất rằng các nhánh theo dõi là một điều tốt và sau khi tạo điều khiển từ xa đầu tiên của bạn (nguồn gốc, trong trường hợp này), bạn nên thiết lập nhánh chính của bạn thành một nhánh theo dõi, nhưng thật không may, tại sao nhánh theo dõi là một điều tốt hoặc lợi ích bạn nhận được bằng cách thiết lập nhánh chính của bạn thành một nhánh theo dõi của kho lưu trữ gốc của bạn .

Ai đó có thể xin vui lòng khai sáng cho tôi (bằng tiếng Anh)?


6
Một lưu ý thuật ngữ: theo dõi từ , trong Git, bị quá tải rất nặng. Một số tệp được theo dõi và một số không bị theo dõi; một số tên nhánh được gọi là nhánh theo dõi từ xa; và bạn có thể sử dụng --tracktùy chọn để tạo một nhánh (cục bộ) có một trong những nhánh theo dõi từ xa này được đặt làm thượng nguồn của nó . Thuật ngữ đã phát triển phần nào giữa năm 2006 và 2019, vì vậy những người khác nhau đôi khi có thể có nghĩa gì đó khác nhau bởi mỗi từ này.

Cá nhân tôi khuyên bạn nên sử dụng cụm từ tên theo dõi từ xa thay cho các nhánh theo dõi từ xa , một phần vì nhánh từ cũng quá tải. Các tên theo dõi từ xa là những tên trông giống như origin/master: chúng nằm trong kho lưu trữ của bạn, nhưng chúng là cách ghi nhớ tên nhánh của Git như được thấy trong một số kho lưu trữ Git khác tại origin. Nếu sau đó bạn sử dụng từ ngược dòng , đó là thuật ngữ hiện đại hơn, để nói rằng bạn masterđã origin/masterđặt thành từ ngược dòng , bạn có thể tránh tất cả sự nhầm lẫn thuật ngữ này.

Câu trả lời:


141

Các cuốn sách ProGitmột lời giải thích rất tốt :

Chi nhánh theo dõi

Kiểm tra một nhánh cục bộ từ một nhánh từ xa sẽ tự động tạo ra cái được gọi là nhánh theo dõi. Các nhánh theo dõi là các nhánh cục bộ có mối quan hệ trực tiếp với một nhánh từ xa. Nếu bạn đang ở trong một nhánh và loại theo dõi git push, Git sẽ tự động biết máy chủ và nhánh nào sẽ được đẩy tới. Ngoài ra, chạy git pulltrong khi trên một trong các nhánh này tìm nạp tất cả các tham chiếu từ xa và sau đó tự động hợp nhất trong nhánh từ xa tương ứng.

Khi bạn sao chép một kho lưu trữ, nó thường tự động tạo một nhánh chính theo dõi nguồn gốc / chủ. Đó là lý do tại sao git pushgit pulllàm việc ra khỏi hộp mà không có đối số khác. Tuy nhiên, bạn có thể thiết lập các nhánh theo dõi khác nếu muốn - những nhánh không theo dõi các nhánh về nguồn gốc và không theo dõi nhánh chính. Trường hợp đơn giản là ví dụ bạn vừa thấy, đang chạy git checkout -b [branch] [remotename]/[branch]. Nếu bạn có phiên bản Git 1.6.2 trở lên, bạn cũng có thể sử dụng tốc --trackký:

$ git checkout --track origin/serverfix
Branch serverfix set up to track remote branch refs/remotes/origin/serverfix.
Switched to a new branch "serverfix"

Để thiết lập một chi nhánh địa phương có tên khác với chi nhánh từ xa, bạn có thể dễ dàng sử dụng phiên bản đầu tiên với một tên chi nhánh địa phương khác:

$ git checkout -b sf origin/serverfix
Branch sf set up to track remote branch refs/remotes/origin/serverfix.
Switched to a new branch "sf"

Bây giờ, chi nhánh địa phương của bạn sfsẽ tự động đẩy đến và kéo từ origin/serverfix.

THƯỞNG: git statusthông tin thêm

Với một nhánh theo dõi, git statussẽ cho bạn biết bạn ở đằng sau nhánh theo dõi của bạn bao xa - hữu ích để nhắc nhở bạn rằng bạn chưa thúc đẩy các thay đổi của mình! Nó trông như thế này:

$ git status
On branch master
Your branch is ahead of 'origin/master' by 1 commit.
  (use "git push" to publish your local commits)

hoặc là

$ git status
On branch dev
Your branch and 'origin/dev' have diverged,
and have 3 and 1 different commits each, respectively.
  (use "git pull" to merge the remote branch into yours)


21
Chỉ muốn làm rõ điều này: "Kiểm tra một nhánh cục bộ từ một nhánh từ xa sẽ tự động tạo ra cái được gọi là nhánh theo dõi." Đó là sự hiểu lầm. Nếu không có tùy chọn --track, bất kỳ nhánh nào bạn tạo sẽ không được theo dõi.
JohnO

@ John, có thể muốn đưa nó lên với anh chàng Pro Git. Toàn bộ cuốn sách là kết quả của sự hợp tác chỉnh sửa lớn IIRC.
Assaf Lavie

2
@ JohnO, theo: sbf5.com/~cduan/technical/git/git-4.shtml --track được bật theo mặc định và do đó không cần thiết.
Hank Lin

50

Dưới đây là các ghi chú học tập cá nhân của tôi trên các nhánh theo dõi GIT, hy vọng nó sẽ hữu ích cho khách truy cập trong tương lai:

nhập mô tả hình ảnh ở đây nhập mô tả hình ảnh ở đây nhập mô tả hình ảnh ở đây nhập mô tả hình ảnh ở đây nhập mô tả hình ảnh ở đây nhập mô tả hình ảnh ở đây


Theo dõi các nhánh và "git fetch":

nhập mô tả hình ảnh ở đây nhập mô tả hình ảnh ở đây nhập mô tả hình ảnh ở đây


Cảm ơn các ghi chú! Bạn có muốn chia sẻ tất cả nếu có thể? Cảm ơn;
Aditya

@Aditya: Câu hỏi này là để theo dõi các chi nhánh và tôi đã đăng tất cả các ghi chú của mình về chủ đề này. Nếu tôi tìm thấy một số câu hỏi có liên quan khác nơi tôi có thể đăng các ghi chú GIT khác của mình, thì tôi sẽ rất vui khi làm điều đó.
hagrawal

Cảm ơn! Ý tôi là đăng chúng trên blog của bạn hoặc một cái gì đó :). Cảm ơn một lần nữa cho ghi chú tốt đẹp!
Aditya

@Aditya: À, tôi hiểu rồi. Bây giờ bạn rõ ràng về những gì bạn có ý nghĩa. Tôi đang chạy phía sau trên trang web của tôi, chưa tạo một cái cho riêng mình.
hagrawal

43

Cuốn sách Pro Git đề cập :

Các nhánh theo dõi là các nhánh cục bộ có mối quan hệ trực tiếp với một nhánh từ xa

Không chính xác. Câu hỏi SO " Có một thời gian khó hiểugit-fetch " bao gồm:

Không có khái niệm nào về các nhánh theo dõi cục bộ , chỉ có các nhánh theo dõi từ xa .
Vì vậy, origin/masterlà một chi nhánh theo dõi từ xa mastertrong originrepo.

Nhưng trên thực tế, một khi bạn thiết lập mối quan hệ nhánh ngược dòng giữa:

  • một chi nhánh địa phương như master
  • và một nhánh theo dõi từ xa như origin/master

Sau đó, bạn có thể xem xét masternhư một nhánh theo dõi cục bộ : Nó theo dõi nhánh theo dõi từ xa, theo origin/master đó, theo dõi nhánh chính của repo ngược dòng origin .

văn bản thay thế


Làm rõ hình ảnh: Máy tính của tôi là 2 cam kết trước nguồn gốc. Đó là nơi mà hai cam kết của chủ đến từ. Hình ảnh: progit.org/book/ch3-5.html
idbrii

Tôi có diễn giải chính xác không: Nếu tôi cục bộ có các điều khiển từ xa được đặt cho nguồn gốc và ngược dòng, thì nhánh chính cục bộ của tôi sẽ theo dõi trực tiếp nguồn gốc và gián tiếp ngược dòng? ví dụ: khi tôi git statussẽ nhận được thông báo theo dõi cam kết đối với cả repos gốc và ngược dòng? (Settup: Tôi đã nhân bản repo của ai đó tại địa phương, đẩy bản sao của mình sang repo mới trên tài khoản GitHub của mình và đặt nguồn gốc và từ xa ngược dòng cho repo github của tôi và repo nhân bản vô tính tương ứng).
SherylHohman

3
@SherylHohman Không: một chi nhánh địa phương sẽ không theo dõi bất cứ điều gì "trực tiếp" hoặc "gián tiếp". Nó sẽ theo dõi nhánh theo dõi từ xa mà bạn sẽ gán cho nó. Trong trường hợp rẽ nhánh, cách tốt nhất là theo dõi ngược dòng (repo gốc) cho các nhánh chung (như master) và theo dõi nguồn gốc (ngã ba từ xa của bạn) cho các nhánh mới (PR hoặc nhánh tính năng của bạn): xem stackoverflow.com/ a / 21847690/ 6309
VonC

2
@VonC - Câu lệnh "Không có khái niệm nào về các nhánh theo dõi cục bộ, chỉ có các nhánh theo dõi từ xa". thật thú vị vì có những thuật ngữ mâu thuẫn như vậy xung quanh các chi nhánh. Điều này thường được liên kết tham khảo web.archive.org/web/20130419172453/http://www.gitguys.com/. Phân biệt giữa "các nhánh theo dõi" và "các nhánh theo dõi từ xa". Họ gọi origin / master là "nhánh theo dõi từ xa" - tôi đồng ý - nhưng sau đó họ cũng gọi "master" là "nhánh theo dõi". Theo dõi tổng thể là gì? Họ sai hay đó là một vấn đề thuật ngữ?
Howiecamp

2
@Howiecamp cái mà họ gọi là "nhánh theo dõi được gọi là master" chỉ đơn giản là một chủ nhánh chi nhánh địa phương có nguồn gốc / chủ nhánh theo dõi từ xa liên quan, ở đây để ghi nhớ SHA1 cuối cùng được lấy từ nguồn gốc liên quan đến nhánh chính từ xa của nó. Vì vậy, nó là một "lối tắt" để chỉ định "một nhánh địa phương với một nhánh ngược dòng"
VonC

7

Đây là cách tôi đã thêm một nhánh theo dõi để tôi có thể kéo từ nó vào nhánh mới của mình:

git branch --set-upstream-to origin/Development new-branch
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.