Sự khác biệt giữa thanh toán git - nguồn gốc / chi nhánh và thanh toán git -b nguồn gốc chi nhánh / chi nhánh


208

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?

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

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

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

Cảm ơn!

Câu trả lời:


280

Hai lệnh có cùng tác dụng ( nhờ câu trả lời của Robert Siemer vì đã chỉ ra ).

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

  • git checkout -b mybranch origin/abranchsẽ tạo mybranchvà theo dõiorigin/abranch
  • git checkout --track origin/abranchsẽ chỉ tạo ' abranch', không phải là một nhánh có tên khác.

(Đó là, như nhận xét của Sebastian Graf , nếu chi nhánh địa phương chưa tồn tại.
Nếu có, bạn sẽ cần git checkout -B abranch origin/abranch)


Lưu ý: với Git 2.23 (quý 3 năm 2019), sẽ sử dụng lệnh mớigit switch :

git switch -c <branch> --track <remote>/<branch>

Nếu nhánh tồn tại trong nhiều điều khiển từ xa và một trong số chúng được đặt tên theo checkout.defaultRemotebiến cấu hình, chúng ta sẽ sử dụng nhánh đó cho mục đích định hướng, ngay cả khi <branch>không phải là duy nhất trên tất cả các điều khiển từ xa.
Đặt nó thành ví dụ checkout.defaultRemote=originđể luôn kiểm tra các nhánh từ xa nếu <branch>không rõ ràng nhưng tồn tại trên điều khiển 'gốc'.

Ở đây, ' -c' là cái mới ' -b'.


Đầu tiên, một số nền tảng: Theo dõi có nghĩa là một nhánh cục bộ được đặt ngược dòng thành một 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 / đặt lại branchđến điểm được tham chiếu bởi origin/branch.
  • tạo nhánh branch(với git branch) và theo dõi nhánh theo dõi từ xa origin/branch.

Khi một nhánh cục bộ được khởi động từ một nhánh theo dõi từ xa, Git sẽ thiết lập nhánh đó (cụ thể là các mục branch.<name>.remotebranch.<name>.mergecấu hình) để nó git pullsẽ hợp nhất một cách thích hợp từ nhánh theo dõi từ xa.
Hành vi này có thể được thay đổi thông qua branch.autosetupmergecờ cấu hình toàn cầu . Thiết lập có thể được ghi đè bằng --track--no-tracktùy chọn, và thay đổi sau này sử dụng git branch --set-upstream-to.


git checkout --track origin/branchsẽ làm tương tự như git branch --set-upstream-to):

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

Nó cũng sẽ đặt ngược dòng cho ' branch'.

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


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

  • nói với git để hiển thị mối quan hệ giữa hai nhánh trong git statusgit branch -v .
  • chỉ đạo git pull mà không có đối số để kéo từ thượng nguồn khi chi nhánh mới được kiểm tra .

Xem " Làm thế nào để bạn tạo một nhánh git hiện có theo dõi một nhánh từ xa? " Để biết thêm.


1
@VonC Tôi đang tìm kiếm chi tiết nhỏ mà bạn tình cờ đề cập đến như 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 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. 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 từ xa mà đồng nghiệp của bạn đã tạo, git sẽ tiếp tục và thêm branch.<BNAME>.remote=originvà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 chi nhánh git checkout -b BNAME, thì git -of dĩ nhiên - không biết. Vì vậy, bạn nên chỉ định từ xa của nó.
batilc

@batilc "Hóa ra nếu bạn, trong lần đầu tiên, đang kiểm tra một nhánh từ xa mà đồng nghiệp của bạn đã tạo ra"; có, đọc git-scm.com/docs/git-checkout , tôi thấy: " If <branch>không tìm thấy nhưng có tồn tại một nhánh theo dõi trong chính xác một điều khiển từ xa (gọi nó <remote>) với tên phù hợp, coi như tương đương với $ git checkout -b <branch> --track <remote>/<branch>"
VonC

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

@batilc Tôi đồng ý. Tôi có xu hướng không sử dụng luôn, vì tôi thích đặt theo dõi rõ ràng, nhưng trong trường hợp của bạn, đó phải là cài đặt phù hợp.
VonC

1
"Git nhánh --set-up-up-up nhánh / nhánh" không phải là cú pháp đúng. nó phải là: "nhánh git --set-
up

33

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

1) git checkout -b branch origin/branch

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

Trong thực tế, 1) hành xử như thế nào git checkout -b branch --track origin/branch.

2) git checkout --track origin/branch

Càng là một tiện ích, --trackmà không có -bngụ ý -bvà đối số -bđược đoán là nhánh nhánh. Việc đoán được điều khiển bởi biến cấu hình remote.origin.fetch.

Trong thực tế, 2) hành xử như thế nào 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ó thậm chí còn tốt hơn:

3) git checkout branch

cũng tương đương với git checkout -b branch --track origin/branchnếu nhánh nhánh của Cameron không tồn tại nhưng nguồn gốc / nhánh nhánh của Google có 1 .


Cả ba lệnh này đều đặt ra một dòng ngược dòng của nhánh nhánh của nhánh Cameron là nhánh nguồn gốc / nhánh nhánh (hoặc chúng không thành công).

Thượng nguồn được sử dụng như điểm tham chiếu của các đối số-ít git status, git push, git mergevà do đó git pull(nếu cấu hình như thế (đó là mặc định hoặc gần như mặc định)).

Ví dụ, git statuscho bạn biết phía sau hoặc phía trước của bạn là thượng nguồn, nếu một trong số đó được cấu hình.

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

1 ... và nếu có nguồn gốc từ hồi thì thì đây là điều khiển từ xa duy nhất có nhánh nhánh của nhánh
2 , mặc định (có tên là đơn giản) cũng bắt buộc cả hai tên nhánh phải bằng nhau


5

Cuốn sách dường như chỉ ra rằng những lệnh đó mang lại hiệu quả tương tự:

Trường hợp đơn giản là ví dụ bạn vừa thấy, đang chạy git checkout -b [nhánh] [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 ký --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 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

Điều đó đặc biệt hữu ích khi các bản hoàn chỉnh bash hoặc oh-my-zsh của bạn có thể lấy origin/serverfixtên cho bạn - chỉ cần nối thêm --track(hoặc -t) và bạn đang trên đường.


-1

Bạn không thể tạo một nhánh mới bằng lệnh này

git checkout --track origin/branch

nếu bạn có những thay đổi không được dàn dựng.

Đây là ví dụ:

$ git status
On branch master
Your branch is up to date with 'origin/master'.

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        modified:   src/App.js

no changes added to commit (use "git add" and/or "git commit -a")

// TRY TO CREATE:

$ git checkout --track origin/new-branch
fatal: 'origin/new-branch' is not a commit and a branch 'new-branch' cannot be created from it

Tuy nhiên, bạn có thể dễ dàng tạo một nhánh mới với các thay đổi không theo giai đoạn bằng git checkout -blệnh:

$ git checkout -b new-branch
Switched to a new branch 'new-branch'
M       src/App.js

Hãy nhớ rằng cả hai lệnh trong các câu hỏi là để theo dõi một nhánh từ xa hiện có ( origin/branch)
yorch

@Green Bài kiểm tra bạn làm là với origin/new-branchthay vì origin/branch. Bạn có biết rằng?
Robert Siemer
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.