有沒有人知道這兩個命令切換和跟蹤遠程分支的區別?git checkout --track origin/branch和git checkout -b branch branch/branch之間的區別
git checkout -b branch origin/branch
git checkout --track origin/branch
我認爲都跟蹤遠程分支,所以我可以推動我的變化到原產地的分支,對不對?
有什麼實際區別?
謝謝!
有沒有人知道這兩個命令切換和跟蹤遠程分支的區別?git checkout --track origin/branch和git checkout -b branch branch/branch之間的區別
git checkout -b branch origin/branch
git checkout --track origin/branch
我認爲都跟蹤遠程分支,所以我可以推動我的變化到原產地的分支,對不對?
有什麼實際區別?
謝謝!
這兩個命令具有相同的效果(thanks to Robert Siemer’s answer for pointing it out)。
git checkout -b mybranch origin/abranch
將創建mybranch
和跟蹤origin/abranch
git checkout --track origin/abranch
只會造成「abranch
」,而不是一個具有不同名稱的分支: 實際區別使用名爲本地分支當不同來。
(也就是說,as commented通過Sebastian Graf,如果本地分支取得不存在
如果那樣,你需要git checkout -B abranch origin/abranch
。)
首先,一些背景:跟蹤表示本地分支的上游設置爲遠程分支:
# git config branch.<branch-name>.remote origin
# git config branch.<branch-name>.merge refs/heads/branch
git checkout -b branch origin/branch
將
branch
由origin/branch
參考點。branch
(與git branch
)並跟蹤遠程跟蹤分支origin/branch
。當本地分支開始了一個遠程跟蹤分支,GIT中設置的分支(特別是
branch.<name>.remote
和branch.<name>.merge
配置條目)使得git pull
將適當地從遠程跟蹤分支合併。
此行爲可能會通過全局branch.autosetupmerge
配置標誌進行更改。該設置可以通過使用--track
和--no-track
選項進行覆蓋,並在稍後使用git分支--set-upstream-to
進行更改。
而且git checkout --track origin/branch
會做同樣的:
# 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
這也將設置爲上游 'branch
'。
(注:git1.8.0將棄用git branch --set-upstream
與git branch -u|--set-upstream-to
替換:見git1.8.0-rc1 announce)
具有本地分行將註冊的上游分支:
git status
和git branch -v
兩個分支之間的關係。git pull
無參數當檢出新分支時從上游拉出。有關更多信息,請參閱「How do you make an existing git branch track a remote branch?」。
The book似乎表明,這些命令產生相同的效果:
簡單的情況就是你剛纔看到的例子,運行git結帳-b [分支] [遠程名]/[分支。如果你的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的落成是AB這是特別方便le拉origin/serverfix
名稱 - 只需追加--track
(或-t
),你就在路上。
完全沒有區別!
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
「作爲一個方便」,--track
而不-b
意味着-b
和參數-b
推測是「分支」。猜測由配置變量remote.origin.fetch
驅動。
實際上,2)表現得像git checkout -b branch --track origin/branch
。
正如你所看到的:沒有區別。
但它會變得更好:
3)git checkout branch
也相當於git checkout -b branch --track origin/branch
如果「分支」還不存在,但「出身/分支」確實。
所有這三個命令都將「分支」的「上游」設置爲「原點/分支」(或它們失敗)。
上游被用作參考點的參數少git status
,git push
,git merge
因此git pull
(如果配置這樣的(這是默認值或幾乎默認))。
E.g. git status
告訴你,如果配置了上游或下游,則上游有多遠。
git push
被配置爲從git 2.0開始推動默認的當前分支上游。
...如果「原產地」是唯一的遠程有「分支」
默認(命名爲「簡單」)也強制執行兩個分支名稱相等
@VonC我一直在尋找你偶然提及的那些細節,作爲額外的信息。就我而言,我很好奇爲什麼我的一些分支允許我「拉扯」,而有些分支會要求一個遠程分支從中拉出。事實證明,如果你第一次檢查你的同行創建的遠程分支,git會繼續並添加分支。 .remote = origin'到本地gitconfig。然後允許你發出'git pull'。但是,如果您是創建分支'git checkout -b BNAME'的人,那麼git -of course-不知道。所以你應該指定它的遠程。 –
batilc
2016-12-23 07:56:49
@batilc「事實證明,如果你第一次檢查你的同伴創建的遠程分支,」;是的,閱讀https://git-scm.com/docs/git-checkout,我看到:「'如果找不到',但確實存在跟蹤分支在一個遙控器(稱爲」')與一個匹配的名稱,視爲等價於'$ git checkout -b --track /'「 –
VonC
2016-12-23 08:00:21
@VonC我找到了一個更好的配置。將'branch.autoSetupMerge'設置爲'always'只需執行我們正在談論的內容。此設置默認爲「true」,這意味着只有在檢出遠程分支時才執行跟蹤。 'true'不會爲本地創建的分支設置跟蹤。 – batilc 2016-12-26 06:39:06