在 Git 中查看已删除文件的更改

9

假设我从主分支上分出一个新的分支时,我的仓库中的master分支上有一个名为colors.txt的文件,并且其内容如下:

red
green
blue
yellow

接着我创建了一个名为 my-branch 的分支,在这个分支上,我进行了以下更改:

  1. Delete colors.txt
  2. Add red.txt with these contents:

    red
    
  3. Add green.txt with these contents:

    green
    
  4. Add blue.txt with these contents:

    blue
    
  5. Add yellow.txt with these contents:

    yellow
    

现在,主分支上有一些变更是我需要的,因此我想要合并。但是,有人也对colors.txt进行了修改:

red
green
blue
yellow
orange
purple

在我的合并过程中,我得到的唯一信息是我删除了文件colors.txt,那么我如何查看在主分支上对该文件所做的更改,以便适当地解决冲突(在这种情况下,通过添加文件orange.txtpurple.txt来解决)?

3个回答

12

使用此命令可以显示在主分支上对该文件所做的所有更改:

git diff HEAD...master -- colors.txt

这应该会在你的情况下导致这个输出:

red
green
blue
yellow
+orange
+purple

git diff first_commit..second_commit --color=always --

git diff HEAD...MERGE_HEAD -- colors.txt

MERGE_HEAD 总是设置为合并提交,因此它可以替换合并分支名称。使用这个,甚至可以设置别名来重复使用这个命令:

MERGE_HEAD 始终设置为合并提交,因此它可以替换合并的分支名称。使用它,甚至可以设置别名以便重用此命令:

git config --global alias.merge-diff-theirs "diff HEAD...MERGE_HEAD"

之后你只需要执行以下操作:

git merge-diff-theirs -- colors.txt

非常感谢。您的回答既满足了我的需求,又非常简单易懂。不过需要注意的是,我使用 git diff HEAD...MERGE_HEAD colors.txt 也能得到与 git diff HEAD...MERGE_HEAD -- colors.txt 相同的结果。 - ericmarkmartin
“--” 用于将修订/参数与路径分开。在 Git 检测到参数不是修订版本而是文件的有效路径时,它会假定这些破折号。但是,如果您有一个名为 colors.txt 的分支,则会失败。 - lucash
再次感谢您的帮助。 - ericmarkmartin

0

棘手的情况,对吧?我认为你最好尝试找出“何时”删除了color.txt。如果你不是在合并,我会建议:使用二分查找来找出文件消失的时间,以便你可以看到发生了什么,但你正在合并,所以这样做没有用。git blame --reverse 可以帮助你在一定程度上了解文件上次在你的工作树中存在的时间。git log --name-status -- <file-path> 也可以帮助你看到文件何时消失(通过一个很好的修订注释来了解原因,对吧?)。我会告诉你去试试difflame(我开发的一款工具,通过混合blame和diff输出,能够告诉你确切的修订版本,在哪些行被删除),但我认为因为文件被完全删除,它可能会出问题...不过也不确定。这是链接,以防万一:https://github.com/eantoranz/difflame。现在...如果你能找出文件被删除的修订版本,你可能会发现为什么它被删除,并且你应该想出你必须为添加到color.txt的新颜色创建一个文件,同时保持color.txt被删除,以使合并“完成”。


我会尝试一下并告诉你结果。谢谢你的回复。 - ericmarkmartin

0

好的,我测试了以下内容:

  • 检出新分支 color-test
  • 将橙色/紫色添加到现有的colors.txt并提交
  • 切换回“master”
  • 删除colors.txt
  • 尝试合并,但失败了

对于我来说,git diff colors-test.. -- colors.txt 给出了以下输出:

-red
-green
-blue
-yellow
-orange
-purple

其中color-test是我添加橙色/紫色的分支,..(nothing)表示HEAD。当文件很小的时候,这可能还可以接受,但完整的差异可能更好。

要找出您删除文件的提交,请尝试以下操作:

git log --name-status -- colors.txt

你会发现一个提交记录,其中包含D colors.txt,这是你删除该文件的提交记录,以我的情况为例,短哈希值为e1bb165。你可能需要与它之前的提交进行比较。

git diff colors-test..e1bb165~1 -- colors.txt

这给了我

green
blue
yellow
-orange
-purple

当您在git diff命令中传递-R开关时,您将获得+而不是-(输入被颠倒了)。
希望这可以帮助到您。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接