使用git,我想列出给定文件的所有不同修订版。
然后,我想选择一个特定的版本并在另一个版本中进行比较。
我该怎么做?
答案 0 :(得分:24)
要显示特定文件的更改历史记录,您可以使用git log
:
git log -p -- path/to/file
-p
告诉它显示每个修订版及其父版本之间的差异。要获得两个修订版之间的累积差异,请获取两个修订版的ID,并将其传递给git diff
:
git diff abc123 def456 -- path/to/file.
其中abc123
和def456
是修订ID。
答案 1 :(得分:13)
您可以使用这样的脚本将文件的所有版本转储到单独的文件中:
e.g。
git_dump_all_versions_of_a_file.sh 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.*
来查找我正在寻找的内容。
function show_help()
{
echo "dump all git versions of a file to separate files"
echo
echo "usage: FILENAME";
echo
echo "e.g."
echo
echo "$ git_dump_all_versions_of_a_file.sh 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;
}
if [ "$1" == "help" ]
then
show_help
fi
if [ -z "$1" ]
then
show_help
fi
ROOT_FOLDER=$(git rev-parse --show-toplevel)
CURR_DIR=$(pwd)
if [ "$ROOT_FOLDER" != "$CURR_DIR" ]
then
echo "Switch to the root of the repo and try again. Should be in $ROOT_FOLDER"
exit
fi
function git_log_message_for_commit
{
IT=$(git log -1 --pretty=format:"%an, %s, %b, %ai" $*)
echo $IT
}
function git_log_short
{
git log --oneline --decorate $*
}
function choose_col
{
COL=$1
if [ -z "$2" ]
then
OPTS=
else
OPTS="-F\\${2}"
fi
awk $OPTS -v col="$COL" '{print $col}'
}
cd $ROOT_FOLDER
FILENAME=$*
HASHES=$(git_log_short $FILENAME | choose_col 1)
INDEX=1
for HASH in $HASHES
do
INDEX_OUT=$(printf %03d $INDEX)
OUT_FILENAME="$FILENAME.$INDEX_OUT.$HASH"
OUT_LOG_FILENAME="$FILENAME.$INDEX_OUT.$HASH.logmsg"
echo "saving version $INDEX to file $OUT_FILENAME for hash:$HASH"
echo "*******************************************************" >> $OUT_LOG_FILENAME
git_log_message_for_commit $HASH >> $OUT_LOG_FILENAME
echo " $HASH:$FILENAME " >> $OUT_LOG_FILENAME
echo "*******************************************************" >> $OUT_LOG_FILENAME
git show $HASH:$FILENAME >> $OUT_FILENAME
let INDEX=INDEX+1
done
答案 2 :(得分:6)
使用git的标准GUI工具:
gitk --all -- path/to/file
它会显示剥离到影响path/to/file
的提交的版本历史记录。
作为当前( new )版本与之前(旧)版本之间进行比较的显示模式,您可以选择:
此外,您可以选择提交,然后右键单击另一个提交,然后选择 Diff this - >在上下文菜单中选择。你想要的一切。
答案 3 :(得分:2)
我写了一个工具,可以帮助你完成大部分工作(打印出文件的全部内容,就像在SHA-1-WHATEVER中一样。
你可以在它上面放一个小的shell脚本来自动完成所有操作,或者该存储库中的README.markdown文件也提供了我学习编写命令所需的所有内容的参考。