В чем разница между “git reset” и “git checkout”?
-
30-09-2019 - |
Вопрос
Я всегда думал о git reset
и git checkout
как одно и то же, в том смысле, что оба возвращают проект к определенному коммиту.Однако я чувствую, что они не могут быть точно такими же, так как это было бы излишним.В чем на самом деле разница между ними?Я немного сбит с толку, так как svn имеет только svn co
чтобы отменить фиксацию.
ДОБАВЛЕНО
ВонК и Чарльз объяснили различия между 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, checkout и reset могут эмулировать перебазирование.
git checkout bar
git reset --hard newbar
git branch -d newbar
Решение
git reset
конкретно о Обновление индекса, двигая голову.git checkout
около Обновление рабочего дерева (к указанному или указанному дереву). Он обновит голову, только если вы оформить филиал (если нет, вы заканчиваете отсоединенная головка).
(на самом деле, с Git 2.23 Q3 2019, это будетgit restore
, не обязательноgit checkout
)
По сравнению, поскольку SVN не имеет индекса, только рабочее дерево, svn checkout
Скопируйте данную редацию в отдельном каталоге.
Чем ближе эквивалент для git checkout
было бы:
svn update
(Если вы находитесь в той же ветке, что означает тот же SVN URL)svn switch
(Если вы оформить, например, ту же филиал, но из другого URL SVN REPO)
Все эти три модификации рабочих деревьев (svn checkout
, update
, switch
) иметь только одну команду в Git: git checkout
.
Но поскольку Git имеет также понятие индекса (эта «промежуточная зона» между репо и рабочим деревом), у вас также есть git reset
.
Тонкий упоминание В комментариях статья "Сбросить demystified ".
Например, если у нас есть две ветви,
master
' а также 'develop
«Указывая на разных коммитах, и мы сейчас находимся»develop
'(так что головы указывает на него), и мы бежимgit reset master
, 'develop
Сам теперь будет указывать на то же самое, что «master
' делает.С другой стороны, если мы вместо этого бегу
git checkout master
, 'develop
«Не будем двигаться,HEAD
Сама будет.HEAD
теперь будет указывать наmaster
'.Итак, в обоих случаях мы движемся
HEAD
указывать на совершениеA
, Но как мы это делаем, очень иначе.reset
переместит веткуHEAD
Указывает, оформление заказаHEAD
сам указать на другую ветку.
На тех моментах, хотя:
Личина добавляет В комментариях:
Однако первый абзац этого ответа вводит в заблуждение: «
git checkout
... обновит голову, только если вы оформить филиал (если нет, вы заканчиваете отдельную головку) ».
Не правда:git checkout
Обновите голову, даже если вы оформить заказ, это не ветвь (и да, вы в конечном итоге с отдельной головой, но это все еще обновлено).git checkout a839e8f updates HEAD to point to commit a839e8f.
Де Но Ново соглашаться В комментариях:
@Larsh правильно.
Вторая пуля имеет неправильное представление о том, какой головке будет обновлять голову, только если вы оформить филиал.
Голова идет куда угодно, как тень.
Проверяя некоторую не филиал Ref (например, тег), или Committion напрямую, будет двигаться головой. Отсоединенная голова не означает, что вы отсоединены от головы, это означает, что голова отделена от филиала Ref, которую вы можете видеть, например,git log --pretty=format:"%d" -1
.
- Прикрепленные головки начнутся с
(HEAD ->
,- отдельно по-прежнему покажет
(HEAD
, но не будет стрела в филиал Ref.
Другие советы
В их простейшей форме, 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
) Но он всегда будет проверять указательную версию прилагаемых путей в рабочее дерево.
Один простой корпус использования при возврате изменения:
1. Используйте RESET, если вы хотите отменить постановку модифицированного файла.
2. Используйте оформление заказа, если вы хотите отказаться от изменений в ненужденных файлах / с.
Атлассиан дать нам отличное объяснение о Git Reset., Git Checkout. и так, Git Revert.. Отказ В этой статье объясняется различные виды использования этих команд на разных уровнях - файле, устроили снимок и коммит.
https://www.atlassian.com/git/tutorials/resetting-checking-out-ounding-ourting.
Ключевое отличие в двух словах заключается в том, что reset
перемещает текущую ссылку на ветвь, в то время как checkout
не делает (он двигает ГОЛОВОЙ).
Как объясняется в книге Pro Git в разделе Сброс Демистифицированных,
Первое, что
reset
сделаю это переместите то, на что указывает ГОЛОВА.Это не то же самое, что изменение самой ГОЛОВКИ (что именноcheckout
делает);reset
перемещает ветку на что указывает ГОЛОВА.Это означает, что если HEAD установлен вmaster
ветвь (т.е.в данный момент вы находитесь наmaster
филиал), запущенныйgit reset 9e5e6a4
начнем с того, что сделаемmaster
указать на9e5e6a4
.[курсив добавлен]
Смотрите также ответ VonC на вопрос очень полезный отрывок из текста и диаграммы из той же статьи, которую я не буду здесь дублировать.
Конечно, есть гораздо больше подробностей о том, какие эффекты checkout
и reset
может влиять на индекс и рабочее дерево, в зависимости от того, какие параметры используются.Между этими двумя командами может быть много сходств и различий.Но, на мой взгляд, самое важное различие заключается в том, перемещают ли они верхушку текущей ветви.
Две команды (сброс и оформление заказа) совершенно разные.
checkout X
НЕ ЯВЛЯЕТСЯ reset --hard X
Если X является именем ветви,checkout X
изменит текущий ветвь в то время как reset --hard X
не будет.