当我运行“ git pull”时,我经常想知道文件的最新版本和新版本之间发生了什么变化。假设我想知道其他人对某个特定文件做了什么承诺。
怎么做到的?
我假设它是“ git diff”,带有提交 x 和提交 y 的一些参数,但我似乎无法得到语法。我还发现“ git 日志”有点令人困惑,不确定从哪里获得文件的最新版本的提交 ID 和新版本的提交 ID。
有各种各样的方法来指定提交-请参阅 man git-rev-parse的 指定修订版本部分了解更多细节。在这种情况下,你可能需要:
man git-rev-parse
git diff HEAD@{1}
@{1}表示“我指定的参考文献的前一个位置”,因此它的计算结果与您之前检出的结果一致——就在拉取之前。如果您的工作树中还有一些更改,并且您不希望看到它们之间的差异,那么您可以在末尾加上 HEAD。
@{1}
HEAD
我不确定您要的是“我最新版本文件的提交 ID”——提交“ ID”(SHA1散列)是 git 日志输出中每个条目顶部的那个40个字符的十六进制。它是整个提交的哈希值,而不是给定文件的哈希值。你不需要更多——如果你只想在整个拉动过程中区分一个文件,那就去做吧
git diff HEAD@{1} filename
这是一个常规问题——如果您想知道给定提交中文件的状态,您需要指定提交和文件,而不是指定文件的 ID/hash。
如果您直接执行 git pull,那么您将要么是“快进”,要么合并来自远程存储库的未知数量的提交。但是,这是作为一个操作发生的,因此在提交之前您所处的最后一个提交将是 reflog 中的最后一个条目,并且可以作为 HEAD@{1}访问。这意味着你可以:
git pull
HEAD@{1}
但是,我强烈建议,如果您发现自己做了很多这样的事情,那么您应该考虑只做一个 git fetch,并在手动合并或重新基于它之前检查所获取的分支。例如,如果你在 master 上,并且打算拉原点/master:
git fetch
git fetch git log HEAD..origin/master # looks good, lets merge git merge origin/master
我喜欢用:
git diff HEAD^
或者,如果我只想区分一个特定的文件:
git diff HEAD^ -- /foo/bar/baz.txt