远程存在时 "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
将报告 upstream
的 bar
分支与您本地的 bar
分支(同样,其内容来自您的 foo
分支)之间的差异。
自己尝试一下很容易。只需选择两个本地不存在的现有远程分支,比如 upstream/branch1
和 upstream/branch2
在你的远程你知道有一些差异。验证 git diff upstream/branch1 upstream/branch2
是否存在差异。现在检查没有 -b
标志的第一个分支:
git checkout branch1
现在您应该有一个名为 branch1
的本地分支。再次检查这是否与上游版本匹配:git diff upstream/branch1 branch1
。应该没有区别。接下来,尝试使用 -b
标志创建 branch2
:
git checkout -b branch2
现在您应该有一个本地 branch2
,但它应该与 branch1
和 upstream/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/develop
和upstream/develop
。 DWIM 模式将不起作用,因为 git checkout develop
不知道是使用 origin/develop
还是 upstream/develop
。
这两个命令之间有很多区别。
当你使用
git checkout myRemoteBrench
如果分支已经存在,它只会切换你的分支。
但是当你使用
git checkout -b myRemoteBranch
首先它检查提到的分支是否存在,如果不存在它创建一个具有给定名称的新分支并切换到它。
如果我有一个远程分支,我可以在本地做 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
将报告 upstream
的 bar
分支与您本地的 bar
分支(同样,其内容来自您的 foo
分支)之间的差异。
自己尝试一下很容易。只需选择两个本地不存在的现有远程分支,比如 upstream/branch1
和 upstream/branch2
在你的远程你知道有一些差异。验证 git diff upstream/branch1 upstream/branch2
是否存在差异。现在检查没有 -b
标志的第一个分支:
git checkout branch1
现在您应该有一个名为 branch1
的本地分支。再次检查这是否与上游版本匹配:git diff upstream/branch1 branch1
。应该没有区别。接下来,尝试使用 -b
标志创建 branch2
:
git checkout -b branch2
现在您应该有一个本地 branch2
,但它应该与 branch1
和 upstream/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
。如果你现在 nodevelop
是有用的,但是 do bothorigin/develop
和upstream/develop
。 DWIM 模式将不起作用,因为git checkout develop
不知道是使用origin/develop
还是upstream/develop
。
这两个命令之间有很多区别。 当你使用
git checkout myRemoteBrench
如果分支已经存在,它只会切换你的分支。
但是当你使用
git checkout -b myRemoteBranch
首先它检查提到的分支是否存在,如果不存在它创建一个具有给定名称的新分支并切换到它。