最近一段時間,我一直在研究一個分支上的新功能。功能完成后,我將功能分支壓縮合并回 master,并洗掉了功能分支。合并提交的哈希是 7ba3dc2fea43cd33c4d5ba11baf2765cbbdb0284。
我現在需要恢復這個合并。具體來說,我想要實作的是:
- 新功能的更改已從 master 中洗掉
- 新功能的更改位于功能分支上,隨后可以合并到主分支
一些可能相關的附加資訊:
- 在合并提交之后有一些提交要掌握,但是撤消合并是否會丟失這些提交并不重要,因為重新應用這些更改是微不足道的
- 我沒有能力直接提交給master,所以撤消合并的程序必須通過創建分支,提出PR,然后在PR獲得批準后將分支合并到master來實作。
如何將新功能的更改移回功能分支?
uj5u.com熱心網友回復:
這一次,您使用 squash 合并而不是真正的合并這一事實將使您的生活更輕松。(我假設“squash-merge”是指的--squash引數git merge,或其他 UI 中的等效功能。)
“壁球合并”實際上并沒有以任何方式參考原始提交,它只是創建一個新提交,應用他們將帶來的所有更改。因此,要撤消該提交,您可以從 master 創建一個新分支,并且使用git revert創建一個新的提交,以撤消 squash 合并提交中的所有更改。
要恢復舊分支,您需要找到洗掉它時它指向的提交哈希。如果您在 Web UI(Github / Gitlab / BitBucket)中使用了“拉取請求”或“合并請求”,它將在那里列出(甚至可能有一個“恢復分支”鏈接)。如果您在本地簽出它,它可能會在git reflog. 找到它后,只需鍵入git branch feature-foo-resurrected abc123def,將“abc123def”替換為您找到的提交哈希。
作為最后的手段,您可以基于 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
uj5u.com熱心網友回復:
您可以嘗試以下方法
恢復提交
$ 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 repo 中已更改的檔案數量,您最終會遇到一些沖突
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/414068.html
標籤:
