查看 git 中已删除文件的更改

Viewing changes to deleted files in git

假设当我从 master 分支出来时,在我的回购的 master 分支上有一个文件 colors.txt,其中包含以下内容:

red
green
blue
yellow

然后我分支到 my-branch,其中我进行了以下更改:

  1. 删除colors.txt
  2. 添加 red.txt 内容如下:

    red
    
  3. 添加 green.txt 内容如下:

    green
    
  4. 添加 blue.txt 内容如下:

    blue
    
  5. 添加 yellow.txt 内容如下:

    yellow
    

现在,我需要对 master 进行一些更改,所以我想合并。不过也有人把colors.txt改成了:

red
green
blue
yellow
orange
purple

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

棘手的场景,对吧?我认为您能做的最好的事情就是找出 "when" color.txt 已被删除。如果您不合并,我会说:使用二分法找出文件何时消失,这样您就可以看到发生了什么,但是您正在合并,所以这不好。 git blame --reverse 可以有点 告诉您文件最后一次存在 在您的工作树上是什么时候。 git log --name-status -- <file-path> 还可以帮助您查看文件何时消失(以及为什么,通过写得很好的修订注释,对吧?)。我会告诉你给 difflame 一个测试驱动器(我通过混合 blame 和 diff 输出的工具可以告诉你删除行的确切修订)但我认为因为文件是 完全删除,它会崩溃..虽然不确定。这是 link 以防万一:https://github.com/eantoranz/difflame。现在...如果您能够找出文件被删除的版本,您可能会发现 为什么 它被删除并且您应该弄清楚您必须为创建一个文件添加到 color.txt 保持 color.txt 删除的新颜色,以便合并为 "complete".

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

  • 检查一个新分支 color-test
  • 将 orange/purple 添加到现有的 colors.txt 并提交
  • 切换回 "master"
  • 删除colors.txt
  • 尝试合并,失败

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

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

其中 color-test 是我添加 orange/purple 的分支, ..(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

当您将 -R 切换到 git diff 时,您将得到 + 而不是 -(输入是相反的)。

希望对您有所帮助。

您可以使用此命令显示对该文件所做的所有更改:

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

在您的案例中,这应该导致此输出:

red
green
blue
yellow
+orange
+purple

git diff 使用三个点将显示所有提交的更改,这些提交是第二个引用提交的父项,但不是第一个引用提交的父项。因此,使用它您将看到所有更改,如果文件未被删除,这些更改将被合并。

通过使用 -- colors.txtgit diff 显示的更改仅限于该文件。

该命令的更通用版本是

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

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

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

之后就可以了

git merge-diff-theirs -- colors.txt