如何列出文件的所有不同版本,并将它们区分开来?

问题描述 投票:21回答:4

使用git,我想列出给定文件的所有不同修订版。

然后,我想选择一个特定的版本,并在另一个版本时进行比较。

我怎样才能做到这一点?

git
4个回答
24
投票

要显示特定文件的更改历史记录,可以使用git log

git log -p -- path/to/file

-p告诉它显示每个修订版本与其父版本之间的差异。要获得两个修订版之间的累积差异,请获取两个修订版的ID,并将它们传递给git diff

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

其中abc123def456是修订版ID。


12
投票

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

EG

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.*来找到我正在寻找的东西。

git_dump_all_versions_of_啊_file.是

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

6
投票

使用git的标准GUI工具:

 gitk --all -- path/to/file

它显示了剥离到影响path/to/file的提交的版本历史记录。

作为当前(新)版本和前一个(旧)版本之间进行比较的显示模式,您可以选择:

  • 旧版本或
  • 新版本或
  • DIFF

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


1
投票

我写了一个工具,可以帮助你完成大部分工作(打印出文件的全部内容,就像在SHA-1-WHATEVER中一样)。

git-cat

您可以在其上放置一个小的shell脚本来自动执行所有操作,或者该存储库中的README.markdown文件也提供了我在哪里学习编写命令所需的所有内容的参考。

© www.soinside.com 2019 - 2024. All rights reserved.