2015-01-26 3 views
14

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

Тогда я наткнулся на this question, но ответы и комментарии не объясняют в деталях различия между ними.

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

git branch -f <branch_name> <hash> 

и

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

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

ответ

15

Основное отличие заключается в том, что 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>.

+0

Полный ответ. Я удалил мой. +1 – VonC

Смежные вопросы