如何列出文件的所有不同版本并进行比较?

47

使用 Git,我想列出给定文件的所有不同版本。

然后,我想选择特定版本并将其与另一个版本进行比较。

我该如何做到这一点?

4个回答

49

要显示一个特定文件的更改历史记录,您可以使用 git log 命令:

git log -p -- path/to/file

-p参数告诉Git显示当前版本与其父版本之间的差异。要获取两个版本之间的累积差异,可以获取这两个版本的ID,并将它们传递给git diff命令:

git diff abc123 def456 -- path/to/file.

其中abc123def456是修订版本的ID。


1
“-p”代表“--patch”,好奇的人可以查看Git文档。另外,为什么“git log -h”这么简短且不太有用呢? - Brad Turek

32

您可以使用以下脚本将文件的所有版本转储到单独的文件中:

例如:

git_all_versions_of path/to/somefile.txt

该程序会在与原始文件相同的文件夹中生成一堆文件,名称类似于以下内容,最新更改的文件名以“1”结尾。请注意,它还会转储另一个以.logmsg结尾的文件,其中包含提交的日志信息。

path/to/somefile.txt.1.0dea419
path/to/somefile.txt.1.0dea419.logmsg
path/to/somefile.txt.2.cdea8s9
path/to/somefile.txt.2.cdea8s9.logmsg
path/to/somefile.txt.3.fdsf2d
path/to/somefile.txt.3.fdsf2d.logmsg
etc...

我倒出所有文件后,只需运行 grep -r DELETED_METHOD_NAME somefile.txt.* 就可以找到我要找的内容。

git_all_versions_of

#!/bin/sh
if [ "$#" -ne 1 ] || [ "$1" == "help" ]
then
  echo "dump all git versions of a file to separate files"
  echo 
  echo "usage: $0 FILENAME";
  echo 
  echo "e.g."
  echo 
  echo "$ $0 path/to/somefile.txt"
  echo 
  echo "path/to/somefile.txt.1.0dea419"
  echo "path/to/somefile.txt.1.0dea419.logmsg"
  echo "path/to/somefile.txt.2.cdea8s9"
  echo "path/to/somefile.txt.2.cdea8s9.logmsg"
  echo "path/to/somefile.txt.3.fdsf2d"
  echo "path/to/somefile.txt.3.fdsf2d.logmsg"
  echo "..."
  exit 1
fi

index=1
for commit in $(git log --pretty=format:%h "$1")
do
  padindex=$(printf %03d "$index")
  out="$1.$padindex.$commit"
  log="$out.logmsg"
  echo "saving version $index to file $out for commit $commit"
  echo "*******************************************************" > "$log"
  git log -1 --pretty=format:"%s%nAuthored by %an at %ai%n%n%b%n" "$commit" >> "$log"
  echo "*******************************************************" >> "$log"
  git show "$commit:./$1" > "$out"
  let index++
done

同时,git_log_short [git_log_message_for_commit&choose_col]也未找到。 - Wolfgang Blessen
不,这个脚本中没有定义git_log_short函数。 - Alex Hall
1
救命稻草!Git 大神来了。 - Chindraba
我修复了Wolfgang和Alex提到的上述错误,并已经将修复内容包含在脚本中。 - Brad Parks
2
非常感谢您在SO问题的答案中提供了一个合理记录的端到端脚本,这是一个巨大的加分项。谢谢!!! - Dan Oblinger

16

使用 Git 的标准 GUI 工具:

 gitk --all -- path/to/file

它显示版本历史,仅列出影响路径为path/to/file的提交。

作为当前()版本和先前()版本之间比较的显示模式,您可以选择:

  • 旧版本
  • 新版本
  • 差异

此外,您可以选择一个提交,然后右键单击另一个提交,并在上下文菜单中选择Diff this -> selected。这样就可以实现您想要的一切。


4
我写了一个工具,可以帮助您完成大部分工作(以SHA-1-WHATEVER格式打印文件的全部内容)。
您可以在此基础上编写一个小型shell脚本以实现自动化操作,或者参考该存储库中的README.markdown文件,了解我编写该命令所需的所有知识来源。 git-cat

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