`checkout -B` против`symbolic-ref`
Следующие команды эквивалентны? Если нет, в чем различия?
git checkout -B a_branch
а также
git branch -f a_branch HEAD
git symbolic-ref HEAD refs/heads/a_branch
Смотрите также этот пост.
1 ответ
Да, они очень близки, настолько, что они могут быть идентичными.
Вы можете остановиться здесь, остальное, потому что выше, это особый случай
Они становятся намного менее близкими, если вы слегка измените один из них. Учтите, что вы можете использовать это как:
git checkout -B name commit-specifier
а также просто:
git checkout -B name
что фактически означает:
git checkout -B name HEAD
Как сказано в документации, -b
а также -B
флаги являются "транзакционным эквивалентом" некоторой альтернативной последовательности команд. Если эти команды будут (или не выполнятся) где-то по пути, -b
или же -B
действие подавлено. А также git checkout commit-specifier
на самом деле может потерпеть неудачу, если у вас есть незафиксированные изменения, которые будут перезаписаны при оформлении заказа.
Тем не мение, git checkout HEAD
никогда недолжен подвести. Учитывая, что это на самом деле не потерпит неудачу, транзакционный характер -B
операция становится неважной. Итак, теперь мы посмотрим, что в документации сказано, что это транзакционный эквивалент:
$ git branch -f <branch> [<start point>] $ git checkout <branch>
Мы знаем, что отправной точкой является HEAD
, так:
git branch -f a_branch HEAD
правильно: это соответствует первой команде. И мы знаем, что git checkout <the commit we are already on>
по сути не работает (не меняет индекс и рабочее дерево) и git checkout a_branch
в конечном итоге делает:
git symbolic-ref HEAD refs/heads/a_branch
как его последняя операция, так:
git checkout -B a_branch
"средства":
- ничего не делать с индексом и рабочим деревом (что успешно);
- если это успешно (что это делает), сброс
a_branch
на текущий коммит; а также - если это удастся (что это делает), сделать
HEAD
Ссылаться наa_branch
,
Если мы добавим начальную точку, шаг 1 может завершиться неудачей, а шаг 2, если он будет выполнен, сделает что-то другое.