爲了:
不第三行,git rebase master somechanges
,把後終於從chgs
承諾從master
,但沒有將它們合併犯...
是,假設somechanges
是chgs
的錯字(參考頁面使用更多拼寫)。
和葉HEAD
指向最新從chgs
是承諾,但只是間接的:HEAD
字面上包含ref: refs/heads/chgs
,即,如果只剩下分支chgs
簽出。這是chgs
本身,指向最新的提交。
這是否使我離開chgs
簽出?
是的。
具體來說,「當前分支」,在一個打印爲on branch ...
當您使用git status
,只是無論refs/heads/branch
是文件HEAD
中,當HEAD
包含refs: refs/heads/branch
。首先運行git checkout branch
確保可以更新工作樹,然後通過重寫HEAD
來完成此操作並將其置於該分支上。
在內部,git rebase upstream branch
調用git checkout branch
,所以整個過程開始讓你在分支上。
爲什麼我們需要將更改合併到主?這不是像[剪輯]一樣的圖表嗎?
你需要的merge
移動的標籤。
我更喜歡用字母或有時候只是一點一點地繪製提交圖表,用它們之間的單個破折號或短箭頭表示父母關係。並且,從git log --graph --oneline --decorate
中偷取(但修改)一片葉子,我用更長的箭頭在右側添加分支名稱。如果HEAD
命名分支,我在前面添加HEAD=
。
你有什麼之後作爲底墊由此可以得出:
... - E - F <-- master
\
G - H - I <-- HEAD=chgs
這裏提交標記F
是分支master
的頂端,所以master
點F
(和F
點回E
等上)。分支chgs
的提示是提交I
; I
積分返回H
; H
積分返回G
;並且G
指向F
。當然HEAD=chgs
所以你在那個分支。
一旦你git checkout master
,像往常一樣更新你的工作樹,並使HEAD
指向master
指向F
。然後,如果你運行git merge chgs
,Git會查找,看是否有可能做一個「快進」合併:
... - E - F <-- HEAD=master
\
G - H - I <-- chgs
一個快進合併有可能在當前提交(F
,在這種情況下)已經是一個祖先的目標提交(I
)。如果是這樣,分支標籤揭下當前提交和簡單粘貼到目標承諾:
... - E - F
\
G - H - I <-- chgs, HEAD=master
(現在,已經沒有任何ASCII藝術-理由將扭結在繪圖[從F
下和但是我保持它的視覺對稱。)
作爲Cupcake noted in his faster answer,您可以強制與--no-ff
真正合並。我會得出這樣的:
... - E - F ------------- M <-- HEAD=master
\ /
G - H - I <-- chgs
在這兩種情況下(快進,或「真正合並」),一旦做到這一點,你可以安全地刪除分支標籤chgs
,其所有提交的被發現可以從master
開始並向後工作(如果是「真正的合併」,則沿着兩個分支)。或者,如果您願意,您可以保留它並添加更多提交。
這裏一個有趣的注意的是,在這種特殊情況下與相關的產生工作樹提交M
是完全一樣的一個提交I
。關鍵的區別是,這會創建一個實際的合併提交(與多個父代一起提交)。第一個父節點是之前在分支上的任何提交 - 在這種情況下,提交F
- 並且剩餘的提交(這裏是一個提交I
)是要合併的分支。(你可以覆蓋這個 - 工作樹是相同的,我的意思是 - 有更多的合併標誌,但在這種情況下,你不會想要這樣的事情,重寫工作樹,主要是意味着「殺死」的一個分支,同時保留了歷史:排序的「看,我們嘗試這樣做,也沒有工作」的消息給某人明年看代碼)
。或者不需要,如果你不想移動標籤。但是,如果您打算將push
工作返回給某人,或者讓他們從您那裏獲得,他們會查看您的標籤。如果你爲他們安排好標籤,這對他們很好。但這總是取決於你。