Сравните использование checkout или hard reset для отмены git commit - PullRequest
4 голосов
/ 03 января 2012

Если я использую:

$ git reset --hard HEAD~N

или

$ git checkout HEAD~N

Оба будут использовать версию HEAD~N для изменения рабочего каталога и области рабочей области.

Есть ли разница между этими двумя командами?
Спасибо.

Ответы [ 3 ]

4 голосов
/ 03 января 2012

git checkout HEAD~N предназначен для проверки фиксации и не требует обработки, поскольку создает состояние отдельного заголовка. Если вы хотите сбросить (текущий заголовок ветви) на конкретный коммит, вы используете git reset [--hard]

2 голосов
/ 03 января 2012

Первый изменит ветку так, чтобы она указывала на указанный вами коммит. Коммиты, которые были впереди этого, будут потеряны, если на них нет другой ссылки (ветка или тег). Существует reflog (git reflog), который хранит историю того, что было извлечено (по умолчанию это сохраняет ценность последних 90 дней)

Второй переключит ветку на то, что вы указали. Поскольку вы указали фиксацию, а не локальную ветку, вы не будете отслеживать любые изменения, которые вы фиксируете здесь. За исключением reflog, вы потеряете эти коммиты, которые были сделаны после первой проверки, когда вы делаете последующую проверку, отличную от текущей фиксации или HEAD.

Третий способ, которым вы можете "отменить" работу, это поместить "-". после вашей второй команды. Это изменит ваше рабочее дерево до состояния, в котором находятся файлы в указанном вами коммите. У вас все равно будет проверена та же ветка, и она все равно будет указывать на тот же коммит. Когда вы запустите «git status», вы увидите, что все изменения в вашем рабочем каталоге будут выглядеть так, как будто вы редактировали свои файлы, чтобы они выглядели так, как они были в указанном вами коммите. Фиксация этих изменений создаст новый коммит, который эффективно «отменяет» то, что последующие коммиты выполнят заранее, если сделал указанный. Ваша текущая ветка теперь будет указывать на этот коммит. Это хорошая практика, если другие могут зависеть от коммитов, которые вы действительно хотите стереть.

2 голосов
/ 03 января 2012
  • git reset --hard сбросит текущую ветвь HEAD на указанный refspec
  • git checkout переключит ветку и оставит вас в режиме отсоединенная головка .

Итак, с первым вы можете сразу начать коммитить в вашей текущей ветке.
Со вторым вам нужно сначала определить ветку, ваша (ранее) текущая ветка HEAD не двигалась.Только рабочий каталог был изменен.И вы больше не находитесь ни в одной ветке (отсюда и «отключенный режим»).

...