Разница между `git branch -f <имя_интерфейсa> <hash>` и `git checkout <имя_папки>; git reset --hard <hash> `под чистым рабочим деревом?

До сих пор я всегда использовал git checkout <branch_name>; git reset --hard <hash> для перемещения ветки назад к более раннему фиксации.

Затем я наткнулся на этот вопрос, но ответы и комментарии не объясняют в деталях различия между ними.

Предполагая, что у меня есть чистое рабочее дерево, какие внутренние различия существуют между

git branch -f <branch_name> <hash>

и

git checkout <branch_name>
git reset --hard <hash>

и выполняются ли такие различия, если таковые имеются, какие-либо незначительные последствия для расширенного использования?

Ответы

Ответ 1

Основное отличие состоит в том, что git branch -f <branchname> <commitref> перемещает <branchname> для указания указанного фиксации без касания HEAD, индекса или рабочей копии, а git checkout <branchname> && git reset --hard <commitref> изменяет все три.

Если вы хотите быстро переставить ветки без перемещения HEAD или изменения текущего рабочего дерева, тогда git branch -f - хороший способ сделать это. Он также будет работать, если у вас есть незафиксированные изменения, что не всегда возможно, если вы используете git checkout.

Еще одно отличие связано с производительностью, но оно имеет отношение только к очень крупным проектам.
В этих случаях изменение рабочего дерева с помощью git checkout и git reset --hard может быть дорогостоящей операцией с большим количеством дисковых операций ввода-вывода. С другой стороны, при git branch -f на диске будет записан только один файл, т.е. Тот, который содержит <commithash>, на который ссылается <branchname>.