git:拉后如何将更改的文件与以前的版本进行比较?


117

当我运行“ git pull”时,我经常想知道在文件的最新版本和新版本之间发生了什么变化。说我想知道其他人对特定文件的承诺。

怎么做?

我假设它是“ git diff”,带有一些用于提交x和提交y的参数,但是我似乎无法获得语法。我也发现“ git log”有些混乱,并且不确定在哪里获取最新版本文件与新版本的提交ID。


1
您可能会更喜欢gitk图形工具。
crazyscot 2010年

Answers:


158

有多种奇妙的方式来指定提交- 有关更多详细信息,请参见的指定修订版部分man git-rev-parse。在这种情况下,您可能想要:

git diff HEAD@{1}

@{1}意思是“我指定裁判的前面位置”,从而使计算结果为你以前签出什么-只是前拉。HEAD如果您在工作树中也进行了一些更改,并且不想看到它们之间的差异,则可以在此结束。

我不确定您要的“文件最新版本的提交ID”是什么-提交“ ID”(SHA1哈希)是否为40个字符的十六进制,就在输出中每个条目的顶部git log。它是整个提交的哈希,而不是给定文件的哈希。您实际上根本不需要更多-如果您想在拉取中仅比较一个文件,请执行

git diff HEAD@{1} filename

这很普遍-如果您想了解给定提交中文件的状态,请指定提交和文件,而不是文件的ID /哈希。


VonC链接的上一篇文章说的基本上与此相同,但是解释有些不同,所以我现在将其保留。(它也@{1}用作的简写HEAD@{1}
卡斯卡贝尔

是的,但我也喜欢这种解释。+1
VonC 2010年

这正是我要寻找的。谢谢您的解释。
lucapette 2011年

+1我正在搜寻的内容。如果这被选为答案并撞到了顶部,那将是非常棒的... :)
longda

@longda如果您通过投票进行排序(我认为这是默认设置),它应该已经位于顶部。
卡斯卡贝尔2013年

57

我喜欢使用:

git diff HEAD^

或者,如果我只想比较特定文件:

git diff HEAD^ -- /foo/bar/baz.txt

5
-1:HEAD^是父提交,而不是之前的提交pull
CharlesB 2012年

1
如果HEAD是合并提交,HEAD^则是第一个父提交,因此,可以是之前的提交pull。要获取另一个父对象(用于双向合并),请使用HEAD^2。但是,上面的答案最初并没有真正回答问题,因此留下-1 ;-)
Michael Wild

感谢您的澄清。没有仔细阅读问题,因为我正在搜索其他内容,因此此链接在结果页面上排名很高。我以为自己是新用户,因此没有任何业力(如果那就是所谓的SO),我会很高兴。我的错=)
cadizm 2012年

3
@MichaelWild可能不是问问者所要的,但这是我找到这个时要寻找的东西。对我有用。正在投票。
约翰·德沃夏克

这就是TortoiseGit“与以前版本的差异”所做的事情。而这正是我一直在寻找的。
法比恩·哈达迪

15

如果您进行直线操作git pull,则将被“快速转发”或合并来自远程存储库的未知数量的提交。不过,这是一个动作,因此您在拉取之前进行的最后一次提交将是reflog中的最后一个条目,并且可以按进行访问HEAD@{1}。这意味着您可以执行以下操作:

git diff HEAD@{1}

但是,我强烈建议您,如果您发现自己做了很多事情,那么您应该考虑只做一次git fetch并检查提取的分支,然后再手动合并或重新建立它。例如,如果您在使用母版并且打算引入原点/母版:

git fetch

git log HEAD..origin/master

 # looks good, lets merge

git merge origin/master

很好地使用git log代替git diff此处(即使语法在“ ..” git log和“ ...” 之间也不一致git diff;)+1参见stackoverflow.com/questions/53569/…stackoverflow.com/questions / 850607 /…
VonC

幸运的是,如果您在git diff命令中使用'..'语法,则git“做正确的事”。
CB Bailey 2010年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.