2012-04-03 18 views
115

Có ai biết sự khác biệt giữa hai lệnh này để chuyển đổi và theo dõi một nhánh từ xa không?Sự khác biệt giữa thanh toán git - gốc xuất xứ/chi nhánh và chi nhánh git checkout -b branch/branch

git checkout -b branch origin/branch 
git checkout --track origin/branch 

Tôi nghĩ cả hai đều theo dõi nhánh từ xa để tôi có thể đẩy các thay đổi của mình đến nhánh gốc, phải không?

Có sự khác biệt thực tế nào không ??

Cảm ơn!

Trả lời

157

Hai lệnh có cùng tác dụng (thanks to Robert Siemer’s answer for pointing it out).

Sự khác biệt thực tế đi kèm khi sử dụng một chi nhánh địa phương đặt tên khác:

  • git checkout -b mybranch origin/abranch sẽ tạo mybranch và theo dõi origin/abranch
  • git checkout --track origin/abranch sẽ chỉ tạo ra 'abranch', không phải là một chi nhánh với một tên khác nhau.

(Nghĩa là, as commented bởi Sebastian Graf, nếu các chi nhánh địa phương đã không tồn tại đã
Nếu nó đã làm, bạn sẽ cần git checkout -B abranch origin/abranch.)


Thứ nhất, một số nền tảng: Tracking có nghĩa là một chi nhánh địa phương có thượng nguồn được đặt thành chi nhánh từ xa:

# git config branch.<branch-name>.remote origin 
# git config branch.<branch-name>.merge refs/heads/branch 

git checkout -b branch origin/branch sẽ

  • tạo/reset branch đến điểm tham chiếu bởi origin/branch.
  • tạo chi nhánh branch (với git branch) và theo dõi chi nhánh theo dõi từ xa origin/branch.

Khi một chi nhánh địa phương đang bắt đầu một chi nhánh từ xa theo dõi, Git thành lập chi nhánh (đặc biệt là các mục cấu hình branch.<name>.remotebranch.<name>.merge) để git pull một cách thích hợp sẽ hợp nhất từ ​​các chi nhánh từ xa theo dõi.
Hành vi này có thể thay đổi thông qua cờ cấu hình toàn cầu branch.autosetupmerge. Cài đặt đó có thể bị ghi đè bằng cách sử dụng các tùy chọn --track--no-track và thay đổi sau đó bằng cách sử dụng chi nhánh git --set-upstream-to.


git checkout --track origin/branch sẽ làm như vậy:

# or, since 1.7.0 
git branch --set-upstream branch upstream/branch 
# or, since 1.8.0 (October 2012) 
git branch --set-upstream-to branch upstream/branch 
# the short version remains the same: 
git branch -u branch upstream/branch 

Nó cũng sẽ thiết lập các thượng nguồn cho 'branch'.

(Lưu ý: git1.8.0 sẽ không dùng git branch --set-upstream và thay thế bằng git branch -u|--set-upstream-to: xem git1.8.0-rc1 announce)


Có một chi nhánh thượng nguồn đăng ký cho một chi nhánh địa phương sẽ:

  • tell git để hiển thị mối quan hệ giữa hai chi nhánh ở git statusgit branch -v.
  • hướng dẫn git pullkhông có đối số để kéo từ thượng nguồn khi chi nhánh mới được kiểm tra.

Xem "How do you make an existing git branch track a remote branch?" để biết thêm.

+0

@VonC Tôi đang tìm kiếm chi tiết nhỏ mà bạn đã đề cập đến là thông tin bổ sung. Trong trường hợp của tôi, tôi đã tò mò tại sao tôi có một số chi nhánh của tôi cho phép tôi để 'git pull', trong khi một số chi nhánh sẽ yêu cầu một chi nhánh từ xa để kéo từ. Nó chỉ ra rằng nếu bạn, trong lần đầu tiên của bạn, đang kiểm tra một nhánh xa mà peer của bạn tạo ra, git tiếp tục và thêm 'branch. .remote = origin' vào gitconfig cục bộ. Mà sau đó cho phép bạn phát hành 'git pull'. Tuy nhiên, nếu bạn là người tạo ra nhánh 'git checkout -b BNAME', thì git -of course- không biết. Vì vậy, bạn nên chỉ định từ xa của nó. – batilc

+0

@batilc "Nó chỉ ra rằng nếu bạn, trong lần đầu tiên của bạn, đang kiểm tra một chi nhánh từ xa mà đồng nghiệp của bạn tạo ra,"; có, đọc https://git-scm.com/docs/git-checkout, tôi thấy: "Nếu không tìm thấy ' nhưng có tồn tại một nhánh theo dõi chính xác ở một từ xa (gọi nó là "') với một tên trùng khớp, xử lý tương đương với '$ git checkout -b --track /' " – VonC

+0

@VonC Tôi đã tìm thấy cấu hình tốt hơn cho việc này. việc thiết lập 'branch.autoSetupMerge' thành' always' chỉ đơn giản là thực hiện những gì chúng ta đang nói đến. Cài đặt này mặc định là 'true', nghĩa là việc theo dõi sẽ chỉ được thực hiện khi kiểm tra một nhánh từ xa. 'true' không thiết lập theo dõi cho các nhánh được tạo cục bộ. – batilc

5

The book dường như chỉ ra rằng những lệnh mang lại tác dụng tương tự:

Các trường hợp đơn giản là ví dụ bạn vừa thấy, chạy git checkout -b [chi nhánh] [ở xa]/[chi nhánh]. Nếu bạn có Git phiên bản 1.6.2 hoặc sau đó, bạn cũng có thể sử dụng viết tắt --track:

$ git checkout --track origin/serverfix 
Branch serverfix set up to track remote branch serverfix from origin. 
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 ở 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 nhau:

$ git checkout -b sf origin/serverfix 

Đó là đặc biệt tiện dụng khi bash hoặc oh-my-zsh hoàn git là ab le để kéo tên origin/serverfix cho bạn - chỉ cần thêm --track (hoặc -t) và bạn đang trên đường.

18

Không có sự khác biệt nào cả!

1) git checkout -b branch origin/branch

Nếu không có --track và không --no-track, --track được giả định như mặc định. Mặc định có thể được thay đổi với cài đặt branch.autosetupmerge.

Có hiệu lực, 1) hoạt động như git checkout -b branch --track origin/branch.

2) git checkout --track origin/branch

“Để tiện lợi”, --track mà không -b ngụ ý -b và lập luận để -b được đoán là “chi nhánh”. Việc đoán được thúc đẩy bởi biến cấu hình remote.origin.fetch.

Có hiệu lực, 2) hoạt động như git checkout -b branch --track origin/branch.

Như bạn có thể thấy: không có sự khác biệt.

Nhưng nó được thậm chí tốt hơn:

3) git checkout branch

cũng tương đương với git checkout -b branch --track origin/branch nếu “chi nhánh” chưa hề tồn tại nhưng “nguồn gốc/chi nhánh” không .


Tất cả ba lệnh đặt “thượng nguồn” của “nhánh” thành “origin/branch” (hoặc không thành công).

Phía trên được sử dụng làm điểm tham chiếu của đối số ít hơn git status, git push, git merge và do đó git pull (nếu được định cấu hình như vậy (mặc định hoặc gần như mặc định)).

Ví dụ: git status cho bạn biết cách xa phía trước hoặc phía trước bạn là thượng lưu, nếu một cấu hình được định cấu hình.

git push được định cấu hình để đẩy nhánh nhánh hiện tại lên theo mặc định kể từ git 2.0.

... và nếu “nguồn gốc” là chỉ từ xa có “chi nhánh”
mặc định (có tên là “đơn giản”) cũng thực thi cho cả hai tên chi nhánh để được bình đẳng