2013-03-29 97 views
2

我想請教一下Git的合併在以下情形:的Git:維護分支拓撲結構上的合併提交

branchA -*-*-*-*-* 
        \ 
      branchB *-*-*-* 

這是可以做到一個git在這種情況下的合併取得以下結果?

branchA -*-*-*-*-*---------* 
        \  /
      branchB *-*-*-* 

我想獲得的是在branchA上有一個合併提交,它包含了branchB的所有更改。 我知道在git merge命令中有--squash選項,但我不確定這是否與標準合併100%相同。

因此,讓我來阻止我的分支拓撲和不是只是一個快速發展。

非常感謝您的幫助!

+0

你爲什麼想這麼做?你想達到什麼目的? –

+0

我的動機如下:假設branchA是一種主線分支,而branchB是一個開發分支。 branchB上的某些提交可能不會編譯/傳遞測試套件,但最終branchB已準備好進入主線。我想主線上有一個提交,因爲它代表完成的工作,同時我可以看到branchB上的歷史記錄(以防需要時)。 – Tomek

回答

3

嘗試git merge branchb --no-ff(來自brancha)。從git-merge(1)

--no-FF

創建一個合併提交即使合併解決的快進。

它可以防止快進,即使混帳認識到當前HEAD(分支A,因爲這是在那裏你會被合併的形式),也不過是犯分支B的祖先,而沒有采取任何改變在分支A上並行放置。

+1

這正是我正在尋找的 - 非常感謝您的幫助! – Tomek

1

不,您不能生成一個真正的合併提交,其中合併了來自分支的所有更改。 git merge --squash會生成一個提交的更改,但它不會是合併提交。

Git在給定時間提交記錄倉庫的完整狀態,而不是來自先前提交的更改。因此,當您稍後在創建提交時檢查歷史記錄時,會生成差異。

但是,如果使用git commit --no-ff branchB創建合併,將確保創建提交,即使可以在不創建新提交的情況下執行快進合併。然後,如果使用git log -m --first-parent,它將忽略在branchB上進行的提交,看起來所有這些更改都是由該合併提交引入的,並且-m選項會導致爲合併提交顯示完全差異(如果差異爲否則會被顯示)。

+0

謝謝你的回覆!我試過git合併branchB --no-ff,那正是我在找的東西。再次感謝。 – Tomek