2012-04-08 212 views
2

如果我做一個git push,我會看到3個分支。 1)我正在工作的本地分支,說'foo1'2)本地遠程跟蹤分支'origin/foo2'(它總是與push/pull後的遠程foo3相同)3)'foo3'in遠程回購。通常他們都會被稱爲foo,但是我想要不同的名字,所以我可以正確理解git並在這裏提出這個問題。我不明白我可以在哪裏指定foo2。當我做在git push中指定'origin/master'部分

git push origin foo1:foo3 

而且具有在我的.git/config中

[branch "master"] 
remote = origin 
merge = refs/remotes/origin/foo2 

點1和3是不錯,但我沒有在我的本地回購原點/ foo2的。我錯過了什麼?或者是我的遠程跟蹤分支的答案是總是命名方式與遙控器完全相同 - 這對我來說很好 - 我只是想正確理解git。

在我的例子中,git-push手冊也只談到了兩個refs(refspec src和dst),點1和3。在遠程回購的dst分支更新後,手冊在哪裏討論這個問題,本地遠程跟蹤參考是否更新?

+0

@ VonC的答案是正確的(當然:-))。我懷疑這裏的根本問題在於,你在「push」和「pull」之間的明顯對稱性上絆倒了。這是一種錯誤的對稱。 'push'的反義詞不是'pull',而是'fetch'。 (即使它們不是完全對稱的。)記住這一點,一切都應該更有意義。 – torek 2012-04-08 21:25:13

回答

1

你在git push上看不到三個分支。只有兩個

foo2你所描述爲GIT中拉(GIT取+ GIT中合併)或git rebase
(從git config

branch.<name>.merge 

定義,連同branch.<name>.remote,對於上游分支給定的分支。
它告訴git fetch/git pull/git rebase哪個分支要合併,並且還會影響git push(請參閱push.default)。
在分支<name>中,它告訴git在FETCH_HEAD中獲取要標記爲合併的默認refspec。該值的處理類似於refspec的遠程部分,並且必須匹配從「branch.<name>.remote」給出的來自遠程的獲取的ref。

合併信息由git pull(最初呼叫git fetch)使用來查找用於合併的默認分支。
沒有這個選項,git pull默認合併第一個獲取的refspec。
指定多個值以獲得章魚合併。

注意,與 git1.7.10,默認推送策略可能會改變到matchingupstream(見「What is the result of git push origin?」),這意味着,branch.<name>.merge限定上游分支(在沒有branch.<name>.remote) ,那麼它可以默認用於git push

0

你說得對,遠程追蹤分支與遠程回購分支具有相同的名稱。否則會有些混亂!

因此,origin/foo3只是代表分支foo3在遠程origin。在運行git fetch後,它將與遙控器正確同步。請注意,在運行git pull時,您實際上正在運行git fetch ; git merge

當運行git push origin foo1:foo3時,您將本地分支foo1推送到遠程分支origin/foo3。所以在你的情況下,指定分支foo2是沒有意義的。

+0

看,我可以做'git checkout -b foo1; git pull origin foo3:remotes/origin/foo2'。所以在拉場景中,我現在正好是我的問題中描述的3個分支。這裏可能要對3個分支中的每一個進行特定。所有三個_can_都有不同的名稱,即使它可能沒有意義。但反過來,只能影響foo1和foo3('git push origin foo1:foo3'),但不再是foo2,這完全讓我困惑;我不明白這種不對稱性。我相信我錯過了一些東西。 – 2012-04-08 20:27:02