仅使用git-restore<commit_hash>是行不通的。显然,必须指定-m。


当前回答

您可以按照以下步骤恢复不正确的提交或将远程分支重置回正确的HEAD/状态。

注意:此解决方案仅适用于您自己的分支,而不适用于共享的树枝

签出远程分支到本地回购。git签出您的branch_name从git日志中复制提交哈希(即错误提交前的提交id)git日志-n5

应该显示如下内容:

提交7cd42475d6f95f5896b6f02e902efab0b70e8038“合并分支“错误提交”到“your_branch_name”“提交”f9a734f8f44b0b37ccea769a2fd774c0f0c012“这是错误的提交”提交3779ab50e72908da92d2cfcd72256d7a09f444ba“这是正确的提交“

将分支重置为上一步中复制的提交哈希git reset<commit hash>(即3779ab50e72908da92d2cfcd72256d7a09f444ba)运行gitstatus以显示错误提交中的所有更改。只需运行gitreset——很难还原所有这些更改。强制将您的本地分支推到远程,并注意到您的提交历史记录与被污染之前一样干净。git push-f origin your_branch_name

其他回答

所有的答案已经涵盖了大部分内容,但我还要加上我的5美分。简而言之,恢复合并提交非常简单:

git revert -m 1 <commit-hash>

如果您有权限,可以将其直接推送到“主”分支,否则只需将其推送到“还原”分支并创建拉取请求。

您可以在此处找到有关此主题的更多有用信息:https://itcodehub.blogspot.com/2019/06/how-to-revert-merge-in-git.html

我发现在两个已知端点之间创建一个反向补丁,然后应用该补丁即可。这假设您已经创建了主分支的快照(标记),甚至是主分支的备份,比如master_bk_011012017。

假设你合并到master的代码分支是mycodebranch。

签出主机。在主服务器和备份服务器之间创建一个完整的二进制反向修补程序。gitdiff—二进制主文件。。master_bk_01017>~/myrevert.patch检查您的补丁git apply--检查myevert.patch签署后应用修补程序git am--签出<myevert.patch如果修复后需要再次引入此代码,则需要从还原的主节点分支并签出修复分支git分支分支分支修复git校验mycodebranchfix在这里,您需要找到还原的SHA密钥并还原还原git还原现在,您可以使用mycodebranch_fix来解决问题,提交并在完成后重新合并到master中。

下面是一个完整的示例:

git revert -m 1 <commit-hash> 
git push -u origin master

git还原。。。提交您的更改。

-m1表示您希望在合并之前恢复到第一个父级的树,如下面的答案所述。<commit hash>是要还原的合并的提交哈希。

git推。。。将更改推送到远程分支。

git revert -m 1 <merge-commit>

如果您想恢复合并提交,以下是您必须执行的操作。

首先,检查git日志以查找合并提交的id。您还可以找到与合并关联的多个父id(参见下图)。

记下黄色显示的合并提交id。父ID是在下一行中作为“合并:parent1 parent2”写入的ID。现在

短篇故事:

切换到进行合并的分支。然后,只需执行git-restore<mergecommit-id>-m1,它将打开vi控制台以输入提交消息。写,保存,退出,完成!

长话短说:

切换到进行合并的分支。在我的例子中,它是测试分支,我试图从中删除feature/analytics-v3分支。git-restore是还原任何提交的命令。但在恢复合并提交时有一个令人讨厌的技巧。您需要输入-m标志,否则它将失败。从这里开始,您需要决定是否要还原分支,并通过以下方式使其看起来与parent1或parent2完全相同:

git revert<merge commit id>-m 1(还原为parent2)

git revert<merge commit id>-m 2(还原为parent1)

你可以把这些父母记录下来,看看你想走哪条路,这是所有困惑的根源。