git checkout <branch_name> 和 git checkout -b <branch_name> 有区别吗

Is there any difference between git checkout <branch_name> and git checkout -b <branch_name>

我是 git 的新手,所以我要第一次提交,为此我通过键入 git checkout my_branch 创建了一个分支。这工作得很好。但是当我在文档中看到它被使用后 git checkout -b my_branch

它们之间有什么区别吗?

当您 运行 使用 -b 时,您是在告诉 git 为您创建分支。 git 不带 -b 的结帐要求分支已经存在才能工作。

是:

$ git checkout asdfadsf
error: pathspec 'asdfasdf' did not match any file(s) known to git

这失败了,因为我没有有一个分支asdfasdf。 Git 试图将 asdfasdf 视为文件名,而我 也没有 一个名为 asdfasdf 的文件。

$ git checkout -b asdfasdf
Switched to a new branch 'asdfasdf'

这成功并创建了一个新分支。

另一方面,我没有一个名为maint的分支,但是:

$ git checkout maint
Branch 'maint' set up to track remote branch 'maint' from 'origin'.
Switched to a new branch 'maint'

这也创建了一个 分支,maint。但请注意它看起来有何不同。它仍然说 Switched to a new branch,但是 first 它说 Branch 'maint' set up to track remote branch 'maint' from 'origin'.

这背后的原因有点复杂,但归结为:

  • 没有 -b,如果你要求一个你没有的分支,Git会尝试一些替代方法。其中一些可能有效!当它按照 maint 此处的方式工作时,新分支已经设置了 upstream
  • With -b, Git 只会创建 分支,不问任何问题(前提是创建一个新的分支是可能的)。新分支不会与上游建立。如果您已经有分支,则会出现错误。

如果您想要 一个带有上游集合的分支——例如,如果有一个 origin/feature/x123 并且您希望创建自己的 feature/x123 来匹配——您 想要-b 选项,因为那样不会搜索上游origin/feature/x123。如果你想要一个上游集,你想要想要-b选项。

(是否以及何时需要为您设置上游是一个单独的问题。在 Whosebug 中搜索现有答案。)