Включить другую ветвь (создать, если не существует), не проверяя, существует ли она уже?
git checkout -b foo
включает ветвь foo
(даже если она не существует, она создана), но если ветвь foo
уже существует, она выдает такую ошибку:
fatal: A branch named 'foo' already exists.
Что делает команда, выполняющая следующую проверку?
- Если ветка уже существует, просто включите ее (
git checkout foo
)
- если ветвь не существует, создайте ее и включите (
git checkout -b foo
)
Ответы
Ответ 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>