[博客翻译]你应该使用的现代Git命令和功能


原文地址:https://martinheinz.dev/blog/109


Martin,2024年3月4日,git

我们这些软件工程师每天都在使用 git,然而大多数人只是使用最基本的命令,比如 add、commit、push 或 pull,好像还停留在 2005 年。但是,Git 自那时起引入了许多特性,使用它们可以让你的生活变得更加轻松,所以让我们来探索一些你应该知道的近期添加的现代 Git 命令。

3.png

切换分支

自 2019 年起,或者更准确地说,在 Git 2.23 版本中引入了 git switch 命令,我们可以使用它来切换分支:

git switch other-branch 

git switch -  # 切换回之前的分支,类似于 "cd -" 

git switch remote-branch  # 直接切换到远程分支并开始跟踪

这很酷,但我们使用 git checkout 命令在 Git 中切换分支已经很久了,为什么需要一个单独的命令呢?git checkout 是一个非常多功能的命令 - 它可以(除其他外)检出或恢复特定文件甚至特定提交,而新的 git switch 只是切换分支。此外,switch 执行额外的合理性检查,checkout 则不会,例如如果操作会导致本地更改丢失,switch 会中止操作。

恢复

在 Git 2.23 版本中添加的另一个新的子命令/功能是 git restore,我们可以使用它来恢复文件到最后一次提交的版本:

# 取消对文件所做的更改,与 "git reset some-file.py" 相同 

git restore --staged some-file.py 

# 取消并丢弃对文件所做的更改,与 "git checkout some-file.py" 相同 

git restore --staged --worktree some-file.py 

# 将文件还原到某个之前的提交,与 "git reset commit -- some-file.py" 相同 

git restore --source HEAD~2 some-file.py

上述代码片段中的注释解释了 git restore 的各种工作方式。一般来说,git restore 替换并简化了 git reset 和 git checkout 的一些用例,这些都是已经过载的特性。另请参阅此文档部分,以比较 revert、restore 和 reset。

稀疏检出

接下来是 git sparse-checkout,这是一个在 Git 2.25 版本中添加的有点晦涩的特性,该版本发布于 2020 年 1 月 13 日。假设你有一个大型的单体仓库,微服务分散在各自的目录中,而像 checkout 或 status 这样的命令因为仓库的大小而非常慢,但也许你真的只需要处理单个子树/目录。好吧,git sparse-checkout 来救场了:

$ git clone --no-checkout https://github.com/derrickstolee/sparse-checkout-example 

$ cd sparse-checkout-example 

$ git sparse-checkout init --cone  # 配置 git 仅匹配根目录中的文件 

$ git checkout main  # 只检出根目录中的文件 

$ ls 

bootstrap.sh  LICENSE.md  README.md 

$ git sparse-checkout set service/common 

$ ls 

bootstrap.sh  LICENSE.md  README.md  service 

$ tree . 

. 

├── bootstrap.sh 

├── LICENSE.md 

├── README.md 

└── service 

    ├── common 

    │   ├── app.js 

    │   ├── Dockerfile 

    ... ...

在上面的例子中,我们首先克隆仓库,但实际上并没有检出所有文件。然后我们使用 git sparse-checkout init --cone 来配置 git,仅匹配仓库根部的文件。因此,运行 checkout 后,我们只有 3 个文件,而不是整个树。然后,要下载/检出特定目录,我们使用 git sparse-checkout set ....。正如已经提到的,这在本地处理巨大仓库时非常方便,但在 CI/CD 中也同样有用,可以提高流水线的性能,当你只想构建/部署单体仓库的一部分,而不需要检出所有内容时。有关 sparse-checkout 的详细文章,请参见这篇文章。

工作树

不常见的情况是,某人可能需要同时在单个应用程序(仓库)中处理多个功能,或者当你正在处理某个功能请求时,突然来了一个紧急的错误。在这些情况下,你要么需要克隆仓库的多个版本/分支,要么你需要存储/丢弃你当时正在进行的任何工作。这些情况的答案是 git worktree,发布于 2018 年 9 月 24 日:

git branch
# * dev
# master

git worktree list
# /.../some-repo  ews5ger [dev]

git wo