Разница между "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>
.