Git switch 和 restore 命令

831 阅读3分钟

对于经常使用 git 的人来说,很少有机会发现关于 git 的新东西。我最近发现在高级命令列表中增加了 2 个新功能:

  • git restore
  • git switch

为了理解为什么新增这两个命令,我们先回顾一下经常使用的 git checkout 这个命令。

Git checkout

有些新手刚开始使用 git checkout 时会感到困惑。这是因为它造成的结果依赖于传入的参数。

下面我们看一下 git checkout 的几个使用场景

  • 切换本地分支,更准确的说法是,切换 HEAD 指针指向的分支,比如,你可以从 develop 分支切换到 main 分支:

      git checkout main
    
  • 切换 HEAD 指针指向一个特定的 Commit

      git checkout f8c540805b7e16753c65619ca3d7514178353f39
    
  • 恢复文件到上次提交的状态

    如果输入的参数是一个文件名而不是分支名或者 commit,它将丢弃你对这个文件的修改并重置到上一次的 commit 版本状态。

      git checkout test.text
    

看到这上面几种行为,你可能会认为它没有任何意义,为什么一个命令做两个不同的动作?如果我们查看 git 文档,我们可以看到命令有一个额外的参数,通常被忽略:

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

什么是 ?它可以表示很多不同的东西,但最常见的是表示提交 commit 值或分支名称。默认情况下,它被认为是当前分支,但它可以是任何其他分支或 commit。例如,如果你在 develops 分支,想要将 test.txt 文件更改为来自 main 分支的版本,你可以这样做:

 git checkout main -- test.txt

看到这里,也许事情开始变得有意义了。当你为 git checkout 提供一个分支或 commit 参数时,它会将你的所有文件更改为相应版本中的状态,但如果你也指定了一个文件名,它只会更改该文件的状态以匹配指定的版本。

新增的命令

即使我们现在知道了 git checkout 的多种用法,我们必须承认,它对于新手仍然是困惑的。这就是为什么在 git 的 2.23 版本中,引入了两个新命令来取代旧的 git checkout(它仍然可用,但新使用 git 的人最好从这些命令开始)。它们分别实现了 git 的多种行为中的一种。

Switch

可以使用这个命令来在分支或 commit 之间切换

  git switch develop

不同于 git checkout 切换 commit 直接提供 commit hash, 使用 switch 切换 commit 时需要加 -d 标志

  git switch -d f8c540805b7e16753c65619ca3d7514178353f39

同时切换并新增一个本地分支时需要加 -c 标志

  git checkout -b new_branch

  git switch -c new_branch

Restore

可以将文件的状态恢复到指定的 git 版本 (默认为当前分支)

  git restore -- test.txt

总结

相比较于 git checkout,这两个命令更加的清晰。

关于这两个命令的更多细节可以在 git 文档中找到:

更多前端后端内容