Как мне отменить последние локальные коммиты в Git?

Я случайно отправил неправильные файлы в Git , но я еще не отправил коммит на сервер.

Как я могу отменить эти коммиты из локального репозитория?

20032
задан 82 revs, 54 users 14% 29 August 2019 в 10:48
поделиться

4 ответа

Отменить фиксацию и повторить

$ git commit -m "Something terribly misguided"             # (1)
$ git reset HEAD~                                          # (2)
<< edit files as necessary >>                              # (3)
$ git add ...                                              # (4)
$ git commit -c ORIG_HEAD                                  # (5)
  1. Это то, что вы хотите отменить.
  2. Это не влияет на ваше рабочее дерево (состояние ваших файлов на диске), но отменяет фиксацию и оставляет изменения, которые вы зафиксировали, неустановленными (поэтому они будут отображаться как «Изменения, не поставленные для фиксации» в git status ], поэтому вам нужно будет добавить их снова перед фиксацией). Если вы только хотите добавить дополнительных изменений к предыдущей фиксации или изменить сообщение фиксации 1 , вы можете использовать git reset --soft HEAD ~ вместо этого, который похож на git reset HEAD ~ 2 , но оставляет ваши существующие изменения поэтапно.
  3. Внесите исправления в файлы рабочего дерева.
  4. git add все, что вы хотите включить в свой новая фиксация.
  5. Зафиксируйте изменения, повторно используя старое сообщение фиксации. reset скопировал старую голову в .git / ORIG_HEAD ; commit с -c ORIG_HEAD откроет редактор, который изначально содержит сообщение журнала из старого коммита и позволяет вам редактировать его. Если вам не нужно редактировать сообщение, вы можете использовать параметр -C .

Однако помните, что если вы добавили какие-либо новые изменения в индекс, используя commit --amend добавит их в ваш предыдущий коммит.

Если код уже отправлен на ваш сервер и у вас есть права на перезапись истории (перебазирование), то:

git push origin master --force

Вы также можете посмотреть этот ответ:

Как переместить HEAD обратно в предыдущее место? (Отдельная голова) & Отменить коммиты

В приведенном выше ответе будет показано git reflog , которое используется для определения того, какой SHA-1 вы хотите использовать. Как только вы найдете точку, до которой хотите отменить, используйте последовательность команд, как описано выше.


1 Обратите внимание, однако, что вам не нужно возвращаться к более ранней фиксации, если вы только что сделали ошибку в вашем сообщении фиксации . Более простой вариант - git reset (чтобы отключить все изменения, которые вы внесли с тех пор), а затем git commit --amend , который откроет ваш редактор сообщений фиксации по умолчанию, предварительно заполненный последним сообщением фиксации.

2 HEAD ~ совпадает с HEAD ~ 1 . Также см. Что такое HEAD в git? . Это полезно, если вы хотите отменить несколько коммитов.

21983
ответ дан 22 November 2019 в 19:37
поделиться

Добавьте / удалите файлы, чтобы получить желаемое:

git rm classdir
git add sourcedir

Затем внесите изменения в commit:

git commit --amend

Предыдущая ошибочная фиксация будет отредактирована, чтобы отразить новое состояние индекса - другими словами, это будет похоже на то, что вы никогда не допускали ошибки.

Обратите внимание, что вы должны делать это, только если вы еще не нажали. Если вы нажали, вам просто нужно будет зафиксировать исправление в обычном режиме.

1712
ответ дан 22 November 2019 в 19:37
поделиться
git rm yourfiles/*.class
git commit -a -m "deleted all class files in folder 'yourfiles'"

или

git reset --hard HEAD~1

Предупреждение. Приведенная выше команда навсегда удалит модификации файлов .java (и любых других файлов), которые вы хотели зафиксировать.

Аппаратный сброс с на HEAD-1 переведет вашу рабочую копию в состояние фиксации перед ошибочной фиксацией.

981
ответ дан 22 November 2019 в 19:37
поделиться

Для отмены последней локальной фиксации, не выбрасывая ее изменения, у меня есть этот удобный псевдоним в ~/.gitconfig

[alias]
  undo = reset --soft HEAD^

Затем, я просто использую git undo, который суперлегко помнить.

5
ответ дан 22 November 2019 в 19:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: