簡體   English   中英

將合並提交重寫為壁球合並提交

[英]Rewrite a merge commit into a squash merge commit

我合並了一個長期存在的分支,由於沖突解決,我花了一些時間來完成合並。

我發現我無法使用git-svn發布我的工作: git svn rebase將重新設定合並分支的所有提交,而不是提交一個單一的合並提交。 我發現git merge --squash有點晚了......

是否可以在不丟失所有已完成的沖突解決工作的情況下將合並提交(rebase 交互?)更改為“壓縮合並”提交(即,由於我沒有啟用rerere工具,因此不會觸發新的合並)?

如果您已合並並使用git merge ( --no-ff ) 並希望將其轉換為git merge --squash的等效git merge --squash ,則可以使用以下過程(假設合並提交是分支上的最新提交) ):

  • 確保您已檢出受影響的分支。
  • git reset --hard HEAD~1 (在合並之前將分支重置為提交。別擔心,它沒有丟失!)
  • git cherry-pick -m 1 HEAD@{1} (櫻桃挑選你剛剛刪除的合並提交作為正常提交,基於它和這個分支之間的差異)

除了保留在合並期間完成的任何沖突解決之外,它還將保留原始合並提交信息(消息、作者、日期等),這對於修復來自 BitBucket 等生成一致提交消息的工具的錯誤合並非常有用。

我們有一個只提交壁球的策略,所以當有人不小心從 BitBucket PR 中選擇了正常的合並選項時,我最終會偶爾使用它。 或者單擊 Slack BitBucket 機器人上令人沮喪的“合並”按鈕,該按鈕不會為您提供合並策略的選擇...

也許git rebase --preserve-merges適合你。

這是執行此操作時發生的情況的詳細答案:

git 的“rebase --preserve-merges”究竟做了什么(為什么?)

請原諒我不喜歡從那里復制和粘貼。

我遇到了類似的問題,並且能夠通過簡單地重置和重新提交更改來創建壓縮提交。

起始布局:

*   06074985 (HEAD -> test1) Merge branch 'test2' into test1
|\
| * eb2aa088 (test2) test2 commit
* | c83180c8 test1 commit
|/
* b6628265 (master) base commit

git 命令: git branch temp (所以我不會丟失合並提交) git reset HEAD~1 git add 。 git commit -m "Squash commit" git diff temp (只是為了確保沒有任何改變)

結局布局:

* 5e229615 (HEAD -> test1) squash commit
| *   06074985 (temp) Merge branch 'test2' into test1
| |\
|/ /
| * eb2aa088 (test2) test2 commit
* | c83180c8 test1 commit
|/
* b6628265 (master) base commit

暫無
暫無

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

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