我在这里遇到了一些问题:我28s
在 Git 中有一个特定于问题的分支,我将它合并到了一般develop
分支中。原来我做得太快了,所以我使用 git-revert 撤消合并。然而,现在是合并28s
到的时候了develop
,但是 git-merge 命令看到了原来的合并,并高兴地宣布一切都很好,分支已经合并了。现在我该怎么做?创建一个'Revert "Revert "28s -> develop""' 提交?似乎不是一个好方法,但我现在无法想象其他任何方法。
树结构是什么样子的:
我在这里遇到了一些问题:我28s
在 Git 中有一个特定于问题的分支,我将它合并到了一般develop
分支中。原来我做得太快了,所以我使用 git-revert 撤消合并。然而,现在是合并28s
到的时候了develop
,但是 git-merge 命令看到了原来的合并,并高兴地宣布一切都很好,分支已经合并了。现在我该怎么做?创建一个'Revert "Revert "28s -> develop""' 提交?似乎不是一个好方法,但我现在无法想象其他任何方法。
树结构是什么样子的:
您必须“还原还原”。取决于您如何还原原始版本,它可能不像听起来那么容易。查看有关此主题的官方文档。
---o---o---o---M---x---x---W---x---Y
/
---A---B-------------------C---D
允许:
---o---o---o---M---x---x-------x-------*
/ /
---A---B-------------------C---D
但这一切都有效吗?当然可以。您可以恢复合并,从纯粹的技术角度来看,git 非常自然地做到了,没有真正的麻烦。
它只是认为这是从“合并前的状态”到“合并后的状态”的变化,就是这样。
没有什么复杂的,没有什么奇怪的,没有什么真正危险的。Git 会不假思索地做到这一点。因此,从技术角度来看,恢复合并并没有什么问题,但从工作流程的角度来看,这是您通常应该尽量避免的事情。
如果可能的话,例如,如果您发现合并到主树中的问题,而不是恢复合并,请非常努力地尝试:
- 将问题一分为二到你合并的分支中,然后修复它,
- 或尝试恢复导致它的单个提交。
是的,它更复杂,不,它并不总是有效(有时答案是:“哎呀,我真的不应该合并它,因为它还没有准备好,我真的需要撤消所有合并”)。那么你真的应该恢复合并,但是当你想重新进行合并时,你现在需要通过恢复恢复来做到这一点。
假设你有这样的历史
---o---o---o---M---W---x-------x-------*
/
---A---B
其中 A、B 提交失败并且 W - 是 M 的恢复
所以在我开始修复发现的问题之前,我会挑选 W 提交到我的分支
git cherry-pick -x W
然后我在我的分支上恢复 W 提交
git revert W
之后我可以继续修复。
最终的历史可能如下所示:
---o---o---o---M---W---x-------x-------*
/ /
---A---B---W---W`----------C---D
当我发送 PR 时,它会清楚地显示 PR 是 undo revert 并添加一些新的提交。
要在不过多破坏您的工作流程的情况下还原还原:
当您准备好时,您的功能分支现在应该可以正常合并了。这里唯一的缺点是您的历史记录中会有一些额外的合并/恢复提交。
要在 GIT 中恢复恢复:
git revert <commit-hash-of-previous-revert>
git-revert
您可以在devel
分支中使用此命令而不是使用此命令来丢弃(撤消)错误的合并提交(而不仅仅是恢复它)。
git checkout devel
git reset --hard COMMIT_BEFORE_WRONG_MERGE
这也将相应地调整工作目录的内容。小心:
git-reset
. 在您指定为参数的提交之后的所有提交git reset
都将消失!我建议git-reset
在尝试之前仔细研究手册页。
现在,重置后您可以重新应用您的更改devel
,然后执行
git checkout devel
git merge 28s
这将是一个真正的合并,28s
就像devel
最初的那样(现在从 git 的历史中删除)。
我建议您按照以下步骤还原还原,例如 SHA1。
git checkout develop #go to develop branch
git pull #get the latest from remote/develop branch
git branch users/yourname/revertOfSHA1 #having HEAD referring to develop
git checkout users/yourname/revertOfSHA1 #checkout the newly created branch
git log --oneline --graph --decorate #find the SHA of the revert in the history, say SHA1
git revert SHA1
git push --set-upstream origin users/yourname/revertOfSHA1 #push the changes to remote
现在为分支创建 PRusers/yourname/revertOfSHA1
此时,您将拥有一个干净的“开发”分支,您可以像往常一样将功能分支合并到该分支。
我刚刚在遇到同样的问题时发现了这篇文章。我发现上面的方式让我害怕做重置困难等。我最终会删除一些我不想删除的东西,并且无法取回它。
相反,我检查了我希望分支回到 eg 的提交git checkout 123466t7632723
。然后转换为一个分支git checkout my-new-branch
。然后我删除了我不再想要的分支。当然,这只有在你能够扔掉你搞砸的分支时才有效。