单独使用git revert
无效。 -m
必须被指定,对此我感到很困惑。
有人经历过吗?
这是一个完整的示例,希望对您有所帮助:
git revert -m 1
git commit -m "Reverting the last commit which messed the repo."
git push -u origin master
其中
是您要还原的合并的提交哈希,如该答案的说明所述, -m 1
表示您想还原到第一个父级的树。合并。
git commit ...
行实质上是提交您的更改,而第三行则通过将更改推送到远程分支来公开更改。
有时,最有效的回滚方法是退回并替换。
git log
使用第二次提交哈希(完整哈希,要在列出错误之前将其还原回的哈希),然后从那里重新分支。
git checkout -b newbranch
然后删除旧分支,将新分支复制到其位置,然后从那里重新启动。
git branch -D oldbranch
git checkout -b oldbranch newbranch
如果已广播,则从所有存储库中删除旧分支,将重做分支推到最中央,然后再拉回所有分支。
您可以按照以下步骤还原不正确的提交或将远程分支重置回正确的HEAD /状态。
git checkout development
从git log git log -n5
复制提交哈希(即紧接错误提交之前的提交ID)
输出:
提交7cd42475d6f95f5896b6f02e902efab0b70e8038“将分支“错误提交”合并到“开发”中”
提交f9a734f8f44b0b37ccea769b9a2fd774c0f0c012“这是错误的提交”
提交3779ab50e72908da92d2cfcd72256d7a09f446ba“这是正确的提交”
将分支重置为上一步中复制的提交哈希 git reset
git status
以显示属于错误提交的所有更改。 git reset --hard
即可还原所有这些更改。 git push -f origin development
我发现在两个已知的端点之间创建一个反向补丁,然后应用该补丁即可。 假设您已经从master分支甚至是master分支的备份(master_bk_01012017)创建了快照(标签)。
假设您合并到master中的代码分支是mycodebranch。
git diff --binary master..master_bk_01012017 > ~/myrevert.patch
git apply --check myrevert.patch
git am --signoff < myrevert.patch
git branch mycodebranch_fix
git checkout mycodebranch_fix
git revert [SHA]
如Ryan所述, git revert
可能会使合并变得很困难,因此git revert
可能不是您想要的。 我发现使用git reset --hard
命令在这里更有用。
一旦完成了硬重置部分,就可以强制推送到远程分支,即git push -f
,其中
通常被命名为origin
。 从那时起,您可以根据需要重新合并。
git revert -m 1
为了使日志保持干净无事(这种方法有一些缺点(由于推-f)):
git checkout
git reset --hard
git push -f origin HEAD:
“ commit-hash-before-merge”来自合并后的日志(git日志)。
正确标记的答案对我有用,但是我不得不花一些时间来确定发生了什么。.因此,我决定为简单的简单步骤添加答案,例如我的情况。
假设我们得到了分支A和B。您将分支A合并到分支B中,并将分支B推到自身,所以现在合并是它的一部分。。但是您想回到合并之前的最后一次提交。你做?
git log
您将看到最近提交的历史记录-提交具有commit / author / date属性,而合并也具有merge属性-因此您将看到如下所示:
commit:
使用git log
和git log
-您将看到那些父分支的提交历史-列表中的第一个提交是最新的
,转到git根文件夹,然后使用git checkout -b
-这将从您在合并前选择的最后一个提交开始创建一个新分支。瞧,准备好了! 有关git revert -m的git doc提供了一个确切解释此链接的链接: https : //github.com/git/git/blob/master/Documentation/howto/revert-a-faulty-merge.txt
所有的答案已经涵盖了大部分内容,但是我会加5美分。 简而言之,尊敬合并提交非常简单:
git revert -m 1
如果您有权限,则可以将其直接推送到“ master”分支,否则只需将其推送到“ revert”分支并创建拉取请求。
您可能会在这里找到关于此主题的更多有用信息: https : //itcodehub.blogspot.com/2019/06/how-to-revert-merge-in-git.html
如果要还原merge
提交,这是您必须要做的。
git log
以找到您的合并提交的ID。 您还将找到与合并关联的多个父ID(请参见下图)。
记下以黄色显示的合并提交ID。 父ID是在下一行写为Merge: parent1 parent2
ID。 现在...
短篇故事:
git revert -m 1
,这将打开一个用于输入提交消息的vi
控制台。 编写,保存,退出,完成! 很长的故事:
切换到进行合并的分支。 就我而言,它是test
分支,而我正尝试从中删除feature/analytics-v3
分支。
git revert
是用于还原所有提交的命令。 但是,还原merge
提交时有一个讨厌的窍门。 您需要输入-m
标志,否则它将失败。 从这里开始,您需要确定是否要还原分支,并通过以下方式使其看起来完全像在parent1
或parent2
上一样:
git revert
(恢复为parent2
)
git revert
(恢复为parent1
)
您可以git登录这些父母,以确定您想走哪条路,这是所有困惑的根源。
我在PR上也遇到了这个问题,该PR已合并到GitHub存储库的master分支中。
由于我只想修改一些修改过的文件,而不是PR带来的全部更改,因此我不得不用git commit --am
amend
merge commit
。
脚步:
git add *
或git add
git commit --am
并验证 git push -f
为什么有趣:
-m
选项指定父编号 。 这是因为合并提交有多个父项,而Git不自动知道哪个父项是主线,哪个父项是要取消合并的分支。
当您在git log
的输出中查看合并提交时,您会看到其父级在以Merge
开头的行中列出:
commit 8f937c683929b08379097828c8a04350b9b8e183
Merge: 8989ee0 7c6b236
Author: Ben James
Date: Wed Aug 17 22:49:41 2011 +0100
Merge branch 'gh-pages'
Conflicts:
README
在这种情况下, git revert 8f937c6 -m 1
将让你的树,因为它是在8989ee0
和git revert -m 2
将恢复树,因为它在7c6b236
。
为了更好地了解父ID,可以运行:
git log 8989ee0
和
git log 7c6b236
本告诉你如何恢复合并提交,但你知道,这样做“声明,你将永远不希望树变化,由合并带来的是非常重要的 。因此,后来合并只能在树带来变化所介绍不是先前还原的合并的祖先的提交。这可能是您想要的,也可能不是您想要的。” (git-merge手册页) 。
从手册页链接的文章/邮件列表消息详细介绍了所涉及的机制和注意事项。 只需确保您了解,如果您还原合并提交,就不能稍后再合并分支并期望返回相同的更改。