Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Git switch 和 restore 命令 #25

Open
lvwxx opened this issue Aug 21, 2021 · 0 comments
Open

Git switch 和 restore 命令 #25

lvwxx opened this issue Aug 21, 2021 · 0 comments

Comments

@lvwxx
Copy link
Owner

lvwxx commented Aug 21, 2021

对于经常使用 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 文档中找到:

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant