【问题标题】:git - merge conflict when local is deleted but file exists in remotegit - 删除本地文件但远程文件存在时合并冲突
【发布时间】:2011-05-18 04:43:06
【问题描述】:

我对 git 很陌生,想知道如何在本地 repo 中进行合并,我已经删除了 master 分支上的几个文件,但这些文件存在于远程 master 分支中。

执行 git-merge 后,它会显示已发生的冲突。

使用 git gui 显示本地文件被删除,而远程分支文件有内容。

如何防止这些文件发生冲突? 有没有使用 git gui 的简单方法?

非常感谢

【问题讨论】:

  • 过去,我所做的一件事是将“已删除”的文件保留在源代码管理中,但将它们从项目/makefile/whatever 中排除。至少,对于合并冲突来说,这是一个不错的临时解决方法。
  • 您修复它的方式与修复任何合并冲突的方式相同:将所需版本(文件或缺少文件)添加到索引中,然后提交。你要哪一个?
  • @MarkRushakoff 我会将您的建议改写为“当我遇到需要解决冲突的情况时,我根本不会真正解决那些问题,只是掩盖它们,以免它们咬人(可能不是我) ) 将来”。对于想要在项目中引入更多问题的人来说,这确实是一个很好的建议。

标签: git


【解决方案1】:

this useful answer to a related question 中所述,您可以使用git mergetool 启动一个对话框,您可以在其中选择是要采用文件的修改版本还是删除版本。

【讨论】:

    【解决方案2】:

    评价最高的答案侧重于解决冲突的方法。

    在此之前,您可能想知道远程在本地删除的文件中发生了什么变化。

    为此,您可以通过以下方式查看更改:

    git diff --base
    

    来自https://git-scm.com/docs/git-diff#Documentation/git-diff.txt--1--base

    将工作树与“基本”版本进行比较 [...]。索引仅包含未合并条目的这些阶段,即在解决冲突时。

    【讨论】:

    【解决方案3】:

    作为除了接受的答案之外的附加提示,在 “我们已删除” 中,如果您想查看对已删除文件所做的更改,以便您可以应用这些更改您可以在其他地方使用的更改:

    git diff ...origin/master -- path/to/file
    

    如果是“被他们删除”场景,并且您希望看到更改以便在其他地方应用它们,您可以使用:

    git diff origin/master... -- path/to/file
    

    【讨论】:

    • 是的!如果您不想放弃正在合并的更改,例如刚刚重命名文件或其内容在文件被删除之前移动时,这一点至关重要。
    • 提醒一下:当冲突发生在变基期间,这不起作用。需要像git diff mybranch@{1}...origin/master -- path/to/file这样明确
    • @nschum 谢谢!这正是我想要的。
    • 你也可以使用git diff --base(见我的其他回答)。
    • 嗨约瑟夫,即使这个答案看起来很有希望,我仍然被困住。如果您有时间,我很乐意在这里回答您:stackoverflow.com/q/63044843/470749 谢谢!
    【解决方案4】:

    在 EGit 中我也发现了问题。我的解决方案是:

    • 使用了 Git 暂存视图。
    • 双击显示在未暂存更改上的每个文件以打开比较器
    • 点击“从左到右全部复制”图标
    • 保存文件(它将从未暂存列表中消失)

    【讨论】:

      【解决方案5】:

      在 Git GUI 中,选择冲突文件,然后右键单击显示冲突文本的主文本区域。

      在出现的上下文菜单中,您可以选择“远程”或“本地”。所以如果一个文件被远程删除,你可以选择“远程”在本地传播删除,反之亦然。

      我花了一个月才弄明白...如果 Git GUI 真的有文档就好了...

      【讨论】:

        【解决方案6】:

        您应该按照您认为合适的方式解决冲突。如果该文件确实应该被删除,并且您将把该更改发布到原点,请再次删除它:

        git rm path/to/file
        

        如果实际上仍应跟踪该文件,请添加它(工作树中的版本将是原始版本):

        git add path/to/file
        

        在完成其中任一解决冲突后,提交合并。

        【讨论】:

        • 我有几个文件,都在同一个目录中,并且都具有相同的后缀。是否有一个快捷方式可以一次删除它们,同时保留目录中的其余文件?
        • @chiborg:这只是一个 shell 问题。 cd 到目录,git rm *.ext。您的 shell(不是 Git)将 *.ext 扩展为所有匹配的文件名。
        • 如果我想保留一些文件? git rm 没有 -i 标志。
        • @chiborg:您说您想删除带有给定后缀的所有内容,并保留其他所有内容。这正是我告诉你的方法。或者你的意思是git rm *-suffix.ext?一样的区别。如果您在弄清楚如何使用 shell 通配符时遇到问题,请在 unix.stackexchange.com 上提问。如果您知道通过 globbing 无法完成您想要的事情,请使用 rm -i 并按照 git add -u 进行删除。
        • @Jefromi,如果我指定-s recursive -X ours,为什么还需要git rmgit add
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-11-12
        • 1970-01-01
        • 2021-03-08
        • 1970-01-01
        • 2012-10-06
        • 1970-01-01
        相关资源
        最近更新 更多