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

时间:2018-10-08 20:05:44

标签: git git-branch git-checkout

如果我有一个远程分支机构,则可以在本地进行git checkout MyRemoteBranch,它将正常工作。通过正常工作,我的意思是它将创建一个名为MyRemoteBranch的本地分支并切换到该分支,该本地分支将跟踪远程服务器。

在这种情况下,我什么时候必须传递-b参数?遥控器确实存在时,以下内容之间有什么区别?

git checkout MyRemoteBranch

Vs

git checkout -b MyRemoteBranch

4 个答案:

答案 0 :(得分:1)

  

在这种情况下,我什么时候必须传递-b参数?遥控器确实存在时,以下内容之间有什么区别

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

所以,让我们说:1)您当前在自己的分支机构foo中; 2)您有一个名为upstream的遥控器; 3)该遥控器具有一个名为bar的分支。如果您说:

git checkout bar

然后,您将切换到fooupstream分支的本地副本(假设您的仓库已经知道foo,因为您最近做过git fetch )。换句话说,如果您这样做:

git diff upstream/bar

然后git将不会报告差异。

但是,如果您赋予-b标志:

git checkout -b bar

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

git diff upstream/bar

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

自己尝试很容易。只需选择两个本地不存在的远程分支,例如说您的远程站点上的fooupstream/branch1会有所不同。验证与upstream/branch2之间存在差异。现在签出不带git diff upstream/branch1 upstream/branch2标志的第一个分支:

-b

现在,您应该有一个名为 git checkout branch1 的本地分支。再次检查与上游版本是否匹配:branch1。不应有任何差异。接下来,尝试使用git diff upstream/branch1 branch1标志创建一个branch2

-b

现在您应该有一个本地 git checkout -b branch2 ,但它应该与branch2branch1中的内容匹配。验证:

upstream/branch1

答案 1 :(得分:1)

Caleb's answer是正确的(我对此表示赞同),但此处用更精确的符号表示:

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

  • git checkout name尝试使用名称​​ {name 检出现有分支。

    • 如果由于 name 不存在而失败,则继续进行第二步,Git文档有时将其称为“ DWIM”模式: Do What我的意思是

    • “ DWIM”步骤检查您的所有远程跟踪名称:origin/nameupstream/name(如果您有名为 upstream 的远程标识符,依此类推)上。如果完全匹配,它将执行以下操作:

      git checkout -b name remote-tracking-name

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

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

  • 为完整起见,我们还应该提及git checkout --track remote-tracking name,例如git checkout --track upstream/develop。这将查找远程跟踪名称,然后使用它使用相同的名称创建一个新的(本地)分支:在这种情况下,它将创建一个新的分支develop,就像您要运行{{1} }。如果您现在暂时没有 git checkout -b develop upstream/develop,但是 do 同时具有 develop origin/develop。 DWIM模式不起作用,因为upstream/develop不知道使用git checkout develop还是origin/develop

答案 2 :(得分:0)

git checkout MyRemoteBranch是远程存储库中此分支的时间

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

答案 3 :(得分:0)

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

git checkout myRemoteBrench

仅在分支已经存在时切换分支。

但是当您使用

git checkout -b myRemoteBranch

首先检查所提到的分支是否存在,如果不存在,则使用给定名称创建一个新分支并切换到该分支。