git checkout <分支名称>和git checkout -b <分支名称>有什么区别

Jul*_*eno 0 git git-checkout

我是git的新手,所以我要进行拳头提交,因此为此我通过输入创建了一个分支git checkout my_branch。但是我在文档中看到它被使用后git checkout -b my_branch

两者之间有什么区别吗?

tor*_*rek 5

是:

$ git checkout asdfadsf
error: pathspec 'asdfasdf' did not match any file(s) known to git
Run Code Online (Sandbox Code Playgroud)

失败因为我没有分支asdfasdf。Git试图将其asdfasdf视为文件名,但我也没有一个文件asdfasdf

$ git checkout -b asdfasdf
Switched to a new branch 'asdfasdf'
Run Code Online (Sandbox Code Playgroud)

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

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

$ git checkout maint
Branch 'maint' set up to track remote branch 'maint' from 'origin'.
Switched to a new branch 'maint'
Run Code Online (Sandbox Code Playgroud)

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

这背后的原因有些复杂,但可以归结为:

  • 没有 -b,如果您要的是您没有的分支,Git将尝试一些替代方法。其中一些可能有效!当它按照maint此处的方式工作时,新分支已经有一个上游集。
  • 使用 -b,Git将只创建分支,而不会询问任何问题(前提是可以创建一个新分支)。新分支将不会设置上游。如果您已经拥有分支,则会收到错误消息。

如果您想要一个具有上游集的分支(例如,如果有一个分支,origin/feature/x123并且您希望自己feature/x123创建的分支与之匹配),那么您就不需要-b选项,因为这样不会搜索上游origin/feature/x123。如果您希望上游设置,需要该-b选项。

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