В простейшем виде reset
сбрасывает индекс, не касаясь рабочего дерева, а checkout
меняет рабочее дерево, не касаясь индекса.
Сбрасывает индекс для соответствия HEAD
, рабочее дерево остается в покое:
git reset
Концептуально это проверяет индекс в рабочем дереве. Чтобы заставить его действительно что-то делать, вы должны будете использовать -f
, чтобы заставить его перезаписывать любые локальные изменения. Это функция безопасности, позволяющая убедиться, что форма «без аргументов» не является разрушительной:
git checkout
Как только вы начинаете добавлять параметры, это правда, что есть некоторое перекрытие.
checkout
обычно используется с веткой, тегом или коммитом. В этом случае он сбросит HEAD
и индекс для данного коммита, а также выполнит извлечение индекса в рабочее дерево.
Также, если вы поставите --hard
на reset
, вы можете попросить reset
перезаписать рабочее дерево, а также сбросить индекс.
Если у вас есть проверенная ветвь, между reset
и checkout
есть критическая разница, когда вы предоставляете альтернативную ветку или коммит. reset
изменит текущую ветвь так, чтобы она указывала на выбранный коммит, тогда как checkout
оставит текущую ветку в покое, но вместо этого извлечет предоставленную ветвь или коммит.
Другие формы reset
и commit
включают пути снабжения.
Если вы указываете пути к reset
, вы не можете указать --hard
, а reset
изменит только индексную версию предоставленных путей на версию в предоставленном коммите (или HEAD
, если вы не укажете фиксации).
Если вы указываете пути к checkout
, например reset
, он обновляет индексную версию предоставленных путей, чтобы соответствовать предоставленной фиксации (или HEAD
), но всегда извлекает версию индекса предоставленных путей в рабочее дерево.