[英]undo feature branch merge
最近一段時間,我一直在研究一個分支上的新功能。 功能完成后,我將功能分支壓縮合並回 master,並刪除了功能分支。 合並提交的 hash 為 7ba3dc2fea43cd33c4d5ba11baf2765cbbdb0284。
我現在需要恢復這個合並。 具體來說,我想要實現的是:
一些可能相關的附加信息:
如何將新功能的更改移回功能分支?
這一次,您使用 squash 合並而不是真正的合並這一事實將使您的生活更輕松。 (我假設“squash-merge”是指git merge
的--squash
參數,或其他 UI 中的等效功能。)
“壁球合並”實際上並沒有以任何方式引用原始提交,它只是創建一個新提交,應用他們將帶來的所有更改。因此,要撤消該提交,您可以從 master 創建一個新分支,並且使用git revert創建一個新的提交,撤消來自壁球合並提交的所有更改。
要恢復舊分支,您需要找到刪除它時它指向的提交 hash。 如果您在 web UI(Github / Gitlab / BitBucket)中使用了“拉取請求”或“合並請求”,它將在此處列出(甚至可能有“恢復分支”鏈接)。 如果您在本地檢查它,它可能會在git reflog
中可見。 找到它后,只需鍵入git branch feature-foo-resurrected abc123def
,將“abc123def”替換為您找到的提交 hash。
作為最后的手段,您可以基於 squash 提交創建一個分支,方法是使用git cherry-pick創建一個具有相同內容的新提交。 (僅將分支指向該提交將無濟於事,因為這已經在“master”的歷史記錄中,因此將顯示為“nothing to merge”。)
所以整個序列可能看起來像:
git switch master
git pull --ff-only origin
# create a branch which undoes the squash merge
git switch -c revert-feature-foo
git revert 7ba3dc2fea
git push origin
# now create a branch which *redoes* the squash merge on top of that
# only needed if you can't find the original feature branch
git switch -c feature-foo-resurrected
git cherry-pick 7ba3dc2fea
git push origin
您可以嘗試以下方法
恢復提交
$ git revert --no-commit '<commitnumber>'
# Files that were modified in the commit will be changed in your working directory
$ git commit -a -m "Revert commit <commit number>"
創建一個功能分支和櫻桃選擇提交
$ git checkout -b 'Feature Branch name'
$ git cherry-pick '<commitnumber>'
$ git commit
大多數情況下,基於后續提交中 git 存儲庫中已更改的文件數量,您最終會遇到一些沖突
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.