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


я случайно commitневерные файлы Гит , но у меня нет pushеще раз зафиксировать фиксацию на сервере.

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


17519


источник


Ответы:


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

$ 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. Это то, что вы хотите отменить
    1. Это оставляет рабочее дерево (состояние ваших файлов на диске) неизменным, но отменяет фиксацию и оставляет внесенные вами изменения неустановленными (поэтому они будут отображаться как «Изменения, не поставленные для фиксации» в git status, и вам нужно будет добавить их снова, прежде чем совершать). если ты только хотеть Добавить больше изменений в предыдущем фиксации или изменить сообщение фиксации 1 , вы можете использовать git reset --soft HEAD~вместо этого, что git reset HEAD~(где HEAD~такой же как HEAD~1), но оставляет ваши существующие изменения.
    1. Внести исправления в файлы рабочих деревьев.
    1. git addвсе, что вы хотите включить в свою новую фиксацию.
    1. Зафиксируйте изменения, повторно используя старое сообщение фиксации. resetскопировал старую голову в .git/ORIG_HEAD; commitс -c ORIG_HEADоткроет редактор, который изначально содержит сообщение журнала из старого коммита и позволяет вам его редактировать. Если вам не нужно редактировать сообщение, вы можете использовать -Cвариант.

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

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

git push origin master --force

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

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

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


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


18854



Отмена фиксации немного страшна, если вы не знаете, как это работает. Но это действительно удивительно легко, если вы понимаете.

Скажите, что у вас есть это, где C - ваш ГОЛОВА, а (F) - состояние ваших файлов.

   (F)
A-B-C
    ↑
  master

Вы хотите nuke совершить C и никогда не увидеть его снова , Ты делаешь это:

git reset --hard HEAD~1

Результат:

 (F)
A-B
  ↑
master

Теперь B - HEAD. Потому что вы использовали --hard, ваши файлы сбрасываются в их состояние при фиксации B.

Ах, но предположим, что совершение C не было катастрофой, а просто откупорено. Вы хотите отмените фиксацию, но сохраните изменения для немного редактирования, прежде чем вы сделаете лучшее совершение. Начиная с этого момента, с C в качестве вашего HEAD:

   (F)
A-B-C
    ↑
  master

Вы можете сделать это, оставив --hard:

git reset HEAD~1

В этом случае результат:

   (F)
A-B-C
  ↑
master

В обоих случаях HEAD - это всего лишь указатель на последнюю фиксацию. Когда вы делаете git reset HEAD~1, вы говорите Git, чтобы переместить указатель HEAD назад на один фиксатор. Но (если вы не используете --hard) вы оставляете свои файлы такими, какие они есть. А сейчас git statusпоказывает изменения, которые вы проверили на C. Вы ничего не потеряли!

Для легкого прикосновения вы можете даже отмените фиксацию, но оставьте свои файлы и свои индекс :

git reset --soft HEAD~1

Это не только оставляет ваши файлы в покое, но и оставляет ваши индекс в одиночестве. Когда вы это сделаете git status, вы увидите, что те же файлы находятся в индексе, как и раньше. Фактически, сразу после этой команды вы могли бы сделать git commitи вы будете переделывать тот же коммит, который у вас был.

Еще кое-что: Предположим, вы уничтожили фиксацию как в первом примере, но потом обнаружите, что вам это нужно в конце концов ? Жесткая удача, не так ли?

Нет, есть все еще способ вернуть его. Тип git reflogи вы увидите список (частичных) команд shas, ​​которые вы переместили внутри. Найдите коммит, который вы уничтожили, и выполните следующее:

git checkout -b someNewBranchName shaYouDestroyed

Теперь вы воскресили эту фиксацию. Конец не уничтожается в Git в течение примерно 90 дней, поэтому вы можете вернуться назад и спасти тот, который вы не хотели избавиться.


9623



Мне потребовалось некоторое время, чтобы понять, так что, возможно, это поможет кому-то ...

Существует два способа «отменить» ваш последний коммит, в зависимости от того, сделал ли вы общедоступный отчет (нажал на удаленный репозиторий):

Как отменить локальную фиксацию

Предположим, что я сделал локально, но теперь хочу удалить эту фиксацию.

git log
    commit 101: bad commit    # latest commit, this would be called 'HEAD'
    commit 100: good commit   # second to last commit, this is the one we want

Чтобы восстановить все до того, как это было до последней фиксации, нам нужно resetк фиксации до HEAD:

git reset --soft HEAD^     # use --soft if you want to keep your changes
git reset --hard HEAD^     # use --hard if you don't care about keeping the changes you made

Теперь git logпокажет, что наша последняя фиксация была удалена.

Как отменить публичную фиксацию

Если вы уже сделали свои коммиты общедоступными, вам нужно будет создать новый коммит, который «вернет» изменения, внесенные вами в предыдущую фиксацию (текущий HEAD).

git revert HEAD

Теперь ваши изменения будут отменены и готовы к фиксации:

git commit -m 'restoring the file I removed by accident'
git log
    commit 102: restoring the file I removed by accident
    commit 101: removing a file we don't need
    commit 100: adding a file that we need

Для получения дополнительной информации, проверьте Основы Git - Отмена вещей


1705



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

git rm classdir
git add sourcedir

Затем измените фиксацию:

git commit --amend

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

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


1604



git rm yourfiles/*.class
git commit -a -m "deleted all class files in folder 'yourfiles'"

или

git reset --hard HEAD~1

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

hard resetв HEAD-1установит вашу рабочую копию в состояние фиксации до вашего неправильного коммита.


854



Чтобы изменить последнее фиксацию

Замените файлы в индексе:

git rm --cached *.class
git add *.java

Затем, если это частный филиал, изменить фиксация:

git commit --amend

Или, если это общая ветка, сделайте новую фиксацию:

git commit -m 'Replace .class files with .java files'


( изменить предыдущую фиксацию , используйте потрясающий интерактивная перебаза )


ProTip: Добавить *.classк gitignore чтобы остановить это снова.


Чтобы вернуть фиксацию

Внесение изменений в коммит является идеальным решением, если вам нужно изменить последнее коммит, но более общее решение reset,

Вы можете сбросить git на любой фиксатор с помощью:

git reset @~N

где Nколичество коммитов до HEAD, а также @~сбрасывается до предыдущего фиксации.

Итак, вместо внесения изменений в коммит вы можете использовать:

git reset @~
git add *.java
git commit -m "Add .java files"

Проверять, выписываться git help reset, в частности разделы, посвященные --soft --mixedа также --hard, для лучшего понимания того, что это делает.

Reflog

Если вы испортились, вы всегда можете использовать reflog, чтобы найти удаленные коммиты:

$ git reset @~
$ git reflog
c4f708b HEAD@{0}: reset: moving to @~
2c52489 HEAD@{1}: commit: added some .class files
$ git reset 2c52489
... and you're back where you started



666



Use git revert commit-id

To get the commit ID, just use git log


536



If you are planning undoing a local commit entirely, whatever you changes you did on the commit, and if you don't worry anything about that, just do the following command.

git reset --hard HEAD^1

(This command will ignore your entire commit and your changes will be lost completely from your local working tree). If you want to undo your commit, but you want your changes in the staging area (before commit just like after git add) then do the following command.

git reset --soft HEAD^1

Now your committed files comes into the staging area. Suppose if you want to unstage the files, because you need to edit some wrong conent, then do the following command

git reset HEAD

Now committed files come from the staged area into the unstaged area. Now files are ready to edit, so whatever you changes, you want go edit and added it and make a fresh/new commit.

More


429



If you have Git Extras installed, you can run git undo to undo the latest commit. git undo 3 will undo the last 3 commits.


421



I wanted to undo the lastest 5 commits in our shared repository. I looked up the revision id that I wanted to rollback to. Then I typed in the following.

prompt> git reset --hard 5a7404742c85
HEAD is now at 5a74047 Added one more page to catalogue
prompt> git push origin master --force
Total 0 (delta 0), reused 0 (delta 0)
remote: bb/acl: neoneye is allowed. accepted payload.
To git@bitbucket.org:thecompany/prometheus.git
 + 09a6480...5a74047 master -> master (forced update)
prompt>

389



I prefer to use git rebase -i for this job, because a nice list pops up where I can choose the commits to get rid of. It might not be as direct as some other answers here, but it just feels right.

Choose how many commits you want to list, then invoke like this (to enlist last three)

git rebase -i HEAD~3

Sample list

pick aa28ba7 Sanity check for RtmpSrv port
pick c26c541 RtmpSrv version option
pick 58d6909 Better URL decoding support

Then git will remove commits for any line that you remove.


376