由於合併Git的工作方式,這是正常的行爲。
在Git中,合併與其他任何提交一樣,它只有兩個(或更多)父項。它包含合併內容所需的更改。當您將一個分支合併到另一個時,源分支不會更改。所以當dev被合併爲prod時,只有prod會改變。
下面是一個視覺示例。假設dev在第3次提交時分支產品。prod現在是第7次提交,dev是E.檢出。
1 -- 2 -- 3 -- 4 -- 5 -- 6 -- 7 [prod] [HEAD]
\
A -- B -- C -- D -- E [dev]
當dev與命令git merge dev
合併爲prod時,這就是結果。
1 -- 2 -- 3 -- 4 -- 5 -- 6 -- 7 -- 8 [prod] [HEAD]
\ /
A -- B -- C -- D -- E [dev]
在新的合併結果提交父母均爲7和E.它包含了所有必要的修改,以把它們合併起來。 prod被推進到這個新的提交。 dev仍然在E.
這就是爲什麼prod總是會在合併之後領先dev的原因。例外是「快進」。假設發生這種情況。
1 -- 2 -- 3 -- 4 [prod] [HEAD]
\
A -- B -- C [dev]
dev在產品4處分支出去。已經完成了關於dev但不是產品的工作。 prod被檢出。當git merge dev
完成後,git會識別出不需要合併,並執行「快進」。
1 -- 2 -- 3 -- 4
\
A -- B -- C [dev] [prod] [HEAD]
prod被推進到C,dev是同一個地方。您可以使用git merge --no-ff
替代「沒有快進」的行爲。這被推薦用於特性分支,其中保留了一組提交都是一個內聚特性的一部分的事實是重要的,但如果你只是讓生產分支趕上開發,那麼這是不必要的。
事實上,你的合併不是快進表明提交直接提交到產品,在我們的例子中是提交4 - 7。在許多工作流程中,這不應該發生,提交只應該開發,然後合併爲產品。你應該調查一下,可能會有變化,但不在開發中。有人可能熱補丁產品。
解決這種情況的最簡單方法是將dev合併爲prod,然後立即刪除dev並將其再次關閉prod。別擔心,分支歷史將被保留。
1 -- 2 -- 3 -- 4 -- 5 -- 6 -- 7 -- 8 [prod] [dev] [HEAD]
\ /
A -- B -- C -- D -- E
git branch -d dev
將阻止您刪除尚未完全合併的分支。例如,如果存儲庫這個樣子......
1 -- 2 -- 3 -- 4 -- 5 -- 6 -- 7 -- 8 [prod] [HEAD]
\ /
A -- B -- C -- D -- E -- F -- G [dev]
你跑git branch -d dev
,混帳將拒絕刪除該分支。 不要使用-D或-f強制它否則你將失去開發工作。只需將dev合併到prod中,然後再試一次。
還有其他方法可以處理這種情況,但這是最簡單的。之後,你的提交應該快進。
'git log --oneline --left-right dev ... prd'的輸出是什麼? (提示:它應該爲您提供一個分支上的所有提交列表,但不包括另一個分支上的提交列表)。 – 2014-12-10 23:59:00