2011-01-14 49 views
81

Ai đó có thể giải thích "nhánh theo dõi" vì nó áp dụng cho git?Git: Chi nhánh theo dõi là gì?

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

A 'chi nhánh theo dõi' trong Git là một địa phương chi nhánh được kết nối với một chi nhánh từ xa. Khi bạn đẩy và kéo chi tiết đó vào chi tiết , nó sẽ tự động đẩy và kéo đến nhánh từ xa mà nó được kết nối với .

Sử dụng tính năng này nếu bạn luôn kéo từ nhánh ngược dòng vào chi 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, mới mẻ với git và đến từ SVN, định nghĩa đó hoàn toàn không có ý nghĩa đối với tôi.

Tôi đọc qua "The Pragmatic Guide to Git" (sách tuyệt vời, nhân tiện) và dường như cho 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 (trong trường hợp này), bạn nên thiết lập chi nhánh chính của bạn thành chi nhánh theo dõi, nhưng rất tiếc là không bao gồm chi nhánh theo dõi lý do tại sao chi nhánh theo dõi là một điều tốt hoặc những lợi ích nào bạn có được bằng cách thiết lập chi nhánh chính của mình làm chi nhánh theo dõi của kho gốc của bạn .

Ai đó có thể làm sáng tỏ tôi (bằng tiếng Anh) không?

Trả lời

63

Các ProGit booka very good explanation:

theo dõi Chi nhánh

Kiểm tra ra một chi nhánh địa phương từ một chi nhánh từ xa tự động tạo ra những gì được gọi là một chi nhánh theo dõi. Các nhánh theo dõi là các nhánh địa phương có mối quan hệ trực tiếp với một nhánh từ xa. Nếu bạn đang ở trên một nhánh theo dõi và gõ git push, Git sẽ tự động biết máy chủ và nhánh nào cần push. Ngoài ra, chạy git pull trong khi trên một trong các nhánh này lấy tất cả các tham chiếu từ xa và sau đó tự động kết hợp 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/bản gốc. Đó là lý do tại sao git đẩy và git kéo công việc ra khỏi hộp mà không có đối số nào khác. Tuy nhiên, bạn có thể thiết lập các nhánh theo dõi khác nếu bạn muốn - những nhánh không theo dõi chi nhánh 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 xem, chạy git checkout -b [branch] [remotename]/[branch]. Nếu bạn có Git phiên bản 1.6.2 hoặc mới hơn, bạn cũng có thể sử dụng --track viết tắt:

$ 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 với một tên khác nhau hơn so 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 khác nhau tên chi nhánh địa phương:

$ 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 sf sẽ tự động push to và kéo từ origin/serverfix.

+12

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

+0

@JohnO, có thể muốn làm điều đó với anh chàng Git Pro. 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. –

24

Các Progit cuốn sách đề cập đến:

chi nhánh theo dõi là các chi nhánh địa phương mà có mối quan hệ trực tiếp đến chi nhánh từ xa

Không chính xác. câu hỏi SO "Having a hard time understanding git-fetch" bao gồm:

Không có khái niệm như thế theo dõi chi nhánh địa phương, chỉ theo dõi từ xa chi nhánh.
Vì vậy origin/master là một chi nhánh theo dõi từ xa cho master trong origin repo.

Nhưng trên thực tế, một khi bạn thiết lập một upstream branch relationship giữa:

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

Sau đó, bạn có thể xem xét master như một chi nhánh theo dõi địa phương: theo dõi từ xa t racking branchorigin/master theo đó, lần lượt theo dõi nhánh chính của upstream repoorigin.

alt text

+0

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

+0

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

+3

@SherylHohman No: 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 của một ngã ba, thực hành tốt nhất là theo dõi ngược dòng (repo gốc) cho các nhánh chung (như master), và nguồn gốc track (remote fork) cho các nhánh mới (PR hoặc các chi nhánh): xem https: // stackoverflow.com/a/21847690/6309 – VonC

3

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

git branch --set-upstream-to origin/Development new-branch 
Các vấn đề liên quan