【问题标题】:Revert changes made by merge还原合并所做的更改
【发布时间】:2012-01-09 12:24:16
【问题描述】:

开发人员正在对两个文件进行小幅更改。但是在这次提交期间,他遇到了合并冲突,删除了很多东西(可能没有最新版本)。然后它被推送到共享仓库,其他一些开发人员做了一些其他的提交。

现在,我们注意到,合并删除了重要文件,我们希望将其恢复。
如何在不丢失下一次提交的更改的情况下做到这一点?

我试图git revert commitsha,但它并没有带回更改。我需要恢复mergesha 吗?如何确定?

【问题讨论】:

  • 你试过cherry-pick吗?

标签: git revert


【解决方案1】:

git revert --mainline

通常:

git revert --mainline 1 dd8cbe3e4

地点:

  • dd8cbe3e4 是您要撤消的错误合并提交,并且
  • --mainline 告诉您之前的多个提交中的哪一个是要恢复的(请记住,合并提交有多个父提交,您只能保留其中一个)。
    • 我无法很好地解释1 的含义,但我猜1,2,3... 对应于dd8cbe3e4 之前的提交的映射列表,按升序排序em> 时间顺序(最旧的在前 - 通常是您想要恢复的顺序)。

来源:

http://thezencoder.com/2013/09/05/how-to-correctly-revert-a-bad-merge-in-git/

【讨论】:

  • 我相信你关于主线的说法是正确的——文档:git-scm.com/docs/git-revert#git-revert--mparent-number
  • --mainline 对我有用,但 -m 不行。给我fatal: bad revision '1'
  • 很遗憾,我们不得不猜测 1 的含义。关于您的猜测:您认为时间顺序是按 CommitDate 还是按 AuthorDate?
【解决方案2】:

简而言之,警告:没有真正的安全方法可以撤消合并,除了实际上重置提交的分支合并之前。

现在让我解释一下并浏览现有的参考资料。

引用How do you revert a faulty git merge commit的链接答案

基本上,还原合并将撤消数据更改,但不会撤消历史记录(图表)更改。因此,预计恢复错误的合并不会有任何作用。

当然,重置分支将是最简单的方法,但如果合并的结果已经被推送到共享仓库(因为您正在有效地重写已发布的历史记录),则它有缺点。

下面是详细介绍

  • git merge <someref> 合并(解决冲突后可选择提交)
  • 如果您立即发现要在合并之前将分支重置为:

    git reset HEAD@{1} 
         # optionally pass --hard to reset the working tree too
    
  • 如果你后来才发现,

    • 每次使用 reflog 来查找合并前的点。 (HEAD@{1} 是当前头引用的前一个值的缩写,但 reflog 跟踪头引用的值的有限历史记录)

      git reflog
      
    • 重置分支

      git reset HEAD@{n} # substitute reflog entry index
      
    • 可选地 rebase/cherry-pick 合并后完成的提交

      git cherry-pick HEAD@{1} # just an example. interactive tools will make this easier
      

【讨论】:

  • 谢谢,这已经足够接近了!当然,由于其他一些错误,它不起作用。我希望有一天,某个团队将创建一个不需要单独的硕士学位的版本控制系统,并且开发人员可以专注于开发,而不是花费数天时间来找出一个安全但尽可能令人困惑的系统。从我使用 git 的第一天起,我就不喜欢它,但它并没有改变,但它会不断发展,总有一天会很好:(
  • 重置而不是恢复的问题在于,如果你已经推送了错误的合并,而其他人已经取消了它,这将使他们的生活变得复杂。一旦你推送,你通常应该创建补偿性的新提交,而不是删除提交。
  • 这与更改已发布历史的问题一样。这不是重置的问题,而是发布的历史记录的问题:)
  • 对,但是在你重置到最后一个好的提交之后你会做什么?这类似于分布式系统中的同步时钟。你永远不应该让时间倒退。
  • 是的,您是对的,我没有阅读您的完整原始答案(其他人可能也没有阅读)。
【解决方案3】:

另一种(更安全)的方法是在文件的最新版本和当前版本之间创建差异,然后通过复制和粘贴来恢复丢失的部分。

这总是有效的,不需要任何奇怪的命令行选项,而且它不会篡改你应该不理会的东西:-)

例如,Eclipse 有很好的工具来挑选每个个体差异并将其复制到任一版本。只需使用“比较”菜单并排打开两个版本。

【讨论】:

  • 很遗憾你是对的。作为一种预防措施,最好是变基而不是合并
【解决方案4】:

简而言之,你可以做一个git reset --soft <commit> 其中 commit 可以是 HEAD^(上一个)、HEAD~2(当前-2)、一个 SHA 等。

使用 --soft,所有更改都准备好提交,因此您可以实际更改提交。使用 --hard 更改将全部丢失。

更改提交后,您必须使用git push --force 将更改强制推送到共享存储库。

请注意,您需要告诉其他开发人员他们应该将他们的 repo 重新定位到共享 repo。 (使用git pull --rebase)。他们可能会遇到一些合并冲突...请记住这一点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-01
    • 2021-07-29
    • 2015-10-13
    • 1970-01-01
    • 1970-01-01
    • 2013-05-23
    相关资源
    最近更新 更多