Разница между git reset и git checkout

В чем разница в действительном эффекте следующих двух команд? Разве они оба не делают так, чтобы промежуточная область и рабочий каталог соответствовали последней фиксации?

git reset --hard

git checkout <sha-of-latest-commit>


person pkaramol    schedule 02.01.2015    source источник
comment
Это действительно дубликат? Этот другой вопрос очень широкий, но этот очень конкретный и требует конкретного ответа.   -  person michas    schedule 02.01.2015
comment
Вторая команда переведет вас в состояние отдельной HEAD.   -  person Ashwani    schedule 02.01.2015


Ответы (2)


git reset --hard отменяет все изменения файлов в рабочем дереве.

git checkout <sha-of-latest-commit> сохраняет эти изменения.

Есть еще одно отличие в случае, когда ваш HEAD ссылается на ветку (НЕ в режиме отдельной HEAD).

git checkout <sha-of-latest-commit> отсоединит ГОЛОВУ.

git reset --hard не отсоединяет ГОЛОВУ.

person Victor Yarema    schedule 02.01.2015

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
person michas    schedule 02.01.2015
comment
Это также не меняет рабочее дерево или индекс. Неправда. - person jub0bs; 02.01.2015
comment
Не могли бы вы объяснить? Я привел подробный пример выше, показывающий отсутствие изменений в индексе и рабочем дереве. (Если вы не укажете явный путь.) - person michas; 02.01.2015