如何还原已经推送到远程分支的合并提交?

单独使用git revert <commit_hash>无效。 -m必须被指定,对此我感到很困惑。

有人经历过吗?


#1楼

这是一个完整的示例,希望对您有所帮助:

git revert -m 1 <commit-hash> 
git commit -m "Reverting the last commit which messed the repo."
git push -u origin master

其中<commit-hash>是您要还原的合并的提交哈希,如该答案的说明所述, -m 1表示您想还原到第一个父级的树。合并。

git commit ...行实质上是提交您的更改,而第三行则通过将更改推送到远程分支来公开更改。


#2楼

有时,最有效的回滚方法是退回并替换。

git log

使用第二次提交哈希(完整哈希,要在列出错误之前将其还原回的哈希),然后从那里重新分支。

git checkout -b newbranch <HASH>

然后删除旧分支,将新分支复制到其位置,然后从那里重新启动。

git branch -D oldbranch
git checkout -b oldbranch newbranch

如果已广播,则从所有存储库中删除旧分支,将重做分支推到最中央,然后再拉回所有分支。


#3楼

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

  1. 签出远程分支到本地仓库。
    git checkout development
  2. 从git log git log -n5复制提交哈希(即紧接错误提交之前的提交ID)

    输出:

    提交7cd42475d6f95f5896b6f02e902efab0b70e8038“将分支“错误提交”合并到“开发”中”
    提交f9a734f8f44b0b37ccea769b9a2fd774c0f0c012“这是错误的提交”
    提交3779ab50e72908da92d2cfcd72256d7a09f446ba“这是正确的提交”

  3. 将分支重置为上一步中复制的提交哈希
    git reset <commit-hash> (ie 3779ab50e72908da92d2cfcd72256d7a09f446ba)

  4. 运行git status以显示属于错误提交的所有更改。
  5. 只需运行git reset --hard即可还原所有这些更改。
  6. 强制将您的本地分支推到远程,并注意到您的提交历史记录很干净,就像它被污染之前一样。
    git push -f origin development

#4楼

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

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

  1. 结帐大师。
  2. 在主服务器和备份服务器之间创建完整的二进制反向修补程序。 git diff --binary master..master_bk_01012017 > ~/myrevert.patch
  3. 检查您的补丁git apply --check myrevert.patch
  4. 应用带有注销的补丁git am --signoff < myrevert.patch
  5. 如果在修复后需要再次引入此代码,则需要分支出还原后的主代码,并检出fix分支git branch mycodebranch_fix git checkout mycodebranch_fix
  6. 在这里,您需要找到用于还原的SHA密钥并还原git revert [SHA]
  7. 现在,您可以使用mycodebranch_fix修复问题,完成后提交并重新合并到master中。

#5楼

如Ryan所述, git revert可能会使合并变得很困难,因此git revert可能不是您想要的。 我发现使用git reset --hard <commit-hash-prior-to-merge>命令在这里更有用。

一旦完成了硬重置部分,就可以强制推送到远程分支,即git push -f <remote-name> <remote-branch-name> ,其中<remote-name>通常被命名为origin 。 从那时起,您可以根据需要重新合并。


#6楼

git revert -m 1 <merge-commit>

#7楼

为了使日志保持干净无事(这种方法有一些缺点(由于推-f)):

git checkout <branch>
git reset --hard <commit-hash-before-merge>
git push -f origin HEAD:<remote-branch>

“ commit-hash-before-merge”来自合并后的日志(git日志)。


#8楼

正确标记的答案对我有用,但是我不得不花一些时间来确定发生了什么。.因此,我决定为简单的简单步骤添加答案,例如我的情况。

假设我们得到了分支A和B。您将分支A合并到分支B中,并将分支B推到自身,所以现在合并是它的一部分。。但是您想回到合并之前的最后一次提交。你做?

  1. 转到您的git根文件夹(通常是项目文件夹)并使用git log
  2. 您将看到最近提交的历史记录-提交具有commit / author / date属性,而合并也具有merge属性-因此您将看到如下所示:

    commit: <commitHash> Merge: <parentHashA> <parentHashB> Author: <author> Date: <date>

  3. 使用git log <parentHashA>git log <parentHashB> -您将看到那些父分支的提交历史-列表中的第一个提交是最新的

  4. 取得所需提交的<commitHash> ,转到git根文件夹,然后使用git checkout -b <newBranchName> <commitHash> -这将从您在合并前选择的最后一个提交开始创建一个新分支。瞧,准备好了!

#9楼

有关git revert -m的git doc提供了一个确切解释此链接的链接: https : //github.com/git/git/blob/master/Documentation/howto/revert-a-faulty-merge.txt


#10楼

所有的答案已经涵盖了大部分内容,但是我会加5美分。 简而言之,尊敬合并提交非常简单:

git revert -m 1 <commit-hash>

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

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


#11楼

如果要还原merge提交,这是您必须要做的。

  1. 首先,检查git log以找到您的合并提交的ID。 您还将找到与合并关联的多个父ID(请参见下图)。

在此处输入图片说明

记下以黄色显示的合并提交ID。 父ID是在下一行写为Merge: parent1 parent2 ID。 现在...

短篇故事:

  1. 切换到进行合并的分支。 然后只需执行git revert <merge commit id> -m 1 ,这将打开一个用于输入提交消息的vi控制台。 编写,保存,退出,完成!

很长的故事:

  1. 切换到进行合并的分支。 就我而言,它是test分支,而我正尝试从中删除feature/analytics-v3分支。

  2. git revert是用于还原所有提交的命令。 但是,还原merge提交时有一个讨厌的窍门。 您需要输入-m标志,否则它将失败。 从这里开始,您需要确定是否要还原分支,并通过以下方式使其看起来完全像在parent1parent2上一样:

git revert <merge commit id> -m 1 (恢复为parent2

git revert <merge commit id> -m 2 (恢复为parent1

您可以git登录这些父母,以确定您想走哪条路,这是所有困惑的根源。


#12楼

我在PR上也遇到了这个问题,该PR已合并到GitHub存储库的master分支中。

由于我只想修改一些修改过的文件,而不是PR带来的全部更改,因此我不得不用git commit --am amend merge commit

脚步:

  1. 转到要更改/还原某些修改文件的分支
  2. 根据修改后的文件进行所需的更改
  3. 运行git add *git add <file>
  4. 运行git commit --am并验证
  5. 运行git push -f

为什么有趣:

  • 它使PR的作者保持不变
  • 它不会破坏git树
  • 您将被标记为提交者(合并提交作者将保持不变)
  • Git就像您解决了冲突一样,将删除/更改已修改文件中的代码,就像您手动告诉GitHub不要按原样合并一样

#13楼

-m选项指定父编号 。 这是因为合并提交有多个父项,而Git不自动知道哪个父项是主线,哪个父项是要取消合并的分支。

当您在git log的输出中查看合并提交时,您会看到其父级在以Merge开头的行中列出:

commit 8f937c683929b08379097828c8a04350b9b8e183
Merge: 8989ee0 7c6b236
Author: Ben James <ben@example.com>
Date:   Wed Aug 17 22:49:41 2011 +0100

Merge branch 'gh-pages'

Conflicts:
    README

在这种情况下, git revert 8f937c6 -m 1将让你的树,因为它是在8989ee0git revert -m 2将恢复树,因为它在7c6b236

为了更好地了解父ID,可以运行:

git log 8989ee0 

git log 7c6b236

#14楼

本告诉你如何恢复合并提交,但你知道,这样做“声明,你将永远不希望树变化,由合并带来的是非常重要的 。因此,后来合并只能在树带来变化所介绍不是先前还原的合并的祖先的提交。这可能是您想要的,也可能不是您想要的。” (git-merge手册页)

从手册页链接的文章/邮件列表消息详细介绍了所涉及的机制和注意事项。 只需确保您了解,如果您还原合并提交,就不能稍后再合并分支并期望返回相同的更改。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值