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

khbbv19g  于 2023-02-02  发布在  Git
关注(0)|答案(6)|浏览(252)

git checkout -b foofoo分支上切换(即使它不存在,也会创建),但如果foo分支已经存在,则会抛出如下错误:

fatal: A branch named 'foo' already exists.

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

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

xjreopfe1#

2019年第三季度更新(Git 2.23):现在实际上有一个git switch command

git switch -c aBranch

或者,如果分支已存在:

git switch aBranch

不过,您需要一个类似的别名,它尝试 first 切换到现有分支,如果失败(因为分支可能实际上 not exist),则创建它:

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

注意别名的名称:switchoc(用于“切换或创建”)。
正如jar在评论中指出的:
任何在2021年尝试此操作的人,请注意您不能使用别名隐藏现有的git命令
由于git switch是一个git命令,所以这个别名(名为“switch“)不起作用。您必须为别名创建唯一的名称,如“switchit“或其他名称。
评论中下面提到的bgusach的别名更安全(基于Jiří Pavelkaanswer):

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

git switch abranch

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

git checkout -B foo

git checkout man page开始:
如果给定-B,则在<new_branch>不存在时创建;否则,它将被重置。这相当于事务性

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

如下所述,使用时要小心,因为它会重置分支,这并不总是可取的。
如果您使用此命令错误地重置了分支,请使用you can easily revert to its previous state

git reset HEAD@{1}
idv4meu8

idv4meu82#

同意ssmith的观点。有同样的问题,-B没有解决它,因为重置。他的解决方案有效,但我的解决方案看起来更简单:

git checkout foo || git checkout -b foo

这对我很有效:)

    • 编辑**

无错误输出iff foo不存在

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

iecba09b3#

请注意一个相当重要的事实,-B将在 checkout 一个现有分支之前 * 重置 * 它,根据@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"
v6ylcynt

v6ylcynt4#

命令checkout -b创建一个新分支,然后 checkout 到该分支。因此,如果分支已经存在,则不能创建新分支。
相反,您需要:

git checkout -B <branchname>

上面的命令是上下文相关的,如果有分支,它就切换,如果没有,它就创建并 checkout 。

lh80um4z

lh80um4z5#

这与乔治的建议没有太大的不同,但是它并不依赖于“gitcheckout“的状态,而是检查是否存在,然后决定要使用的命令

git show-branch <branch> &>/dev/null && git checkout <branch> || git checkout -b <branch>
31moq8wy

31moq8wy6#

尝试git switch foo(不带-c)。

相关问题