当远程存在时,“checkout”和“checkout -b”之间的区别?

San*_*a K 1 git git-checkout git-branch

如果我有一个远程分支,我可以在本地执行git checkout MyRemoteBranch并且它会正常工作。我所说的工作正常是指它将创建一个名为 MyRemoteBranch 的本地分支并切换到它,并且该本地分支将跟踪远程分支。

那么这种情况下,什么时候需要传递-b参数呢?当遥控器存在时,以下有什么区别:

git checkout MyRemoteBranch
Run Code Online (Sandbox Code Playgroud)

VS

git checkout -b MyRemoteBranch
Run Code Online (Sandbox Code Playgroud)

Cal*_*leb 6

那么什么时候需要传递-b参数呢?当遥控器确实存在时,以下有什么区别

不同之处在于,如果您传递该-b标志,则会使用您指定的名称并基于创建该分支时所在的分支git创建一个新分支。如果没有该标志,git将查找现有分支,包括您正在跟踪的任何远程存储库中的分支,如果找到,则切换到其中之一。

所以,假设:1)你目前在你自己的分支中,名为foo;2)你有一个名为 的遥控器upstream;3)该远程有一个名为 的分支bar。如果你说:

git checkout bar
Run Code Online (Sandbox Code Playgroud)

foo然后你将切换到分支的本地副本upstream(假设你的存储库已经知道,foo因为你最近做了一个git fetch)。换句话说,如果你这样做:

git diff upstream/bar
Run Code Online (Sandbox Code Playgroud)

然后git将报告没有差异。

但是,如果你给出-b标志:

git checkout -b bar
Run Code Online (Sandbox Code Playgroud)

然后git将创建一个分支,该分支恰好也被命名为bar,但其内容与您刚刚所在的分支相同foo。换句话说:

git diff upstream/bar
Run Code Online (Sandbox Code Playgroud)

upstream将报告的bar分支和您的本地bar分支(再次从您的分支获取其内容)之间的差异foo

自己尝试一下很容易。只需选择两个本地不存在的现有远程分支(例如,upstream/branch1upstream/branch2您知道的远程分支上存在一些差异)即可。验证是否存在差异git diff upstream/branch1 upstream/branch2。现在检查第一个没有-b标志的分支:

 git checkout branch1
Run Code Online (Sandbox Code Playgroud)

现在您应该有一个名为 的本地分支branch1。再次检查这是否与上游版本匹配:git diff upstream/branch1 branch1。应该没有差异。接下来,尝试创建一个branch2using-b标志:

 git checkout -b branch2
Run Code Online (Sandbox Code Playgroud)

现在您应该有一个 local ,但它应该与和 中branch2的内容匹配。核实:branch1upstream/branch1

 git diff upstream/branch1 branch2      # should be no diffs
 git diff upstream/branch2 branch2      # should be like diffing branch1 and upstream/branch2
Run Code Online (Sandbox Code Playgroud)