Разница между "git branch-f" и "git checkout; git reset --hard" под чистым рабочим деревом?

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

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

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

git branch -f <branch_name> <hash>

и

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

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

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 только a одним файлом будут записаны на диск, т. е. тот, который содержит <commithash> ссылка <branchname>.