簡體   English   中英

如何合並git分支以使主題提交成為孤立的?

[英]How can I merge a git branch so that topic commits are orphaned?

我還在加速使用Git的一些更高級的功能......

鑒於以下歷史記錄,我如何清理主題分支合並,以便它們作為單個提交出現在歷史記錄中?

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

理想情況下,我想在D處使用[master]重新設置[feature],然后將[feature]合並到[master]中,讓A和B成為孤兒。

我以為我可以通過以下方式做到這一點:

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

然后清理孤立的提交

$ git gc --prune=now --aggressive

盡管如此,這仍然留下了歷史上的A和B - 我錯過了什么嗎?

如果我重新繪制圖表以將分支標記放在分支的頂端(這反映了分支的實際表示),那么您的原始情況是:

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。 有各種方法可以使reflog中的條目到期,例如:

git reflog expire --expire=now feature

...或者更安全的選項應該是將配置變量 gc.reflogexpireunreachable設置為now並使reflog過期:

git config gc.reflogexpireunreachable
git reflog expire feature

在任何一種情況下,您都需要再次運行git gc --prune=now --aggressive

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

如果你想“融合”A,B和D,你可以使用交互式rebase。

如果你的分支featuremaster之上(在你在這個分支上發布git rebase master之后它就會出現),請執行以下操作:

git rebase -i master

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

如果要將分支的效果折疊為單個提交,則從master執行:

git merge --squash feature
git commit

雖然恕我直言,能夠保持分支上的個人提交完好無損,但實際上大多數時候都是一個很好的功能。

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

為什么要刪除A和B?

git rebase master將使功能從master的尖端分支出來,當你提交時,所有來自feature的提交都將掌握。 因此你會看到A和B(實際上是A'和B')

git gc與您在歷史中看到的內容沒有任何關系。 它刪除了懸空提交(可以是A和B,但你現在擁有A'和B')

如果你想讓它們作為單個提交,請嘗試--no-commit選項或查看其他替代方案,如git rebase -i (和squash)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM