2015-02-09 172 views
11

當我處理兩個不同的功能時(在主文件夾中創建的兩個不同的分支上),我非常討厭在繼續合併時沒有提交歷史記錄。在'git合併'後保留提交歷史記錄

我會解釋得更好。當我完成Branch-A的工作時,我將它合併爲主文件。這很好,如果我git log我看到我在Branch-A上所做的所有提交。

相反,當我完成工作就科-B和我嘗試將其合併到(後科-A已被合併),我必須指定提交消息合併(而對於第一個分支我沒有被問到任何東西)。 併合併到後,如果我輸入git log,我無法看到科-B的提交我分支的歷史

比方說,我有

**Branch A** 

commit 09b2unfas9d781n2e 
    Add more stuff 

commit 8uj8masd89jas898a 
    Add stuff 

**Branch B** 

commit 09b2unfas9d781n2e 
    Add feature setting 

commit 8uj8masd89jas898a 
    Add feature 

我完成有

**Master** 

commit 6hf6h8hd871udjkdn 
Merge: 09b2un 34osd6 
    Merge branch 'Branch-B' into master 

commit 09b2unfas9d781n2e 
    Add more stuff 

commit 8uj8masd89jas898a 
    Add stuff 

commit 34osd62dhc91123j8 
    I'm a previous commit from 'master'. 
    The last one before branching... 

我想鄰保留類似於:

**Master** 

commit 09b2unfas9d781n2e 
    Add feature setting 

commit 8uj8masd89jas898a 
    Add feature 

commit 09b2unfas9d781n2e 
    Add more stuff 

commit 8uj8masd89jas898a 
    Add stuff 

commit 34osd62dhc91123j8 
    I'm a previous commit from 'master'. 
    The last one before branching... 

......這將更準確地反映所執行的提交的歷史記錄。

我不明白爲什麼我可以保留兩個分支之一的歷史。

我怎樣才能保持一切清除沒有這些合併提交隱藏/省略了合併提交的真實歷史?

回答

0

使用rebase而不是merge。從tutorial

如果檢查衍合分支的日誌,它看起來像一個線性 歷史:似乎所有的工作發生在系列中,即使它最初 發生在平行。

我想,從您的Branch-B的變化不能用快進合併到master合併。在這種情況下,three-way-merge完成:

而不是僅僅移動分支指針向前,Git會創建一個新的 快照,從這個三方合併的結果,並自動 創建一個新的承諾,它指向它。這被稱爲合併 提交,並且是特殊的,它有多個父代。

我會在將它們提交到master以保持線性歷史記錄之前始終將我的提交重新綁定。

11

看起來第一次合併是快進,第二次合併是三次合併。

說明

Git有合併的兩個版本:快進和三通。 (還有其他版本,但這不是發生在這裏的情況。)默認行爲是在可能的情況下執行快進合併,否則執行三向合併。

當正在合併的提交的當前位置爲當前位置時,可以進行快進合併(可以使用選項--ff-only強制此行爲,這會導致合併在無法快進時失敗)它的歷史分支。例如:

A - B - C - D <-master 
      \ 
       E - F - G <- branch-a 

Excecuting git merge(默認設置),將導致

A - B - C - D - E - F - G <- branch-a <-master 

你也不會得到一個機會來編輯合併提交,因爲是沒有的。然而,一旦發生這種情況,您的另一支將主發散(不只是提前):

A - B - C - D - E - F - G <-master 
        \ 
        E1 - E2 <- branch-b 

因此,GIT中不能只移動主的指針從GE2,因爲這將擺脫的變化是在FG中製成。相反,會發生三方合併,這會創建一個具有兩個父代的提交,並且還具有提交消息。現在,主人可以移動到此提交。 (請注意,在這種情況下,主機和支路B切勿指向同犯。

A - B - C - D - E - F - G - H <-master 
        \  /
        E1 - E2 <- branch-b 

如果你想有那麼一個線性的歷史,你需要使用底墊中,但事先警告,如果任何人有看到你的分支提交,這可能會導致超出這個答案範圍的問題,使用rebase將涉及到兩個步驟,重新綁定和快速合併,所以,而不是合併你在分支-bgit rebase master。這創建了新的提交,它們是舊提交的副本,即相同的變更集,作者信息和消息,但新提交者信息和父歷史記錄(我將圖中的提交E1'和E2'稱爲表明他們只是副本。)T他老的提交會一直存在,直到他們是垃圾回收,但除非你看看引用日誌將是不可到達的。)

A - B - C - D - E - F - G <-master 
        \  \ 
        E1 - E2 \ 
          E1' - E2' <- branch-b 

執行git checkout master; git merge --ff-only branch-b現在快進你變成主人,從而給你一個線性的歷史。

A - B - C - D - E - F - G - E1' -E2' <-master <- branch-b 
+0

我需要將'master'合併到'branch-b',當我在兩者中都有變化時。我如何重寫'branch-b'就像從'G'開始,而不是'E'?但保留'branch-b'的提交歷史並將更改提交到'branch-b'是衝突。假設我只有一個知道'branch-b'的人。 – hlcs 2017-03-17 20:51:18

+0

Nvm它確切'git rebase master'。 – hlcs 2017-03-17 21:28:12

相關問題