“当我看到一扇带有推动标志的门时,我会先拉动以避免冲突” - 匿名对于那些使用 git 一段时间的人来说,你很少会发现关于它的新事物。也就是说,如果您排除我们大多数人可能不知道的管道命令,并且很可能会更好。令我惊讶的是,我最近在高级命令列表中发现了大约 2 个新增内容: 要了解它们为什么会出现,让我们首先访问我们的老朋友 git checkout。 git checkout 是新手觉得 git 令人困惑的众多原因之一。那是因为它的效果是依赖于上下文的。大多数人使用它的方式是切换本地仓库中的活动分支。更确切地说,切换 HEAD 指向的分支。例如,如果你在主分支上,你可以切换到开发分支:你也可以让你的 HEAD 指针引用一个特定的提交而不是一个分支(达到所谓的分离的 HEAD 状态):事情变得棘手的地方在于如果您提供一个文件作为参数而不是分支或提交,它将放弃您对该文件的本地更改并将其恢复到分支状态。例如,如果您签出开发分支并对 test.txt 文件进行了一些更改,那么您可以将文件恢复为分支的最新提交:如果您首先查看这两种行为,您可能会认为它没有任何意义,为什么一个命令执行 2 个不同的操作?嗯,事情比这要微妙一些。如果我们查看 git 文档,我们可以看到该命令有一个通常被省略的额外参数:
什么是 <tree-ish> ?它可以表示很多不同的东西,但最常见的是表示提交哈希或分支名称。默认情况下,它被视为当前分支,但它可以是任何其他分支或提交。因此,例如,如果我们在开发分支中并且想要将您的 test.txt 文件更改为来自主分支的版本,您可以这样做:考虑到这一点,也许事情开始变得有意义了。当您只提供一个分支或提交作为 git checkout 的参数时,它会将您的所有文件更改为相应修订版中的版本,但是如果您还指定了文件名,它只会更改该文件的状态以匹配指定的修订版。因此,即使在阅读前几段之后事情可能开始变得有意义,我们必须承认它仍然令人困惑,尤其是对于新手而言。这就是为什么在 git 2.23 版本中,引入了两个新命令来替换旧的 git checkout(git checkout 仍然可用,但 git 新手最好从这些命令开始)。如您所料,它们基本上都实现了前面描述的两种行为之一,将 git checkout 一分为二。这个实现了 git checkout 仅针对分支名称运行时的行为。因此,您可以使用它在分支或提交之间切换。虽然使用 git checkout 您可以切换到提交并转换为分离的 HEAD 状态,但默认情况下 git switch 不允许这样做。您需要提供 -d 标志:另一个区别是,使用 git checkout,您可以使用 -b 标志在一个命令中创建并切换到新分支: git checkout -b new_branch 您可以对新分支执行相同操作,但是标志是 -c: git switch -c new_branch
这个实现了 git 在针对文件运行时的行为。顾名思义,您可以将文件的状态恢复到指定的 git 修订版(默认情况下为当前分支)这些方法仍标记为实验性的,但出于所有意图和目的,它们将保留,因此我无论如何都鼓励每个人都开始使用它们,因为它们可能会在您的脑海中变得更有意义,并且它也会让 git 对新用户来说不那么令人困惑。