修复已提交的未解决的合并冲突

科乔科夫

存储库中有一些文件包含带有HEAD和另一个提交的合并冲突语法。这些文件已以某种方式提交,我现在无法查看日志。我搜索并找到了与文件上的“ git merge -X他们的”合并的命令。但是,这会产生错误“文件未指向提交”。

如何自动删除<<<<< HEAD到====的所有内容,并在每种情况下保留其他提交?手动执行此操作非常困难,因为文件包含70k行,这将非常繁琐。

周二

如果您已经合并并提交,重新合并将无济于事。据git知道,您对合并感到满意。(你刚才说你喜欢它,但你不能告诉给饭桶。:-))

如果不良合并没有与其他任何人共享,则最简单且可能最好的解决方法是“撤消”它,然后将其作为更正的合并重新进行。(如果此后还有其他提交,则可以挑选那些提交以将副本添加到更正的分支中。)

如果不良合并与他人共享的,您仍然可以执行重置/重新合并/ cherry-pick序列,但是所有共享此错误的“其他”都需要知道如何从中恢复。或者,您可以保留不良合并,但以其他方式解决。对于这种情况,没有最佳的答案。

要“撤消”合并,您首先需要了解git如何进行合并,以及分支标签如何与提交图一起使用。让我们绘制一个示例图片段:

... - C - D - E ----- M - I  <-- main
        \           /
          F - G - H          <-- feature

在某些时候,您这里有一个main指向commit分支名称C您(或其他人)创建了branch feature然后,你(或其他人)回到分支main并取得两次提交D,并E为您(或他人)的工作分支,同时feature并提出三个提交FGH

(这些单个字母中的每个字母代表一个大的丑陋的40个字符的SHA-1 ID之一,例如d1574b852963482d4b482992ad6343691082412f。)

最终,您(或其他人)进入了分支main并开始奔跑git merge feature这种合并有很多冲突,但是您(或其他人)只是添加并提交了git留下的文件杂乱的杂物,而不是正确地解决了合并问题。这就是合并提交的原因M

如果您尚未实际提交,则提交M不存在(因此,都不能提交I)。您要做的就是git merge --abort停止正在进行的合并。这样一来main,您就可以在这张图上,也可以在分支上(无论如何,我都认为;feature尽管您可能会在分支上,在这种情况下,一旦执行make M,它就会在分支feature上,在下一行而不是在branch上main,在上方)。

... - C - D - E        <-- main
        \
          F - G - H    <-- feature

如果您打算“撤消”合并,即使提交M存在,这也是您要在此结束的图形

即使M存在,也很容易到达那里原因是这些分支提示指针(存储在分支名称中的内容)仅指向某些提交。我假设main现在指向commit I好了,我们可以把提交M,并I在图中,但只是做main点提交E一次:

... - C - D - E              <-- main
       \       \
        \       `--- M - I   <-- ???
         \          /
          F - G - H          <-- feature

我们首先应I通过使一些标签(分支或标签名称)指向提交,以确保保存提交的身份也就是说,让我们填写三个问号。我们可以使用以下方法为此做一个标签git tag

git tag save-main main

或与建立分支git branch任何一种都可以正常工作。

现在,我们只需要将main点指向E,就像在图中一样。最简单的方法是剪切粘贴或倒数。在这种情况下,进行倒数显示表明,向后跳两跳将使我们到达E向后跳一跳将使我们到达M),因此:

git reset --hard HEAD~2

会将当前分支(即main移到图表中的两步(到E),并重新设置工作树以匹配给定的提交(再次,commit E:我们仅使用名称HEAD~2来命名)。如果愿意,可以使用原始的SHA-1,可通过找到git log


请记住,以上所有内容只是为了让我们回到尚未尝试git merge feature进入的状态main我们现在已经做到了;我们的图表以我们希望的方式显示。

现在,我们可以简单地按照我们想要的方式进行合并:

git merge -X theirs feature

这次,我们应该仔细检查结果,以确保工作树中的文件看起来像我们希望的样子。否则,我们将再次进行详细的合并提交,然后返回开始的位置。但是,让我们假设一切进展顺利。git merge会成功,实际上使这次合并提交。曾经有一个承诺M,这是一个不同的提交和M仍然存在,我们有我们的save-main标签指向II点回M-所以我们有图表现在有一个新的合并M2

... - C - D - E ----  M2      <-- main
       \       \    /
        \       `--/- M - I   <-- save-main
         \        | /
          F - G - H           <-- feature

作为我们的最后一步,我们可能希望I通过复制I到新的commit来还原内容I'为此,我们可以简单地使用git cherry-pick

git cherry-pick save-main

该名称save-main指向commit I,因此I它将复制我们所做的所有操作并将其添加到我们的当前分支中main

... - C - D - E ----  M2 - I' <-- main
       \       \    /
        \       `--/- M - I   <-- save-main
         \        | /
          F - G - H           <-- feature

现在我们已经完成了该名称的操作,save-main因此可以将其删除:

git tag -d save-main

因为我们不关心提交MI更多。

(请注意I,由于采摘I是在错误合并的基础上进行的,因此采摘可能会出错M。如果失败,尝试进行采摘时会出现合并冲突。您必须手动解决此问题。 )


请注意,上述M通过“回退”分支名称来“撤消”合并提交的过程main,对于共享您的工作的任何人(直接使用您的存储库,或者如果您编辑git push了错误的合并,从而使所有人感到头痛),其他人可以看到它,等等)。他们也将不得不撤消错误的承诺,如果他们基于那些错误的承诺开展工作,则可能不得不重复他们的工作。在这种情况下,您可能希望采用不同的方法,即添加新的提交以简单地修复失败的合并(例如,手动清理混乱)。在这种情况下,那些与您共享工作的人只会将您的修订作为fix,这是git要做的事情,因此对他们来说更容易。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Git:提交未解决的冲突

来自分类Dev

git stash未解决的合并冲突

来自分类Dev

TortoiseSVN-合并-如何恢复解决未解决的冲突?

来自分类Dev

如何解决EGit中多次提交的合并冲突?

来自分类Dev

Git:解决合并冲突

来自分类Dev

应用已提交的未跟踪文件的存储

来自分类Dev

git:如何重做合并冲突解决方案(在提交合并之前)?

来自分类Dev

修复合并冲突,然后添加,但仍然会出现“未合并的文件”

来自分类Dev

解决Git重设基准期间的合并冲突后是否需要提交?

来自分类Dev

主分支更改后合并开发分支(已提交)

来自分类Dev

git:解决合并冲突而不执行合并

来自分类Dev

在Git中,可以将我未提交的更改视为合并冲突吗?

来自分类Dev

是否已提交DB2读取而未锁定?

来自分类Dev

合并时没有冲突,代码不会编译:我应该在提交之前对其进行修复吗?

来自分类Dev

解决合并冲突后,Git rebase卡住

来自分类Dev

解决SVN更新时的合并冲突

来自分类Dev

如何通过与Github API合并解决冲突

来自分类Dev

SVN解决合并中的树冲突

来自分类Dev

合并分支不会产生冲突来解决

来自分类Dev

如何解决跨叉的合并冲突?

来自分类Dev

如何使用git rebase解决合并冲突?

来自分类Dev

如何解决github上的合并冲突

来自分类Dev

壁球/修复合并提交

来自分类Dev

如何在合并提交中检查手动冲突解决方案,其中使用父级之一干净地执行解决方案

来自分类Dev

未更改时,Git合并冲突

来自分类Dev

Git 冲突 - 未配置合并工具

来自分类Dev

Sourcetree中的Git合并不会获取所有已提交的文件并弄乱了工作副本

来自分类Dev

如何修复未推送的合并commit(git)?

来自分类Dev

如何修复断点文件中发生冲突的Git合并?

Related 相关文章

  1. 1

    Git:提交未解决的冲突

  2. 2

    git stash未解决的合并冲突

  3. 3

    TortoiseSVN-合并-如何恢复解决未解决的冲突?

  4. 4

    如何解决EGit中多次提交的合并冲突?

  5. 5

    Git:解决合并冲突

  6. 6

    应用已提交的未跟踪文件的存储

  7. 7

    git:如何重做合并冲突解决方案(在提交合并之前)?

  8. 8

    修复合并冲突,然后添加,但仍然会出现“未合并的文件”

  9. 9

    解决Git重设基准期间的合并冲突后是否需要提交?

  10. 10

    主分支更改后合并开发分支(已提交)

  11. 11

    git:解决合并冲突而不执行合并

  12. 12

    在Git中,可以将我未提交的更改视为合并冲突吗?

  13. 13

    是否已提交DB2读取而未锁定?

  14. 14

    合并时没有冲突,代码不会编译:我应该在提交之前对其进行修复吗?

  15. 15

    解决合并冲突后,Git rebase卡住

  16. 16

    解决SVN更新时的合并冲突

  17. 17

    如何通过与Github API合并解决冲突

  18. 18

    SVN解决合并中的树冲突

  19. 19

    合并分支不会产生冲突来解决

  20. 20

    如何解决跨叉的合并冲突?

  21. 21

    如何使用git rebase解决合并冲突?

  22. 22

    如何解决github上的合并冲突

  23. 23

    壁球/修复合并提交

  24. 24

    如何在合并提交中检查手动冲突解决方案,其中使用父级之一干净地执行解决方案

  25. 25

    未更改时,Git合并冲突

  26. 26

    Git 冲突 - 未配置合并工具

  27. 27

    Sourcetree中的Git合并不会获取所有已提交的文件并弄乱了工作副本

  28. 28

    如何修复未推送的合并commit(git)?

  29. 29

    如何修复断点文件中发生冲突的Git合并?

热门标签

归档