2012-01-13 105 views
3

我仍然想加快與Git的一些更高級的功能...如何合併git分支以使主題提交爲孤立?

鑑於以下歷史,我如何清理主題分支合併,使他們出現在歷史作爲一個單一的提交?

[master] - - - - - - - C - - - 
    \ 
    [feature] - A - - B - - D - 

理想情況下,我想變基[特徵]與[主]在d然後合併[特徵​​]到[主],留下A和B孤。

我想我可以簡單地這樣做:

$ git rebase master # on feature branch 
$ git co master 
$ git merge --no-ff feature 

,然後清理孤立提交與

$ git gc --prune=now --aggressive 

這仍然留下A和B在歷史上雖然 - 我缺少的東西?

回答

1

如果你想「融合」A,B和D,你可以使用交互式底座。

如果你的分支feature是對master(這將是你在這個分支發出git rebase master後)頂部,這樣做:

git rebase -i master 

然後,將在編輯器中打開該文件,替換與squash提交A和B pick。然後Git將A和B壓縮到D中,編輯器會彈出所有壓縮提交的提交消息。

+0

這就是我正在尋找的 - 謝謝! – bodacious 2012-01-13 13:43:51

0

爲什麼要刪除A和B?

git rebase master將使功能從主控端分支,並且當您提交時,所有來自功能的提交都會發送到主控端。因此,您將看到A和B(實際上是A'和B')

git gc與您在歷史中看到的內容沒有任何關係。它消除了懸掛的提交(可以是A和B,但你有一個「和B」在主現在)

如果你要他們來爲單一提交,請嘗試--no-commit選項,或尋求其他替代喜歡git rebase -i(和壁球)

3

如果我重新繪製你的圖來放置分支標記在分支的末端(反映分支機構的實際表現)你原來的情況是:

o --- C (master) 
\ 
    --- A --- B --- D (feature) 

與基礎重建,並與--no-ff合併爲你以後形容,你現在有:

o --- C ------------------ M (master) 
\  \    /
    \  A' --- B' --- D' (feature) 
    \ 
    --- A --- B --- D 

據我瞭解,你現在要確保ABD從你的資料庫中消失。首先,我會說我強烈建議你不要擔心這些提交。

但是,如果你真的想擺脫他們,那麼你將不得不確保他們真正無法到達,否則git gc --prune=now --aggressive將不會刪除它們。事實上,它們仍然會被指向(至少)feature的推薦日誌。有多種方式從reflog中刪除條目,例如搭配:

git reflog expire --expire=now feature 

...或更安全的選擇應該是設置the config variablegc.reflogexpireunreachablenow和過期引用日誌:

git config gc.reflogexpireunreachable 
git reflog expire feature 

在這兩種情況下,你會再需要事後再次運行git gc --prune=now --aggressive

但是,爲了重申我上面所說的,我不會這麼做 - 這些提交併不會傷害任何人,而使用git時reflog是一個有價值的安全網。

+0

感謝您的建議和解釋 – bodacious 2012-01-13 13:43:39

1

如果你想摺疊分支的影響到一個單一的提交,然後從主做:

git merge --squash feature 
git commit 

但恕我直言,能夠保持個人的分支完整的承諾實際上是一個很好的功能最的時間。

或者,您可以在分支上使用git rebase -i,並告訴它將所有提交壓縮到一起,然後將壓扁的結果合併到主設備上。

+0

請刪除您的答案之一。他們是相同的! – 2012-01-13 11:36:18

+0

oops,編輯以某種方式被保存爲新的答案。 – araqnid 2012-01-13 12:51:46