使用 Git,我想列出给定文件的所有不同版本。
然后,我想选择特定版本并将其与另一个版本进行比较。
我该如何做到这一点?
要显示一个特定文件的更改历史记录,您可以使用 git log
命令:
git log -p -- path/to/file
-p
参数告诉Git显示当前版本与其父版本之间的差异。要获取两个版本之间的累积差异,可以获取这两个版本的ID,并将它们传递给git diff
命令:
git diff abc123 def456 -- path/to/file.
其中abc123
和def456
是修订版本的ID。
您可以使用以下脚本将文件的所有版本转储到单独的文件中:
例如:
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.*
就可以找到我要找的内容。
#!/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 的标准 GUI 工具:
gitk --all -- path/to/file
它显示版本历史,仅列出影响路径为path/to/file
的提交。
作为当前(新)版本和先前(旧)版本之间比较的显示模式,您可以选择:
此外,您可以选择一个提交,然后右键单击另一个提交,并在上下文菜单中选择Diff this -> selected。这样就可以实现您想要的一切。