Вопрос

Я всегда думал о git reset и git checkout как одно и то же, в том смысле, что оба возвращают проект к определенному коммиту.Однако я чувствую, что они не могут быть точно такими же, так как это было бы излишним.В чем на самом деле разница между ними?Я немного сбит с толку, так как svn имеет только svn co чтобы отменить фиксацию.

ДОБАВЛЕНО

ВонК и Чарльз объяснили различия между git reset и git checkout действительно хорошо.Мое нынешнее понимание таково, что git reset возвращает все изменения обратно к определенному коммиту, тогда как git checkout более или менее готовится к ответвлению.Я нашел следующие две диаграммы весьма полезными для того, чтобы прийти к такому пониманию:

http://a.imageshack.us/img651/1559/86421927.png http://a.imageshack.us/img801/1986/resetr.png

ДОБАВЛЕНО 3

От http://think-like-a-git.net/sections/rebase-from-the-ground-up/using-git-cherry-pick-to-simulate-git-rebase.html, checkout и reset могут эмулировать перебазирование.

enter image description here

git checkout bar 
git reset --hard newbar 
git branch -d newbar 

enter image description here

Это было полезно?

Решение

  • 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 сам указать на другую ветку.

http://git-scm.com/images/reset/reset-checkout.png

На тех моментах, хотя:

Личина добавляет В комментариях:

Однако первый абзац этого ответа вводит в заблуждение: «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 не будет.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top