Я всегда думал об одном git reset
и git checkout
том же, в том смысле, что оба возвращают проект к определенной фиксации. Тем не менее, я чувствую, что они не могут быть точно такими же, поскольку это было бы излишним. Какова реальная разница между ними? Я немного сбит с толку, так как svn svn co
нужно только отменить коммит.
ADDED
VonC и Чарльз объяснили разницу между git reset
и git checkout
очень хорошо. Мое текущее понимание состоит в том, что git reset
все изменения возвращаются к конкретному коммиту, тогда как git checkout
более или менее готовятся к ветке. Я нашел следующие две диаграммы весьма полезными для достижения этого понимания:
ДОБАВЛЕНО 3
Из http://think-like-a-git.net/sections/rebase-from-the-ground-up/using-git-cherry-pick-to-simulate-git-rebase.html оформить заказ и сброс можно эмулировать ребаз.
git checkout bar
git reset --hard newbar
git branch -d newbar
источник
-- files
вариантов; я не уверен.) На этой диаграмме видно, что основное различие заключается в том, влияют ли они на индекс или WD. Смотрите мой ответ по этому поводу. 2-я и 3-я диаграммы очень помогают увидеть реальную разницу. Четвертая и пятая диаграммы полезны для проверки того, понимаете ли вы, что делают эти команды, но на самом деле они вам не помогут.think-like-a-git.net
для предотвращения потери данных требуются дополнительные шаги (приведенные в связанной статье).Ответы:
git reset
конкретно об обновлении индекса , перемещая ГОЛОВУ.git checkout
об обновлении рабочего дерева (до индекса или указанного дерева). Он обновит ГОЛОВКУ только в том случае, если вы извлекаете ветку (если нет, то в конечном итоге вы получаете отдельный ГОЛОВ ).(на самом деле, с Git 2.23 Q3 2019, это будет
git restore
не обязательноgit checkout
)Для сравнения, поскольку svn не имеет индекса, только рабочее дерево
svn checkout
скопирует данную ревизию в отдельный каталог.Более близкий эквивалент для
git checkout
:svn update
(если вы находитесь в той же ветке, то есть тот же URL-адрес SVN)svn switch
(если вы извлекаете, например, ту же ветку, но с другого URL репозитория SVN)Все эти три рабочие модификации дерева (
svn checkout
,update
,switch
) есть только одна команда в мерзавца:git checkout
.Но так как у git есть понятие индекса («промежуточная область» между репо и рабочим деревом), у вас также есть
git reset
.Thinkeye упоминает в комментариях статью « Сброс демистификации ».
По этим пунктам, однако:
LarsH добавляет в комментариях :
Де Ново соглашается в комментариях :
источник
git reset
речь идет об изменении «метки» ветки и, при желании, обновлении индекса или рабочего дерева в качестве побочного эффекта.git checkout
об обновлении рабочего дерева и переключении текущей "выбранной" ветки (theHEAD
).git reset
на 100% оHEAD
. Он работает даже в автономном режиме HEAD ( stackoverflow.com/a/3965714/6309 ), то есть там, где нет ветви (!). git checkout также работает в режиме отсоединенного HEAD или может быть использован для извлечения SHA1 в режиме отсоединенного HEAD: опять же, в этом случае ветвь отсутствует.git checkout a839e8f
обновляет HEAD, чтобы указать, чтобы совершитьa839e8f
.В своей простейшей форме
reset
сбрасывает индекс, не касаясь рабочего дерева, аcheckout
изменяет рабочее дерево, не касаясь индекса.Сбрасывает индекс для соответствия
HEAD
, оставляя рабочее дерево в покое:Концептуально это проверяет индекс в рабочем дереве. Чтобы заставить его действительно что-то делать, вам придется использовать
-f
его для перезаписи любых локальных изменений. Это функция безопасности, которая гарантирует, что форма «без аргументов» не будет разрушительной:Как только вы начинаете добавлять параметры, это правда, что есть некоторое перекрытие.
checkout
обычно используется с веткой, тегом или коммитом. В этом случае он сброситHEAD
и индекс для данного коммита, а также выполнит извлечение индекса в рабочее дерево.Кроме того , если вы поставляете
--hard
кreset
вы можете попросить ,reset
чтобы перезаписать рабочее дерево, а также сброс индекса.Если у вас в настоящий момент есть ветвь, проверенная, есть решающее различие между
reset
иcheckout
когда вы предоставляете альтернативную ветку или коммит.reset
изменит текущую ветвь так, чтобы она указывала на выбранный коммит, тогдаcheckout
как текущая ветвь останется без изменений, но вместо этого извлечет предоставленную ветвь или коммит.Другие формы
reset
иcommit
пути снабжения.Если вы предоставляете пути для
reset
вас, вы не можете предоставить--hard
иreset
только изменит индексную версию предоставленных путей на версию в предоставленном коммите (илиHEAD
если вы не укажете коммит).Если вы указываете пути к
checkout
, какreset
это, он обновит индексную версию предоставленных путей, чтобы соответствовать предоставленной фиксации (илиHEAD
), но он всегда извлечет версию индекса предоставленных путей в рабочее дерево.источник
Один простой случай использования при отмене изменения:
1. Используйте сброс, если вы хотите отменить подготовку измененного файла.
2. Используйте checkout, если вы хотите отменить изменения в неустановленные файлы.
источник
Ключевое отличие в двух словах состоит в том, что
reset
перемещает текущую ссылку на ветвь , аcheckout
нет (перемещает HEAD).Как объясняет книга Pro Git в разделе « Сбросить демистификацию» ,
См. Также ответ VonC для очень полезного отрывка текста и диаграммы из той же статьи, который я не буду здесь дублировать.
Конечно , есть много более подробную информацию о том, что эффекты
checkout
иreset
может иметь по индексу и рабочего дерева, в зависимости от того , используются параметры. Там может быть много сходств и различий между двумя командами. Но, как я понимаю, самое важное различие заключается в том, перемещают ли они кончик текущей ветви.источник
Две команды (сброс и проверка) совершенно разные.
checkout X
НЕ ЯВЛЯЕТСЯreset --hard X
Если X является именем ветви,
checkout X
изменит текущую ветку, покаreset --hard X
не будет.источник
краткая мнемоника:
источник