Как мне отменить последние локальные коммиты в Git? - PullRequest
19725 голосов
/ 29 мая 2009

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

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

Ответы [ 78 ]

47 голосов
/ 11 августа 2015

В моем случае я зафиксировал и выдвинул неверную ветку, поэтому я хотел, чтобы все мои изменения были возвращены, чтобы я мог зафиксировать их в новой правильной ветви, поэтому я сделал это:

В той же ветке, которую вы зафиксировали и отправили, если вы введете «git status», вы не увидите ничего нового, потому что вы зафиксировали и отправили, теперь наберите:

git reset --soft HEAD~1

Это вернет все ваши изменения (файлы) обратно в область рабочей области, теперь, чтобы вернуть их в рабочий каталог (без этапа), вы просто набираете:

git reset FILE

Где «Файл» - это файл, который вы хотите зафиксировать снова. Теперь этот ФАЙЛ должен находиться в рабочем каталоге (без тегов) со всеми внесенными вами изменениями. Теперь вы можете перейти к любой ветке, которую хотите, и зафиксировать изменения в этой ветке. Надеюсь, это поможет другим людям, которые совершили ту же ошибку, что и я. Конечно, исходная ветвь, которую вы зафиксировали, все еще там со всеми изменениями, но в моем случае это было нормально, если это не для вас - вы можете найти способы отменить эту фиксацию в этой ветке.

44 голосов
/ 31 декабря 2015

Типичный цикл Git

Говоря о командах, связанных с Git, в предыдущих ответах, я хотел бы поделиться своими типичными циклами Git со всеми читателями, которые могут оказаться полезными. Вот как я работаю с Git,

  1. Первое клонирование с удаленного сервера

    git clone $project

  2. Извлечение из удаленного узла (когда у меня нет ожидающего локального коммита для нажатия)

    git pull

  3. Добавление нового локального файла1 в $ to_be_committed_list (просто представьте, что $ to_be_committed_list означает staged область)

    git add $file1

  4. Удаление ошибочно добавленного файла2 из $ to_be_committed_list (предположим, что файл2 добавлен как шаг 3, который я не хотел)

    git reset $file2

  5. Подтверждение файла1, который находится в $ to_be_committed_list

    git commit -m "commit message description"

  6. Синхронизация локального коммита с удаленным репозиторием перед нажатием

    git pull --rebase

  7. Разрешение при возникновении конфликта обязательное условие configure mergetool

    git mergetool #resolve merging here, also can manually merge

  8. Добавление разрешенных конфликтами файлов, скажем file1:

    git add $file1

  9. Продолжая мою предыдущую команду rebase

    git rebase --continue

  10. Подтверждение готовности и уже синхронизированной последней локальной фиксации

    git push origin head:refs/for/$branch # branch = master, dev, etc.

43 голосов
/ 27 апреля 2016

VISUAL STUDIO USERS (2015 и т. Д.)

Если вы не можете выполнить синхронизацию в Visual Studio, поскольку вам не разрешено переходить в ветку, например, «развитие», то, как я и пытался, в Visual Studio НИКОГДА REVERT NOR RESET (жесткий или мягкий) будет работать.

За ответ с тоннами голосов:

Используйте это в командной строке root вашего проекта, чтобы уничтожить все, что будет пытаться получить:

git reset --hard HEAD~1

Резервное копирование или архивирование файлов на тот случай, если вы не хотите потерять работу и т. Д. *

37 голосов
/ 28 января 2017

У вас есть несколько вариантов, чтобы отменить ваш последний коммит. Вот некоторые из ваших вариантов, обобщенных в один ответ с фрагментами кода

, Прежде всего, вам нужно выяснить, какие «неправильные» коммиты вы хотите отбросить. Мы будем использовать git reflog, чтобы найти его.


git reflog

Вы также всегда можете использовать reflog.
git reflog отобразит любое изменение, которое обновило HEAD, и проверка желаемой записи reflog вернет HEAD к этому коммиту.

Каждый раз, когда изменяется ГОЛОВКА, в reflog.
появляется новая запись. reflog аналогичен команде истории Unix и хранится локально на вашем компьютере.

git reflog
git checkout HEAD@{...}
# or
git checkout <sha-1>

Используя checkout, вы можете вернуться к любому желаемому коммиту и создать ветку или любые другие опции, которые вам позволит сделать git checkout.

enter image description here


git reset HEAD --hard <commit_id>

«Переместить» вернуть голову к желаемому коммиту.
Git reset проверит желаемое содержание коммита в вашу промежуточную область и / или в ваш рабочий каталог на основе значения --hard/--soft/--mixed, которое вы выберете. --hard обновит и область рабочей области, и рабочий каталог с заданным содержимым и "отсоединит" любые другие коммиты за пределами этой точки в вашей локальной ветке.

Если эти коммиты не являются частью какой-либо другой ветки, они станут "болтаться".
Контент «болтаться» означает, что в вашем локальном репозитории есть недоступный контент, который не является частью какой-либо другой ветви и может быть удален или будет удален с помощью gc.

# This will destroy any local modifications.
# Don't do it if you have uncommitted work you want to keep.
git reset --hard 0d1d7fc32

# Alternatively, if there's work to keep:
git stash
git reset --hard 0d1d7fc32
git stash pop
# This saves the modifications, then reapplies that patch after resetting.
# You could get merge conflicts if you've modified things which were
# changed since the commit you reset to.

Эта схема иллюстрирует, какая команда что делает.
Как вы можете видеть reset && checkout изменить HEAD.

enter image description here

37 голосов
/ 07 мая 2017

Предположим, вы сделали неправильный коммит локально и отправили его в удаленный репозиторий. Вы можете отменить беспорядок с помощью этих двух команд:

Во-первых, нам нужно исправить наш локальный репозиторий, вернувшись к коммиту, который мы желаем:

git reset --hard <previous good commit id where you want the local repository  to go>

Теперь мы принудительно вставим этот хороший коммит в удаленный репозиторий с помощью этой команды:

git push --force-with-lease

Версия опции «с арендой», которая предотвращает случайное удаление новых коммитов, о которых вы не знаете (т.е. поступающих из другого источника с момента вашего последнего запроса).

36 голосов
/ 16 марта 2016

Я получил идентификатор фиксации от bitbucket, а затем сделал:

git checkout commitID .

Пример:

git checkout 7991072 .

И он вернул его обратно в рабочую копию этого коммита.

32 голосов
/ 25 мая 2015

Нужно сделать легко и быстро

    git commit --amend

если это частная ветка или

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

если это общая или открытая ветка.

32 голосов
/ 04 декабря 2015

Удалите неправильный коммит, который уже передан в Github

git push origin +(previous good commit id):(branch name)

Пожалуйста, укажите последний верный идентификатор фиксации, который вы хотели бы сбросить обратно в Github.

Например. Если последний идентификатор фиксации неверен, укажите предыдущий идентификатор фиксации в приведенной выше команде git с именем ветви.

Вы можете получить идентификатор предыдущего коммита, используя git log

27 голосов
/ 06 июля 2015

Используйте эту команду

git checkout -b old-state 0d1d7fc32
27 голосов
/ 27 декабря 2016

Используйте эту команду:

git checkout -b old-state number_commit
...