与其他任何技术或技能一样,仅仅阅读关于 Git 的内容并不能让你精通它,也不能让你成为“高级”用户。现在是深入研究 Git 中我发现有用的工具的时候了,希望这些工具能帮助你更好地使用 Git。
Git reflog
在我之前的文章中,我写了关于 Git 历史记录,它是一系列提交,这对于大多数目的来说是一个非常好的模型。但是,Git 实际上会记住你使用 Git 所做的*一切*,而不仅仅是提交。你可以使用 git reflog 查看你最近的完整历史记录。

(Dwayne McDaniel, CC BY-SA 4.0)
reflog
引用的日志位于 .git/logs
中,它被称为 HEAD。打开这个文件,你可以快速看到最近所做的所有操作。在 .git/logs/HEAD
中,你会看到与 reflog
命令输出相对应的行。
你可以检出 reflog 中的任何状态。无论你做什么,Git 都会为你提供一种简单的方式来将你的文件恢复到以前的状态!
要检出以前的状态,请使用以下命令
git checkout HEAD@{<#>}
将 <#> 替换为你想要引用的 HEAD 之后的状态数。例如,如果我想检出我在示例中执行上次 git pull
之前的状态,我将使用命令 git checkout HEAD@{5}
这样做会将 Git 置于分离头状态,因此如果我想保留任何我想做的更改,我需要从那里创建一个新的分支。
默认情况下,你的 reflog 会保留至少 30 天,之后 Git 才会清理其历史记录。但它不会丢弃这些信息;它会将其压缩成更紧凑的形式。你不需要等待 Git 来整理。你可以随时使用 garbage 来完成。
Git gc (垃圾回收)
即使你的 .git
文件夹中的对象和文件的大小很小并且高度压缩,当存在大量项目时,Git 也会开始变慢。毕竟,从 1,000 个引用的列表中查找条目比从只有少数条目的列表中查找更耗时。Git 会不时执行内部垃圾回收步骤,打包所有未主动使用的对象和文件。然后它将它们塞进一个高度压缩的包文件中。
但是你不需要等待 Git 决定清理未使用的对象。你可以随时使用 git
gc
命令触发此操作。

(Dwayne McDaniel, CC BY-SA 4.0)
下次你在本地进行了数百次提交,或者你只是注意到 Git 提交花费的时间比平时稍长,请尝试运行 git gc
。它可能会加快速度。
Git bisect
git bisect
命令是一个强大的工具,它可以快速检出一个已知良好状态和一个已知错误状态之间的中间提交,然后要求你将该提交识别为良好或错误。然后它重复这个过程,直到你找到有问题的代码首次引入的确切提交。
Git worktree
想象一下,你正在一个分支中工作,非常深入地添加新的依赖项,并且还没有准备好进行任何提交。突然,你的寻呼机响了。生产环境中发生了紧急情况,你需要放下一切,切换到 hotfix 分支,并快速构建该补丁。
现在是做决定的时候了。你是可以交叉手指,进行提交,并希望你记住你离开的地方吗?你是使用 git stash
,这可能会导致依赖问题,也意味着你必须记住你在存储时到底在做什么吗?或者你只是检出另一个分支,使用不同的文件夹,并像往常一样工作吗?
最后一个选项听起来可能好得令人难以置信,但这正是 Git worktree 允许你做的事情。
通常,使用 Git,你一次只能检出一个分支。这是有道理的,因为你现在知道 Git 使用 HEAD 跟踪活动分支,而 HEAD 一次只能引用一个引用。
Git worktree 通过在存储库文件夹之外创建分支的副本来绕过此限制。Git 知道存在另一个文件夹,并且在其中进行的任何提交都需要在原始 repo 文件夹中进行说明。但是分支的副本也有自己的 HEAD 文件,用于跟踪 Git 在另一个位置指向的位置!

(Dwayne McDaniel, CC BY-SA 4.0)
Git 始终至少打开一个 worktree,你可以通过运行以下命令来查看
git worktree list
此命令显示 .git
所在的当前文件夹、最近的提交 ID 以及行尾当前检出的分支的名称。
你可以使用以下命令将更多条目添加到 worktree 列表中
git worktree add /path-to-new-folder/<branch-name>
add
指令会在指定路径创建一个新文件夹,名称与目标分支相同。Git 还会将 repo 的链接副本发送到该文件夹,并且该分支已经检出。要在该分支中工作,你所需要做的就是更改目录,然后像往常一样进行工作。
当你准备好返回之前被中断的原始工作时,只需直接更改回原始文件夹。你的工作处于你之前离开时的确切状态。
当你完成并且想要清理自己之后,使用命令 git worktree remove /path-to-new-folder/<branch-name>
删除任何你想要的 worktree 项
使用 Git worktree 的一些警告
-
如果一个分支被分配给一个 worktree,你不能像往常一样检出它。尝试检出已经检出的分支会引发错误。
-
最好尽快删除任何不需要的 worktree 条目。当多个分支被检出时,运行其他 Git 操作可能会发生错误。
-
在使用像 VS Code 这样的代码编辑器时,在终端中更改目录不会自动更改编辑器中打开的文件夹。记住通过文件菜单打开所需的文件夹,以确保你正在修改正确版本的项目文件。
Git 还有很多
虽然我感觉我已经涵盖了很多内容,但我实际上只是触及了 Git 可能实现的表面。构建补充 Git 的整个应用程序是可能的,并且可以进一步扩展。幸运的是,当学习 Git 时,你也可以转向很多资源。
我建议每个人阅读的一本书是绝对免费的,你可以立即下载它。Pro Git Book 详细介绍了 Git 的工作原理,并给出了许多优秀的示例。但是,关于这本书的一个警告是,它有点过时了。从 git-scm 网站链接的免费版本来自 2014 年。尽管如此,这本书为你提供了关于 Git 如何工作的最佳基础知识,并有助于使任何其他与 Git 相关的主题更易于访问。
还有 速查表 和 文章 可以帮助你立即成为 Git 专家。但是正如我在这篇文章前面所说,学习 Git 或任何其他技能的唯一方法是练习、练习、再练习。
评论已关闭。