2017-02-28 41 views
2

如果當前提交是合併提交,爲什麼git rebase -i HEAD~~不包含它可以修改的提交?爲什麼rebase不允許修改合併提交?

rebase的文檔在哪裏說合並提交不能修改?

這裏有一個簡單的設置,顯示我的意思:

git init test_git 
cd test_git 
touch a 
git add a 
git commit -m "added a" 
git branch feature 
git checkout feature 
echo "version 1" >a 
git commit -a -m "version 1" 
git checkout master 
echo "version 2" >a 
git commit -a -m "version 2" 
git merge feature 
echo "version 3" >a 
git commit -a -m "resolved merge" 
git rebase -i HEAD~~ 

在這一點上,我得到這個消息的文本編輯器:

pick 6746909 version 2 
pick 830dbd0 version 1 

# Rebase 3848032..d7c0f38 onto 3848032 

電流(合併)提交是d7c0f38,甚至在評論中也提到它。但它不是我實際上選擇/編輯/壓扁/等等的提交。

回答

4

因爲git rebase默認情況下不保留合併。這可以用--preserve-merges但該文檔狀態下被關閉......

它使用--interactive機器內部,但它與--interactive選項結合明確一般不是一個好主意,除非你知道你正在做(見下面的BUGS)。

之所以爲git rebase是因爲真的重播了您在另一個提交之上的提交,所以合併被淘汰。爲了說明原因,我已經複製了你的回購。

$ git log --oneline --graph --decorate 
* 5eb2e82 (HEAD -> master) resolved merge 
|\ 
| * 42cfeab (feature) version 1 
* | d6a71b8 version 2 
|/ 
* 267627b added a 

當我運行git rebase -i HEAD~~我看到這一點:

pick d6a71b8 version 2 
pick 42cfeab version 1 

# Rebase 267627b..5eb2e82 onto 267627b (2 commands) 

需要注意的是最後一點, 「到267627b」,這是 「增加了」 提交。這兩個提交,「版本1」和「版本2」將在「添加a」之上進行修補。結果將是線性的,不需要合併。

由於分支,甚至有衝突必須解決。這兩個提交都改變了「添加一個」的同一行,所以不管他們做了什麼順序,他們都會發生衝突。

解決衝突,結果如下。

* d6a71b8 (HEAD -> master) version 2 
* 267627b added a 

「版本1」的變化在哪裏?解決衝突意味着「版本1」不再有任何改變,所以rebase刪除了空的提交。它這樣做是爲了避免重新引入可能已經合併的提交。您可以用--keep-empty來關閉此行爲,儘管沒有什麼理由。


如果你想保留的合併,有什麼我建議是先對主上衍合你的功能分支,然後合併並強制合併。假設你有這個。

A - B - C - G - H [master] 
     \ 
      D - E - F [feature] 

首先,將底座特徵放到底座上。

git checkout feature 
git rebase master 

A - B - C - G - H [master] 
       \ 
        D1 - E1 - F1 [feature] 

這將導致一個線性的歷史,功能現在是大師的頂部,任何衝突都必須解決,功能可與主所有的更新進行測試。

一旦功能已經過測試,它可以與主合併。由於沒有新的變化,通常情況下合併會快速前進,導致這一點。

A - B - C - G - H - D1 - E1 - F1 [feature] 
           [master] 

現在很難看到作爲功能的一部分進行了哪些更改,這些功能是未來調試的重要環境。相反,我們希望保證與--no-ff合併提交。

git checkout master 
git merge --no-ff feature 

的結果是這樣的:

A - B - C - G - H ------------ I [master] 
       \   /
        D1 - E1 - F1 [feature] 

歷史是線性的,而且它也明確了做什麼提交在一起作爲一個分支,這次合併提交可以用來解釋分支。

這是我正常合併功能分支的過程。

+0

每當我覺得我理解了基本的git,我發現還有另一個我不知道的超級重要的東西。 – max

+1

@max這個界面讓Git看起來好像有103,487個事情,但Git真的只做了大約4件事情。如果您瞭解圖表(如何連接提交),對象ID,標籤(分支和標籤)以及分段區域如何工作,則突然有意義。 – Schwern

相關問題