有没有一个快速的git命令来查看旧版本的文件?

在git中是否有一个命令(转储到标准输出,或$PAGER$EDITOR )特定版本的特定文件?

你可以使用git show

 $ git show REVISION:path/to/file 

例如,要显示文件src/main.c的第4次提交,请使用:

 $ git show HEAD~4:src/main.c 

请注意,path是从存储库的根目录开始的,除非以./或../开头以指示相对path。 有关更多信息,请查看git-show的手册页。

按date做这件事情是这样的:

 git show HEAD@{2013-02-25}:./fileInCurrentDirectory.txt 

请注意, HEAD@{2013-02-25}表示“此仓库中使用reflog ”的“ 2013AD-25AD ”,而不是“2013-02-25在此历史logging中的最后一次提交”。

如果你喜欢GUI,你可以使用gitk:

  1. 开始与gitk:

     gitk /path/to/file 
  2. 在屏幕顶部select修订版本,例如按说明或date。 默认情况下,屏幕的下半部分显示该版本的差异(对应于“补丁”单选button)。

  3. 要查看选定修订的文件

    • 点击“树”单选button。 这将显示该修订版本的文件树的根目录。
    • 深入到你的文件。

您还可以使用git show命令指定commit hash (通常也称为commit ID )。


简而言之

git show <commitHash>:/path/to/file


一步步

  1. git log /path/to/file显示给定文件的所有更改的git log /path/to/file
  2. 在显示的更改列表中,它显示commit hash ,如commit 06c98... (06c98 …是提交散列)
  3. 复制commit hash
  4. 运行命令git show <commitHash>:/path/to/file使用步骤3的commit hash和步骤1的path/to/file

注意:在指定相对path时添加./似乎很重要, git show b2f8be577166577c59b55e11cfff1404baf63a84:./flight-simulation/src/main/components/nav-horiz.html

除了Jim Hunziker的回答之外,

您可以从修订版本导出文件,

 git show HEAD@{2013-02-25}:./fileInCurrentDirectory.txt > old_fileInCurrentDirectory.txt 

希望这可以帮助 :)

git log -p会显示提交日志,还会显示每个提交(除了合并提交)的差异。 然后你可以按/ ,input文件名,然后按enter 。 按np键进入下一个/上一个发生。 这样你就不会只看到文件的变化,而且还看到提交信息。

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

例如

 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... 

git_dump_all_versions_of_a_file.sh

 ROOT_FOLDER=$(git_root) 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 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