远程存在时 "checkout" 和 "checkout -b" 之间的区别?

Difference between "checkout" and "checkout -b" when remote exists?

如果我有一个远程分支,我可以在本地做 git checkout MyRemoteBranch,它会工作得很好。工作正常我的意思是它将创建一个名为 MyRemoteBranch 的本地分支并切换到它,这个本地将跟踪远程。

在这种情况下,什么时候必须传递-b参数?当遥控器确实存在时,下面的区别是什么:

git checkout MyRemoteBranch

VS

git checkout -b MyRemoteBranch

git checkout MyRemoteBranch 是什么时候这个分支已经在远程存储库中

git checkout -b MyRemoteBranch 使用这个 -b 你可以在本地创建一个新分支,无论它是否不在远程

In this case, when do I have to pass the -b parameter? What is the difference between the below when the remote does exist

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

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

git checkout bar

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

git diff upstream/bar

然后 git 将报告没有差异。

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

git checkout -b bar

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

git diff upstream/bar

将报告 upstreambar 分支与您本地的 bar 分支(同样,其内容来自您的 foo 分支)之间的差异。

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

 git checkout branch1

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

 git checkout -b branch2

现在您应该有一个本地 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

是正确的(我已经赞成)但这里的表示法更精确:

  • git checkout -b <em>name</em> 尝试创建一个新的分支名 name,使用当前(HEAD)提交作为新分支的哈希 ID。如果分支名称已经存在,则此操作失败。

  • git checkout <em>name</em> 尝试使用名称 [=47] 检出现有分支=]name.

    • 如果因为 name 不存在而失败,它会继续第二步,Git 文档有时会调用"DWIM" 模式:Do What I Mean.

    • DWIM 步骤检查您所有的远程跟踪名称:origin/<em>name</em>,upstream/<em>name</em> 如果您有一个名为 upstream 的遥控器,依此类推。如果 恰好有一个 匹配,它执行相当于:

      git checkout -b <em>name</em> <em>remote-tracking-name</em>

      如您所见,它比原来的 -b 选项多了一个参数。

  • git checkout -b <em>name</em> <em>commit-specifier</em>——您可以根据需要手动调用,但由 DWIM 模式为您调用——尝试创建一个新的分支名称 name,使用给定的 commit-specifier 作为新分支的哈希 ID。如果名称存在 如果您现在不能 git checkout 该特定提交哈希 ID,则此操作失败。 (有关何时可以或不能切换到另一个提交的更多信息,请参阅 Checkout another branch when there are uncommitted changes on the current branch。)

  • 为了完整性,我们还应该提到 git checkout --track <em>remote-tracking name</em> ,例如 git checkout --track upstream/develop。这会查找远程跟踪名称,然后使用它来创建一个新的(本地)分支,使用相同的名称:在这种情况下,它将创建一个新分支 develop,就好像你 运行 git checkout -b develop upstream/develop。如果你现在 no develop 是有用的,但是 do both origin/developupstream/develop。 DWIM 模式将不起作用,因为 git checkout develop 不知道是使用 origin/develop 还是 upstream/develop

这两个命令之间有很多区别。 当你使用

git checkout myRemoteBrench

如果分支已经存在,它只会切换你的分支。

但是当你使用

git checkout -b myRemoteBranch

首先它检查提到的分支是否存在,如果不存在它创建一个具有给定名称的新分支并切换到它。