Я случайно отправил неправильные файлы в Git , но я еще не отправил коммит на сервер.
Как я могу отменить эти коммиты из локального репозитория?
$ 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)
git status
], поэтому вам нужно будет добавить их снова перед фиксацией). Если вы только хотите добавить дополнительных изменений к предыдущей фиксации или изменить сообщение фиксации 1 , вы можете использовать git reset --soft HEAD ~
вместо этого, который похож на git reset HEAD ~
2 , но оставляет ваши существующие изменения поэтапно. git add
все, что вы хотите включить в свой новая фиксация. 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? . Это полезно, если вы хотите отменить несколько коммитов.
Добавьте / удалите файлы, чтобы получить желаемое:
git rm classdir
git add sourcedir
Затем внесите изменения в commit:
git commit --amend
Предыдущая ошибочная фиксация будет отредактирована, чтобы отразить новое состояние индекса - другими словами, это будет похоже на то, что вы никогда не допускали ошибки.
Обратите внимание, что вы должны делать это, только если вы еще не нажали. Если вы нажали, вам просто нужно будет зафиксировать исправление в обычном режиме.
git rm yourfiles/*.class
git commit -a -m "deleted all class files in folder 'yourfiles'"
или
git reset --hard HEAD~1
Предупреждение. Приведенная выше команда навсегда удалит модификации файлов .java
(и любых других файлов), которые вы хотели зафиксировать.
Аппаратный сброс с
на HEAD-1
переведет вашу рабочую копию в состояние фиксации перед ошибочной фиксацией.
Для отмены последней локальной фиксации, не выбрасывая ее изменения, у меня есть этот удобный псевдоним в ~/.gitconfig
[alias]
undo = reset --soft HEAD^
Затем, я просто использую git undo
, который суперлегко помнить.