簡體   English   中英

git checkout --track origin/branch 和 git checkout -b branch origin/branch 之間的區別

[英]Difference between git checkout --track origin/branch and git checkout -b branch origin/branch

有人知道這兩個切換和跟蹤遠程分支的命令之間的區別嗎?

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

我認為兩者都跟蹤遠程分支,所以我可以將我的更改推送到原始分支,對嗎?

有任何實際差異嗎?

這兩個命令具有相同的效果(感謝 Robert Siemer 的回答指出)。

使用不同名稱的本地分支時會出現實際差異

  • git checkout -b mybranch origin/abranch將創建mybranch並跟蹤origin/abranch
  • git checkout --track origin/abranch只會創建“ abranch ”,而不是具有不同名稱的分支。

(也就是說, 正如Sebastian Graf所評論的那樣,如果本地分支機構尚不存在。
如果是這樣,您將需要git checkout -B abranch origin/abranch )


注意:對於 Git 2.23(2019 年第 3 季度),將使用新命令git switch

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

如果該分支存在於多個遙控器中,並且其中一個由checkout.defaultRemote配置變量命名,我們將使用該分支來消除歧義,即使<branch>在所有遙控器中不是唯一的。
將其設置為例如checkout.defaultRemote=origin如果<branch>不明確但存在於“origin”遠程,則始終從那里檢出遠程分支。

這里,“ -c ”是新的“ -b ”。


首先,一些背景:跟蹤意味着本地分支將其上游設置為遠程分支:

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

git checkout -b branch origin/branch將:

  • 創建/重置branchorigin/branch引用的點。
  • 創建分支branch (使用git branch )並跟蹤遠程跟蹤分支origin/branch

當本地分支從遠程跟蹤分支開始時,Git 設置分支(特別是branch.<name>.remotebranch.<name>.merge配置條目) ,以便git pull將適當地從遠程合並跟蹤分支。
可以通過全局branch.autosetupmerge配置標志更改此行為。 可以使用--track--no-track選項覆蓋該設置,稍后使用 git branch --set-upstream-to


git checkout --track origin/branch將與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

它還會為“ branch ”設置上游。

(注意:git1.8.0 將棄用git branch --set-upstream並將其替換為git branch -u|--set-upstream-to :參見git1.8.0-rc1 announce


將上游分支注冊為本地分支將:

  • 告訴 gitgit statusgit branch -v中顯示兩個分支之間的關系
  • 指示git pull而不是 arguments在簽出新分支時從上游拉取

有關更多信息,請參閱“ 如何使現有的 git 分支跟蹤遠程分支? ”。

一點區別都沒有!

1) git checkout -b branch origin/branch

如果沒有--track--no-track ,則假定--track為默認值。 可以使用設置branch.autosetupmerge更改默認值。

實際上,1) 表現得像git checkout -b branch --track origin/branch

2) git checkout --track origin/branch

“為方便起見”,不帶-b--track暗示-b並且-b的參數被猜測為“分支”。 猜測是由配置變量remote.origin.fetch驅動的。

實際上,2) 表現得像git checkout -b branch --track origin/branch

如您所見:沒有區別。

但它變得更好:

3) git checkout branch

也等同於git checkout -b branch --track origin/branch如果“branch”尚不存在但“origin/branch”存在1


這三個命令都將“branch”的“upstream”設置為“origin/branch”(否則它們會失敗)。

上游用作無參數git statusgit pushgit mergegit pull的參考點(如果這樣配置(默認或幾乎默認))。

例如git status告訴你你比上游落后或領先多遠,如果配置的話。

git push從git 2.0開始配置默認向上游推送當前分支2

1 ...如果“origin”是唯一具有“branch”的遠程
2默認值(名為“simple”)強制兩個分支名稱相等

這本書似乎表明這些命令產生相同的效果:

簡單的情況就是您剛剛看到的示例,運行 git checkout -b [branch] [remotename]/[branch]。 如果你有 Git 版本 1.6.2 或更高版本,你也可以使用 --track 簡寫:

$ git checkout --track origin/serverfix 
Branch serverfix set up to track remote branch serverfix from origin. 
Switched to a new branch 'serverfix' 

要設置與遠程分支名稱不同的本地分支,您可以輕松地使用具有不同本地分支名稱的第一個版本:

$ git checkout -b sf origin/serverfix

當您的 bash 或 oh-my-zsh git 完成能夠為您提取origin/serverfix名稱時,這特別方便 - 只需 append --track (或-t )並且您正在路上。

您不能使用此命令創建新分支

git checkout --track origin/branch

如果您有未暫存的更改。

這是例子:

$ 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

但是,您可以使用git checkout -b命令輕松創建一個包含未暫存更改的新分支:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM