打开另一个分支(如果不存在则创建),而不检查是否已经存在?


74

git checkout -b foofoo分支上打开(即使它不存在,它也会被创建),但是如果foo分支已经存在,它会引发如下错误:

fatal: A branch named 'foo' already exists.

以下命令检查什么命令?

  • 如果分支已经存在,只需打开它(git checkout foo
  • 如果该分支不存在,则创建它并打开它(git checkout -b foo

Answers:


83

更新Q3 2019(Git 2.23):现在实际上是一个git switch命令

git switch -c aBranch 

但是,您将需要一个类似的别名:

switch = "!f() { git switch $1 2>/dev/null || git switch -c $1; }; f"

以下注释中提到的bgusach别名更安全(基于JiříPavelka回答):

switch = "!f() { git checkout $1 2>/dev/null || git checkout -b $1; }; f"

git switch abranch

原始答案(2014年),您可以尝试:

git checkout -B foo

git checkout手册页

如果-B给定,<new_branch>则创建它(如果不存在);否则,将被重置。这是交易的等价物

$ git branch -f <branch> [<start point>]
$ git checkout <branch>

如下所述,请谨慎使用它,因为它会重置分支,这并不总是可取的。
如果您确实使用此命令错误地重置了分支,则可以使用以下命令轻松恢复到其先前的状态

git reset HEAD@{1}


谢谢,git老师!:-)在4分钟内接受。
尼卡比曹

12
请注意,这-B重置分支,请参阅我的答案以找到(更长的...)替代方案。
ssmith

@ssmith我意识到了这一点(并已回答了您的问题),但是我仍然更喜欢这种(简单的)方法。
VonC

1
不要使用这个。它经常会破坏您的分支,并让您头痛不已,将它带回来...
bgusach

3
-1,因为答案有误导性。OP和大多数读者期望的行为是“如果分支已经存在,则将其打开(git checkout foo)”。但是此答案中的第一行代码做了非常不同的事情。是的,下面将对此进行解释,但是人们首先阅读并尝试的是这种误导性代码。
Nick Volynkin

65

同意史密斯。遇到相同的问题,-B但没有解决,请重置。他的解决方案有效,但是我的解决方案看起来更简单:

git checkout foo || git checkout -b foo

这对我行得通 :)

编辑

没有错误输出iff foo不存在

git checkout foo 2>/dev/null || git checkout -b foo

2
是的,更简单,更短。=)然而,有一个相当小的警告,如果“ foo”作为分支(例如:标签)以外的其他东西存在,它将签出而不是创建分支,但这是一个非常好的例子。
ssmith

另一个小警告,如果分支不存在,则会在输出中显示错误。@ssmith解决方案更干净。+1仍然是为了简化
Gabriele Petronella

@GabrielePetronella只是隐藏错误输出,请参见编辑
George Pavelka,2016年

@JiříPavelka,谢谢,但是,在我的用例中,我需要输出,但仅是成功注释之一。
加布里埃尔·彼得罗内拉

1
真好 我为此做了一个别名...以防万一它对某人有帮助:switch = "!f() { git checkout $1 2>/dev/null || git checkout -b $1; }; f"
bgusach

22

注意-B重置的相当重要的事实在签出之前现有分支,根据他的问题,我不认为@Ionica希望这样做。

我当然没有,所以我能想到的最好的一线是:

git checkout $(git show-ref --verify --quiet refs/heads/<branch> || echo '-b') <branch>

可以将其设置为方便的别名,如下所示:

[alias]
  # git cob <branch>
  cob = "!f() { git checkout $(git show-ref --verify --quiet refs/heads/\"$1\" || echo '-b') \"$1\"; }; f"

8

该命令checkout -b创建一个新分支,然后签出到该分支。因此,如果分支已经存在,则无法创建新分支。

相反,您需要执行以下操作:

git checkout -B <branchname>

上面的命令以上下文相关的方式执行。如果有分支,它将切换,如果没有,它将创建并签出。


它不能创建一个新的。-我要处理。
尼卡比曹

@IonicăBizău补充了。
Praveen Kumar Purushothaman 2014年

3
“它创建并签出”……并重置分支。
bfontaine

2

与George Pavelka的建议没有太大不同,但是它不依赖于“ git checkout”的状态,而是检查是否存在,然后确定要使用的命令

git show-branch <branch> &>/dev/null && git checkout <branch> || git checkout -b <branch>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.