В чем разница в действительном эффекте следующих двух команд? Разве они оба не делают так, чтобы промежуточная область и рабочий каталог соответствовали последней фиксации?
git reset --hard
git checkout <sha-of-latest-commit>
В чем разница в действительном эффекте следующих двух команд? Разве они оба не делают так, чтобы промежуточная область и рабочий каталог соответствовали последней фиксации?
git reset --hard
git checkout <sha-of-latest-commit>
git reset --hard
отменяет все изменения файлов в рабочем дереве.
git checkout <sha-of-latest-commit>
сохраняет эти изменения.
Есть еще одно отличие в случае, когда ваш HEAD ссылается на ветку (НЕ в режиме отдельной HEAD).
git checkout <sha-of-latest-commit>
отсоединит ГОЛОВУ.
git reset --hard
не отсоединяет ГОЛОВУ.
git reset --hard
эквивалентен git reset --hard HEAD
, то есть делает вашу точку ветвления на HEAD (то есть NOP), а также сбрасывает индекс и рабочее дерево на одно и то же содержимое.
git checkout
с буквальным значением sha1 войдет в режим отдельной головы, то есть вы больше не будете в своей ветке. Это также не меняет рабочее дерево или индекс.
Посмотреть на себя:
$ git init
$ touch a b
$ git add .
$ git commit -m 1
$ echo 1 >a; echo 1 >b; git add a #do some changes
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
modified: a
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: b
$ git reset --hard
$ git status # still on master, changes are gone
On branch master
nothing to commit, working directory clean
$ echo 1 >a; echo 1 >b; git add a #redo changes
$ git checkout HEAD@{0}
$ git status #no longer on master, changes are still there
HEAD detached at be924ba
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
modified: a
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: b