查看历史记录

Azure DevOps Services | Azure DevOps Server 2022 - Azure DevOps Server 2019

Visual Studio 2019 | Visual Studio 2022

Git 使用提交元数据(如父链接、作者详细信息和时间戳)来跟踪存储库中的更改历史记录。 可以查看 Git 历史记录,以查明文件的更改时间、更改人员和更改内容。

当用户使用拉取请求创建功能分支并将其合并到目标分支时,目标分支的开发历史记录可能无法按时间顺序排列为直线。 因此,在查看目标分支上文件的更改历史记录时,请记住,提交顺序受合并策略和合并日期的影响,而不仅仅是更改的原始日期。 例如,main 分支上的最新提交可能会引入数周前在功能分支中进行的更改,该分支刚刚使用三向合并合并到 main 分支中。

本文介绍如何执行以下操作:

  • 比较文件版本
  • 还原文件
  • 比较分支

要了解如何配合使用 Visual Studio 2022 与 Git,请参阅 Visual Studio 如何使用 Git 简化版本控制

比较文件版本

如果要弄清楚特定文件更改的发生方式和时间,可能需要比较不同提交(可能在不同的分支中)中同一文件的不同版本。

git diff 命令可以比较不同分支的不同提交中同一文件的不同版本。 git log 命令可帮助识别包含要比较的文件版本的提交。

  1. 使用 git log 并指定一个文件,以列出更改了该文件的提交:

    控制台
    git log <file>  
    

    默认情况下,命令输出从当前分支中的最新提交开始,然后通过访问每个提交元数据中的父链接向后循环访问上级提交(无论分支如何)。

    下面是 git log index.html 命令的输出示例:

    输出
    commit bbc3b679197b659544a6f8070c79fb535b496613
    Date:   Thu Jun 30 13:42:50 2021 -0400
    
        update landing page
    
    commit e5402fe710c25eca1b96a4e238eee9c01ed41c6a
    Date:   Thu Jun 30 13:42:23 2021 -0400
    
        initial commit
    
  2. 使用 git diff 并指定一个文件和两个提交,以查看提交的文件版本有何不同:

    控制台
    git diff <commit1> <commit2> <file>
    

    下面是 git diff bbc3b67 e5402fe index.html 命令的输出示例:

    输出
    -   <link rel="stylesheet" href="app.cs"/>   
    +   <link rel="stylesheet" href="fabrikam.cs"/>
    

    输出显示删除了一行,并添加了一行。

限制 Git log 输出

限制] git log 列出的提交,可以按作者、日期、消息、和更改的内容等进行筛选。 例如:

  • git log --author=frank@fabrikam.com index.html 仅列出指定作者的提交。

  • git log --since="2022-5-1" 仅列出在指定日期之后创建的提交。

  • git log --before="yesterday" 仅列出在指定的相对日期之前创建的提交。

  • git log --grep="css change" 仅列出其消息中具有指定文本的提交。

  • git log -S"myVariable" 仅列出引入或移除指定字符串的提交。

  • git log -G"myVar.*" 仅列出引入或移除指定正则表达式字符串的提交。

  • git log -3 仅列出最后三个提交。

设置 Git log 输出的格式

提交列表有多个格式选项。 例如:

  • git log --abbrev-commit 使用缩写 ID(SHA-1 校验和)列出提交。

  • git log --oneline 以单行缩写格式列出每个提交。

  • git log --patch index.html 一起列出每个提交以及更改的差异。

还原文件

可以从 Git 历史记录还原文件的特定版本,即使在之后的提交中对该文件进行了编辑、删除或重命名。 还原较旧版本的文件不会创建包含更改的新提交。 要使用还原的文件版本更新分支,需要提交更改。

可以使用 git checkoutgit show 命令从 Git 历史记录还原特定版本的文件。

  • 如果指定了文件和提交,git checkout 会将文件还原为之前提交的版本:

    控制台
    git checkout <commit> <file>
    

    例如,git checkout 85435fac src/app.tssrc/app.ts 文件还原为其在提交 85435fac 中的版本。

  • git show 输出之前提交的文件版本的内容,可以将其重定向到输出文件:

    控制台
    git show <commit>:<file> > <output file>
    

    例如,git show 85435fac:src/app.ts > /archive/oldapp.ts 将提交 85435facapp.ts 的内容写入 /archive/oldapp.ts

提示

要查找先前提交的 ID,请参阅比较文件版本查找提交 ID

比较分支

可以比较任何本地或远程分支,以查看合并变基所导致的更改。 通过分支比较,可检查合并冲突,并查看其他人的更改对你的工作有何影响。

Visual Studio 2019 及更早版本不支持分支比较,因此,如果使用其中某个版本,并且存储库托管在 Azure Repos 或 GitHub 中,则可以使用 Git 命令行Web 浏览器比较分支。 Visual Studio 2022 支持分支比较,如比较分支中所述。

要比较任何两个本地或远程分支,可以使用 Git diff 命令指定分支名称:

控制台
git diff <branch1> <branch2>

Git 将一个分支顶端的提交与另一个分支顶端的提交进行比较。 差异输出显示两个分支中每个文件之间的删除内容和添加内容。

下面是命令 git diff users/frank/feature origin/main 的输出示例,该命令将本地分支与远程分支进行比较:

输出
index 36843b8..03afc4b 100644
--- a/tsapp/index.html
+++ b/tsapp/index.html
@@ -4,7 +4,7 @@
 <head>
     <meta charset="utf-8" />
     <title>TypeScript HTML App</title>
-    <link rel="stylesheet" href="fabrikam-test.css" type="text/css" />
+    <link rel="stylesheet" href="fabrikam.css" type="text/css" />
     <script src="app.js"></script>
 </head>
 ...
--- a/tsapp/app.ts
+++ b/tsapp/app.ts
     constructor(element: HTMLElement) {
         this.element = element;
-        this.element.innerHTML += "The time is: ";
+        this.element.innerHTML += "The time is now: ";
         this.span = document.createElement('span');
         this.element.appendChild(this.span);
         this.span.innerText = new Date().toUTCString();

要缩小与特定文件的比较范围,请在 diff 命令中指定文件:

控制台
git diff <branch1> <branch2> <file>

例如,git diff users/frank/feature origin/main index.html 仅针对 index.html 文件生成差异。

后续步骤