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

Ion*_*zău 53 git branch

git checkout -b foo切换foo分支(即使它不存在,它被创建),但如果foo分支已经存在,它会抛出这样的错误:

fatal: A branch named 'foo' already exists.
Run Code Online (Sandbox Code Playgroud)

执行以下检查的命令是什么?

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

Von*_*onC 70

你可以试试:

git switch -c aBranch 
Run Code Online (Sandbox Code Playgroud)

git switch手册页:

如果git checkout给定,-B则在不存在时创建; 否则,它被重置.这是交易的等价物

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

如下所述,请谨慎使用它,因为它会重置分支,这并不总是令人满意的.
如果您使用此命令错误地重置了分支,则可以使用以下命令轻松恢复到之前的状态:

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

git switch abranch
Run Code Online (Sandbox Code Playgroud)

bgusach在评论中提到的别名更安全(基于JiříPavelka回答):

git checkout -B foo
Run Code Online (Sandbox Code Playgroud)

  • 注意`-B`将_reset_分支,请参阅我的答案(更长...)替代. (11认同)
  • -1,因为答案具有误导性。OP 和大多数读者期望的行为是“如果分支已经存在,只需打开它(git checkout foo)”。但是这个答案中的第一行代码做了非常不同的事情。是的,它在下面进行了解释,但人们首先阅读并尝试的是这种误导性代码。 (4认同)

Geo*_*lka 53

同意史密斯.有同样的问题,-B并没有解决它,因为重置.他的解决方案有效,但我的解决方案看起来更简单

git checkout foo || git checkout -b foo
Run Code Online (Sandbox Code Playgroud)

这对我行得通 :)

编辑

没有错误输出iff foo不存在

git checkout foo 2>/dev/null || git checkout -b foo
Run Code Online (Sandbox Code Playgroud)

  • 注意:如果 `foo` 与存储库中的文件匹配,这将检查_该文件_并恢复对其的更改。@ssmith 的答案更安全一些。 (3认同)
  • 是的,更简单,更短.然而,有一个相当小的警告,如果"foo"作为一个分支以外的东西存在(例如:标签)它会检查出来而不是创建分支,但这是一个相当优势的案例. (2认同)

ssm*_*ith 21

请注意一个相当重要的事实,-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"
Run Code Online (Sandbox Code Playgroud)


Pra*_*man 6

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

相反,你需要做:

git checkout -B <branchname>
Run Code Online (Sandbox Code Playgroud)

上述命令以上下文敏感的方式执行.如果有分支,则切换,如果没有,则创建并结帐.

  • "它创建并结帐"......并重置分支. (3认同)