簡體   English   中英

撤消功能分支合並

[英]undo feature branch merge

最近一段時間,我一直在研究一個分支上的新功能。 功能完成后,我將功能分支壓縮合並回 master,並刪除了功能分支。 合並提交的 hash 為 7ba3dc2fea43cd33c4d5ba11baf2765cbbdb0284。

我現在需要恢復這個合並。 具體來說,我想要實現的是:

  1. 新功能的更改已從 master 中刪除
  2. 新功能的更改位於功能分支上,隨后可以合並到主分支

一些可能相關的附加信息:

  • 在合並提交之后有一些提交要掌握,但是撤消合並是否會丟失這些提交並不重要,因為重新應用這些更改是微不足道的
  • 我沒有能力直接提交給master,所以撤消合並的過程必須通過創建分支,提出PR,然后在PR獲得批准后將分支合並到master來實現。

如何將新功能的更改移回功能分支?

這一次,您使用 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.

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