blog
blog copied to clipboard
Git switch 和 restore 命令
对于经常使用 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>
什么是
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 文档中找到: