Git 的新命令: switch and restore

“当我看到有 push 时,我会首先使用 pull 来避免冲突” - 无名氏

对于那些使用过 git 一段时间的人来说,很少会注意到它最近更新了什么内容。也就是说,如果不包括大多数人并不知道的 git plumbing (译者注:可参阅 Git Internals - Plumbing and Porcelain ) 命令的话,这句话更适用。让我感到意外的是,我最近在高级命令列表中发现了两个新命令:

  • git restore
  • git switch

要了解为什么它们会出现,首先得回顾一下我们的老朋友 git checkout

在这里插入图片描述

Checkout this

git checkout 是使新手对 git 感到困惑的原因之一,这是因为它的作用是依赖上下文的。
很多人使用该方法在本地切换分支。更准确地说,是切换 HEAD 指向的分支。举例来说,如果你在 main 分支上,你可以使用下面的命令切换到 develop 分支:

git checkout develop

你也可以使你的 HEAD 指向指定的 commit ,而不是分支(达到所谓的 HEAD 分离状态):

git checkout f8c540805b7e16753c65619ca3d7514178353f39

事情变得棘手的地方在于,如果在命令中,将一个文件作为参数而不是分支或 commit ,该命令会放弃该文件的本地更改并将其恢复到目标分支的状态。
举例来说,如果你切换到 develop 分支并改变了 test.txt 中的一些内容,接下来你可以使用以下命令将该文件恢复到该分支的最后修改版本:

git checkout -- test.txt

疯狂的方法

如果你第一次注意到上述的两个行为,可能会觉得没有任何意义,为什么一个命令执行2个不同的命令?其实事情比这要更精妙一些。,如果我们查看 git documentation , 可以看到这个命令有个通常被忽略的参数:

git checkout <tree-ish> -- <pathspec>

什么是 <tree-ish> ?它可以表示很多不同的东西,但最常见的是表示为 commit 的 hash 或分支名。默认情况下,表示的是当前分支,但它可以是任何其他分支或 commit。因此,如果你在 develop 分支中希望将变动的 test.txt 文件转移到 main 分支,可以这样做:

git checkout main -- test.txt

考虑到这一点,该命令的这两个行为可能就变得有意义了。当你只提供一个分支或 commit 作为 git checkout 的参数时,它会将所有的文件还原为相应分支的最后修改版本,但如果还指定了文件名,它就会只将该文件的变更转移到指定的分支或 commit 。

在这里插入图片描述

新的指令

即使在阅读了前文所讲的内容后觉得事情变得有意义,但我们必须承认它仍然让人感到困惑,尤其是对新手而言。
这就是为什么在 2.23 of git 版本中,引入了两条命令用于替换 checkout( git checkout 仍旧可以使用,但刚接触 git 的人最好从这里开始)。如你所期望的,将 git checkout 一分为二,新的命令基本上分别实现了前面描述的两种行为。

Switch

该命令实现了 git checkout 参数仅有分支名的行为,因此你可以使用它在分支或 commits 之间切换。

git switch develop

虽然使用 git checkout 可以切换 commit 和改变 HEAD 的分离状态,但默认情况下 git switch 不允许这样做,你需要提供一个 -d 参数:

git switch -d f8c540805b7e16753c65619ca3d7514178353f39

另一个不同是,git checkout 可以使用 -b 参数创建并切换到一个新分支:

git checkout -b new_branch

你也可以在 git switch 中做同样的事,只不过参数为 -c

git switch -c new_branch

Restore

该命令实现了 git checkout 参数为文件名时的行为。顾名思义,你可以将文件的状态恢复到指定的 git 分支版本(默认为当前分支):

git restore -- test.txt

总结

上述的两个方法目前仍被标记为实验阶段,但是出于它们产生的目的和意图,它们会被保留。所以我鼓励每个人都开始使用这两个方法,因为可能对你来说更有意义,同时也对新手更加友好。

关于这两个命令的详细文档,请参阅:


作者:DRAGOS BAROSAN

原文链接:https://www.banterly.net/2021/07/31/new-in-git-switch-and-restore/

猜你喜欢

转载自blog.csdn.net/yotcap/article/details/119348649