git 分支的插图

Gitk

返回列表

Gitk 是一个图形存储库浏览器。这是同类产品中的第一个。可以将其视为 git log 的 GUI 封装器。它对于探索和可视化存储库的历史记录很有用。它是用 tcl/tk 编写的,因此可以跨操作系统移植。gitk 由 Paul Mackerras 作为独立项目维护,与 Git 内核分开。为了方便最终用户,稳定版本作为 Git 套件的一部分分发。Gitk 可以为 Git 的新手提供有用的学习辅助工具。

Gitk 概述

对于那些刚接触版本控制的人或从其他版本控制系统(如 Subversion)过渡的人来说,Gitk 可能是一个有用的学习工具。Gitk 是一个与 Git 内核打包在一起的便利实用程序。它提供了一个图形用户界面,有助于可视化 Git 的内部机制。其他受欢迎的 Git GUI 包括 git-gui 和 Atlassian 自己的 Sourcetree

使用

Gitk 的调用方式与 git log 类似。执行 gitk 命令将启动 Gitk 用户界面,其外观与以下内容类似:

左上角的窗格显示对存储库的提交,最新的位于顶部。右下角显示受选定提交影响的文件列表。左下方窗格显示提交详细信息和完整比对。单击右下方窗格中的文件可将左下方窗格中的比对聚焦到相关部分。

Gitk 将反映存储库的当前状态。如果通过单独的命令行用法(例如变更分支)修改存储库状态,则需要重新加载 Gitk。Gitk 可以通过 File(文件)菜单 -> Reload(重新加载)来重新加载。

默认情况下,Gitk 将呈现当前的提交历史记录。Gitk 有各种命令行选项,可以在初始化时传递。这些选项主要限制在 Gitk 的顶级视图中渲染的提交列表。使用这些修订版本选项的一般执行形式如下所示:

选项

    gitk [<options>] [<revision range>] [--] [<path>…]

    <revision range>

格式为 ".." 的修订版本范围可以传递为显示 之间的所有修订版本。或者,也可以传递单个修订版本。

    <path>…

将提交限制到特定的文件路径。要将路径与版本名称隔离开来,请使用 "--" 将路径与之前的任何选项分开。

--all

显示所有分支、标记、引用。

--branches[=<pattern>] --tags[=<pattern>] --remotes[=<pattern>]

显示所选项目(分支、标记、远程存储库),就好像它们是主线提交一样。传递 时,进一步限制引用与指定模式匹配的模式

    --since=<date>

渲染迟于指定日期的提交。

    --until=<date>

渲染早于指定日期的提交。

    --date-order

按日期对提交进行排序。

    --merge

显示修改合并期间发现的冲突文件的提交

    --left-right

呈现信息标签,指明比对提交来自哪一边。左侧的提交以 < 符号为前缀,右侧的提交以 > 符号为前缀。

    --ancestry-path

给出要显示的提交范围时(例如 commit1..commit2 or commit2 commit1),仅显示直接存在于 commit1commit2 之间祖先链上的提交,即既是 commit1 的后代又是 commit2 祖先的提交。(有关更详细的说明,请参阅 git-log(1) 中的“历史记录简化”。)

L<start>,<end>:<file>

强大的选项可让您跟踪给定代码行号范围的历史记录。

讨论和示例

为了提供任何有价值的输出,Gitk 需要一个包含提交历史记录的底层存储库。以下代码是一系列 bash 命令,它将创建一个新的代码存储库,其中包含两个分支,这两个分支已提交并已合并为一个。

    mkdir gitkdemo &&
    cd gitkdemo &&
    git init . &&
    echo "hello world" > index.txt &&
    git add index.txt &&
    git commit -m "added index.txt with hello world content"

这个演示存储库将是使用 Gitk 探索的好例子。此命令序列创建了一个包含 1 次提交和一个 index.txt 文件的新代码存储库。现在我们调用 gitk 来检查代码存储库。

Gitk 可以比较两个提交吗?

继续我们的演示存储库,现在我们来创建一个额外提交:

    echo "prpended content to index" >> index.txt &&
    git commit -am "prepended content to index"

执行后续命令后,需要重新加载 gitk。要么从命令行重新加载 gitk,要么使用 GUI 导航到 File -> Reload。重新加载后,我们应该会看到我们新的 commit

我们可以看到,main 分支引用现在指向了新提交。要比较这两个提交,我们使用左上角的历史记录面板。在历史记录面板中,点击将作为比对基础的提交。选择后,右击第二个提交以打开上下文菜单。

此上下文菜单将提供以下选项

    Diff this -> selected
    Diff selected -> this

选择这两个选项中的任何一个都会导致两个提交之间的比对出现在左下方窗格中,在我们的示例中如下所示:

比对输出向我们表明,index.txt 在两次提交之间添加了一行新的“预置内容需要索引”。

如何使用 Gitk 比较两个分支

继续我们的示例代码存储库,让我们创建一个新分支。

    git checkout -b new_branch &&
    echo "new branch content" > new_branch_file.txt &&
    git add new_branch_file.txt &&
    git commit -m "new branch commit with new file and prepended content" &&
    echo "new branch index update" >> index.txt &&
    git commit -am "new branch commit to index.txt with new content"

接下来的命令序列将创建一个名为 new_branch 的新分支,并将文件 new_branch_file.txt 添加到该分支中。此外,还向 index.txt 中添加了新内容,并为该更新进行了额外提交。我们现在有了一个新分支,比主分支提前 2 次提交。我们必须重新加载 Gitk 以反映这些变更。

这是讨论 Git 分支机制的绝佳学习机会。Gitk 将提交显示为直线提交序列。“分支”一词意味着预计时间线中有“分支”或“分叉”。Git 分支与其他版本控制系统不同。在 Git 中,分支是指向提交的指针。创建提交时,指针会移动到提交处。当您创建 git branch 时,您不会变更存储库或源树结构中的任何内容。您只是在创建一个新指针。

为了比较两个分支之间存在差异的提交,需要在指定的修订范围启动 Gitk。执行 gitk main...new_branch 将打开 Gitk,只有两个分支引用之间的提交

这是一个用于比较分支的强大实用工具。

Gitk 与 Git Gui

Git Gui 是 Git 另一个基于 Tcl/Tk 的图形用户界面。Gitk 专注于浏览和可视化存储库的历史记录,而 Git Gui 则专注于细化单个 commit、单文件注释,不显示项目历史记录。Git Gui 还提供菜单操作来启动 Gitk 进行历史记录探索。也可以通过执行 git gui 从命令行调用 Git Gui。

Gitk 摘要

总之,Gitk 是 git log 的图形界面封装器。Gitk 在可视化和探索存储库历史记录方面非常强大。Gitk 也是学习 Git 内部知识的有用工具。