【问题标题】:How to diff changed files versus previous versions after a pull?git:拉取后如何区分更改的文件与以前的版本?
【发布时间】:2011-01-26 13:29:45
【问题描述】:

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

这是怎么做到的?

我假设它是“git diff”,带有一些用于提交 x 与提交 y 的参数,但我似乎无法理解语法。我还发现“git log”有点混乱,不知道从哪里获取我的最新版本文件的提交 ID 与新版本。

【问题讨论】:

标签: git


【解决方案1】:

有各种美妙的方式来指定提交 - 有关更多详细信息,请参阅 man git-rev-parsespecifying revisions 部分。在这种情况下,您可能希望:

git diff HEAD@{1}

@{1} 的意思是“我指定的 ref 的前一个位置”,因此它会评估您之前签出的内容 - 就在 pull 之前。如果您的工作树也有一些更改并且您不想看到它们的差异,您可以在最后添加HEAD

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

git diff HEAD@{1} filename

这是一般情况 - 如果您想了解给定提交中文件的状态,请指定提交和文件,而不是特定于文件的 ID/哈希。

【讨论】:

  • VonC 链接的上一篇文章说的基本上与此相同,但解释有点不同,所以我现在暂且不说。 (它还使用@{1} 作为HEAD@{1} 的简写)
  • 是的,但我也喜欢这个解释。 +1
  • 这正是我正在寻找的。谢谢你的解释。
  • +1 表示我在谷歌上搜索的内容。如果这被选为答案并排在首位,那就太棒了... :)
  • @longda 如果您按投票排序(我认为这是默认设置),它应该已经在顶部。
【解决方案2】:

如果您直接执行git pull,那么您将被“快速转发”或合并来自远程存储库的未知数量的提交。虽然这是一个动作,但您在拉取之前的最后一次提交将是 reflog 中的最后一个条目,并且可以作为HEAD@{1} 访问。这意味着您可以:

git diff HEAD@{1}

但是,我强烈建议,如果这是您发现自己经常做的事情,那么您应该考虑只做一个 git fetch 并检查获取的分支,然后再手动合并或变基到它。例如。如果您在 master 上并且打算加入 origin/master:

git fetch

git log HEAD..origin/master

 # looks good, lets merge

git merge origin/master

【讨论】:

【解决方案3】:

我喜欢用:

git diff HEAD^

或者如果我只想区分一个特定的文件:

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

【讨论】:

  • -1: HEAD^ 是父提交,而不是pull之前的提交
  • 如果HEAD 是合并提交,HEAD^ 是第一个父提交,所以是的,它可以是pull 之前的提交。要获取另一个父级(用于双向合并),请使用 HEAD^2。但是,上面的答案并没有真正回答问题,所以留下 -1 ;-)
  • 感谢您的澄清。没有仔细阅读这个问题,因为我在谷歌上搜索其他东西,这个链接在结果页面上很高。我想我会加入,因为我是一个新用户并且没有任何业力(如果这就是所谓的 SO)。我的错 =)
  • @MichaelWild 这可能不是提问者要问的,但当我找到这个时,它就是我正在寻找的。这对我很有用。点赞。
  • 这就是 TortoiseGit “与以前版本的差异”所做的。这就是我一直在寻找的。​​span>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-03
  • 1970-01-01
  • 1970-01-01
  • 2010-09-25
相关资源
最近更新 更多