開始用master
和branchA
,都與每個幾個提交,branchA
被檢出(顯示爲*):
m1 - m2 - m3 <--- master
\
a1 - a2 <--- branchA*
[編輯:更新的合併結果,每個評論,表明master
不向前移動到合併提交自動]
然後合併成主branchA,示爲合併提交a2m3:
m1 - m2 - m3 <-- master
\ \
a1 - a2 - a2m3 <-- branchA*
合併的還原只是適用的變化「撤消」,它不會撤消實際的合併 - 顯示爲a2m3' :
m1 - m2 - m3 <-- master
\ \
a1 - a2 - a2m3 - a2m3' <-- branchA*
而且因爲你這樣做是恢復與branchA
仍檢出,然後branchA
引用將指向新的提交,並且master
ref仍指向m3提交。
您又添加了承諾:
m1 - m2 - m3 <-- master
\ \
a1 - a2 - a2m3 - a2m3' - a3 <-- branchA*
最後,當你簽出master
和合並在branchA
,你猜到了,這只是一個快進,其轉發master
指向同一個commit爲branchA
。這是可能的,因爲從m3到a2m3的合併鏈接仍然存在(回覆沒有移除它),所以master
被認爲是a3的父提交(對於a3有一個不間斷的鏈)並且可以快進到它。
m1 - m2 - m3
\ \
a1 - a2 - a2m3 - a2m3' - a3 <-- branchA/master*
這是你試圖合併branchA
爲master
,但得到的迴應,這是「已經更新了」的地步。
現在,之前第二合流嘗試,如果你已經簽出master
和branchA
合併前承諾至少一次,或其他人已承諾master
遙控器上的,你拉下來,然後你的分支將有再次分道揚((想想新的m4承諾爲m3的權利)。如果發生了這種情況,從branchA
到master
的合併將是一次完全合併,而不僅僅是一個快進。
如何看待分支
關於如何看待分支機構對我的突破,是分支實際上只是一個參考提交 - 和技術上,所有的父母犯下連接到它。當你合併兩個分支時,你只是創建了一個有兩個父母的提交,而不是一個,此時沒有兩個分支,有一個 - 即使是分開的一系列提交,它們以前是分開的master
和branchA
,不再分開 - 它們已經真正合並,現在兩個分支都指代它們全部。
你還能做什麼?
基於我認爲你想做什麼,你可以這樣做:
警告:有「不好的事情可能發生(TM)」,如果你推到一個遠程後更改的歷史,其他人(TM)可以訪問......但至少在這種情況下,只會重寫branchA
歷史,不master
而不是恢復的master
合併爲branchA
,只是重置branchA
到事先提交a2
:
git reset --hard <hash of a2>
復位這樣的刪除所有引用a2m3所以它實際上是從回購刪除。它仍然會在您的回購中有一段時間,但除非您將散列保存在某處,否則將無法實現。 Git跟蹤此類提交一段時間,然後垃圾收集並刪除它們,如果它們不被重用足夠長時間。
此時你會:
m1 - m2 - m3 <-- master
\
a1 - a2 <-- branchA
就像在合併之前。
你推你的分支到遠程嗎?還是僅限於本地? – 3D1T0R
@ 3D1T0R:我已經將所有內容都推送到了遠端。 – Anonymous
在https://www.atlassian.com/git/tutorials/merging-vs-rebasing的教程中,「合併選項」下似乎表明,合併到主分支會自動讓這個主點該分支,如果歷史符合某一套標準? – Anonymous