Подтвердить что ты не робот

Включить другую ветвь (создать, если не существует), не проверяя, существует ли она уже?

git checkout -b foo включает ветвь foo (даже если она не существует, она создана), но если ветвь foo уже существует, она выдает такую ​​ошибку:

fatal: A branch named 'foo' already exists.

Что делает команда, выполняющая следующую проверку?

  • Если ветка уже существует, просто включите ее (git checkout foo)
  • если ветвь не существует, создайте ее и включите (git checkout -b foo)
4b9b3361

Ответ 1

Обновление 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 является более безопасным (на основании ответа Иржи Павелки):

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

git switch abranch

Оригинальный ответ (2014) Вы можете попробовать:

git checkout -B foo

Из git checkout страницы git checkout:

Если -B, <new_branch> создается, если его не существует; в противном случае он сбрасывается. Это транзакционный эквивалент

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

Как упомянуто ниже, используйте его с осторожностью, так как он сбрасывает ветку, что не всегда желательно.
Если вы сбросили ветку по ошибке с помощью этой команды, вы можете легко вернуться к ее предыдущему состоянию с помощью:

git reset [email protected]{1}

Ответ 2

Согласовано с мастером. Если бы одна и та же проблема и -B не решает ее, то cz reset. Его решение работает, однако мое решение выглядит проще:

git checkout foo || git checkout -b foo

Это работает для меня:)

ИЗМЕНИТЬ

Без вывода ошибки iff foo не существует

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

Ответ 3

Обратите внимание на довольно важный факт, что -B будет reset существующей веткой, прежде чем проверять ее, что я не верю, что @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"

Ответ 4

Команда checkout -b создает новую ветку и затем проверяет ее. Итак, если ветвь уже существует, она не может создать новую.

Вместо этого вам нужно сделать:

git checkout -B <branchname>

Вышеуказанная команда выполняется с учетом контекста. Если есть ветка, она переключается, если нет, она создает и выполняет проверку.

Ответ 5

Не очень отличается от того, что предложил Джордж Павелка, но вместо того, чтобы полагаться на статус "git checkout", он проверяет наличие и затем решает использовать команду

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