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

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

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

17659
задан Hamza Yerlikaya 29 мая '09 в 21:09
источник поделиться

83 ответов

  • 1
  • 2
  • 3

Есть много способов сделать это:

Команда Git для отмены последнего фиксации/предыдущих коммитов:

Основная команда для отмены фиксации в Git:

$ git reset --hard <COMMIT -ID>

или

$ git reset --hard HEAD~<n>

COMMIT-ID: идентификатор для фиксации

n: число последних коммитов, которые вы хотите вернуть

Вы можете получить идентификатор фиксации, как показано ниже:

$ **git log --oneline**

d81d3f1 function to subtract two numbers

be20eb8 function to add two numbers

bedgfgg function to mulitply two numbers

где d81d3f1 и be20eb8 - идентификатор commit.

Теперь рассмотрим некоторые случаи:

Предположим, вы хотите вернуть последнее коммит 'd81d3f1'. Ниже приведены способы:

$ git reset --hard d81d3f1

или

$ git reset --hard HEAD~1

Предположим, вы хотите вернуть commit 'be20eb8'. Ниже приведены способы:

$ git reset --hard be20eb8

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

$ git reset --help
74
ответ дан user3799762 18 февр. '16 в 6:27
источник поделиться

Если вы хотите удалить файлы в последнем коммите, вы можете использовать это:

git reset --hard HEAD~1

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

git reset --soft HEAD~1
71
ответ дан aya 10 янв. '17 в 15:12
источник поделиться

Для локальной фиксации

git reset --soft HEAD~1

или если вы точно не помните, в какой фиксации это возможно, вы можете использовать

git rm --cached <file>

Для нажатой фиксации

Правильный способ удаления файлов из истории репозитория - использование git filter-branch. То есть,

git filter-branch --index-filter 'git rm --cached <file>' HEAD

Но я рекомендую вам использовать эту команду с осторожностью. Подробнее читайте в разделе git-filter-branch (1) Manual.

67
ответ дан geoom 04 марта '14 в 7:35
источник поделиться

Вы можете использовать:

git reset HEAD@{1}

Эта команда удалит неправильную фиксацию без журнала Git.

55
ответ дан Min Han 29 июня '16 в 9:28
источник поделиться

Обычно вы хотите отменить фиксацию, потому что вы допустили ошибку, и хотите ее исправить - по существу, что сделал OP, когда он задал вопрос. Так что вы действительно хотите переделать фиксацию.

Большинство ответов здесь сосредоточены на командной строке. В то время как командная строка - лучший способ использовать Git, когда вам удобно, это, вероятно, немного чуждо тем, кто приходит из других систем управления версиями в Git.

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

ПРИМЕЧАНИЕ. Я предполагаю, что вы поняли, что совершение было неправильным, прежде чем вы его подтолкнули. Если вы не знаете, что такое толкание, вы, вероятно, не нажали, так что продолжайте с инструкциями. Если вы допустили ошибочную фиксацию, наименее рискованным способом является просто отслеживание ошибочного фиксации с помощью новой фиксации, которая исправляет ситуацию, как вы это делаете в системе контроля версий, которая не позволяет вам переписывать историю.

Тем не менее, здесь, как исправить вашу последнюю ошибку совершить с помощью графического интерфейса:

  1. Перейдите в свой репозиторий в командной строке и запустите gui с помощью git gui
  2. Выберите "Изменить последнее завершение". Вы увидите последнее сообщение о фиксации, файлы, которые вы поставили, и файлы, которые у вас не были.
  3. Теперь измените ситуацию так, как вы хотите, чтобы они выглядели, и нажмите "Зафиксировать".
54
ответ дан Carl 18 нояб. '14 в 22:11
источник поделиться

ЧТО ИСПОЛЬЗОВАТЬ, reset --soft или reset --hard?

Я просто добавляю два цента за @Kyralessa ответ:

Если вы не знаете, что использовать, перейдите для --soft (я использовал это соглашение, чтобы запомнить его - s for for safe).

Зачем?

Если вы выберете --hard по ошибке, вы потеряете свои изменения, как это было раньше. Если вы выберете --soft по ошибке, вы можете добиться тех же результатов --hard, применив дополнительные команды

git reset HEAD file.html
git checkout -- file.html

Полный пример

echo "some changes..." > file.html
git add file.html
git commit -m "wrong commit"

# I need to reset
git reset --hard HEAD~1 (cancel changes)
# OR
git reset --soft HEAD~1 # Back to staging
git reset HEAD file.html # back to working directory
git checkout -- file.html # cancel changes

Кредиты идут на @Kyralessa.

49
ответ дан amd 28 июля '16 в 10:24
источник поделиться

Если вы работаете с SourceTree, это поможет вам.

Щелкните правой кнопкой мыши фиксацию, затем выберите "Сброс (текущая ветка)/мастер для этой фиксации" и последний выбор "Мягкий" сброс.

Enter image description here

47
ответ дан Alexandr 29 июля '16 в 13:14
источник поделиться

Просто отмените последнее коммит:

git reset --soft HEAD~

Или отмените время до последнего времени:

git reset --soft HEAD~2

Или отменить любую предыдущую фиксацию:

git reset --soft <commitID>

(вы можете получить commitID с помощью git reflog)

Когда вы отмените предыдущую фиксацию, не забудьте очистить рабочее место с помощью

git clean

Более подробную информацию можно найти в документах: git-reset

44
ответ дан steven 08 мая '15 в 11:04
источник поделиться

Подумайте, у нас есть файл code.txt. Мы вносим в него некоторые изменения и совершаем. Мы можем отменить эту фиксацию тремя способами, но сначала вы должны знать, что такое поэтапный файл... Поэтапный файл - это файл, готовый к фиксации, и если вы запустите git status этот файл будет отображаться зеленым цветом, и если это не поставленный для фиксации, будет показан красным цветом:

enter image description here

Это означает, что если вы сделаете свое изменение, ваши изменения в этом файле не будут сохранены. Вы можете добавить этот файл в свою сцену с помощью git add code.txt а затем зафиксировать свое изменение:

enter image description here

Отменить последнее коммит:

  1. Теперь, если мы хотим просто отменить фиксацию без каких-либо изменений, мы можем использовать

    git reset --soft HEAD^

    enter image description here

  2. Если мы хотим отменить фиксацию и ее изменения (ЭТО ОПАСНО, потому что ваши изменения будут потеряны), мы можем использовать

    git reset --hard HEAD^

    enter image description here

  3. И если мы хотим отменить фиксацию и удалить изменения со стадии, мы можем использовать

    git reset --mixed HEAD^ или в краткой форме git reset HEAD^

    enter image description here

43
ответ дан Ali Motameni 18 нояб. '16 в 11:57
источник поделиться

Чтобы отменить локальную фиксацию, вы используете git reset <file>. Также этот учебник очень полезен, чтобы показать вам, как он работает.

В качестве альтернативы вы можете использовать git revert <commit>: реверсия должна использоваться, когда вы хотите добавить еще одну фиксацию, которая откатывает изменения (но сохраняет их в истории проекта).

41
ответ дан mfathy00 04 янв. '16 в 2:59
источник поделиться

Типичный цикл 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 (предположим, что file2 добавлен как шаг 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.

38
ответ дан Sazzad Hissain Khan 31 дек. '16 в 17:34
источник поделиться

ПОЛЬЗОВАТЕЛИ ВИЗУАЛЬНОЙ СТУДИИ (2015 г. и т.д.)

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

За ответ с ТОННЫМИ ГОЛОСОВ:

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

git reset --hard HEAD~1

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

36
ответ дан Tom Stickel 27 апр. '16 в 0:35
источник поделиться

Отменить последнее обязательство

Есть много ситуаций, когда вы действительно хотите отменить последнее коммит в свой код. Например, потому что вы хотели бы реструктурировать его широко - или даже полностью отказаться от него!

В этих случаях команда "reset" - ваш лучший друг:

$ git reset --soft HEAD~1

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

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

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

$ git reset --hard HEAD~1

Enter image description here

36
ответ дан Mohit 14 сент. '17 в 7:33
источник поделиться

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

git checkout commitID .

Пример:

git checkout 7991072 .

И он вернул его обратно к этой рабочей копии этого сообщения.

31
ответ дан ioopl 16 марта '16 в 18:41
источник поделиться

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

    git commit --amend

если это частный филиал или

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

если это общий или публичный филиал.

31
ответ дан Yahs Hef 25 мая '15 в 0:09
источник поделиться

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

Сначала нам нужно исправить наше местное репо, вернувшись к желанию, которое мы хотим:

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

Теперь мы принудительно нажимаем эту хорошую фиксацию на удаленном репо, используя эту команду:

git push --force-with-lease

Версия опции force with the-lease предотвратит случайное удаление новых коммитов, о которых вы не знаете (т.е. Из другого источника с момента последнего нажатия).

28
ответ дан KawaiKx 07 мая '17 в 4:01
источник поделиться

У вас есть несколько вариантов отмены последнего фиксации. Вот некоторые из ваших вариантов суммировать в один ответ с фрагментами кода

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


git reflog

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

Каждый раз, когда HEAD изменен, в reflog будет введена новая запись.
Функция reflog похожа на команду истории unix и хранится локально на вашем компьютере.

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

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

enter image description here


git reset HEAD --hard <commit_id>

"Переместите" свою голову назад к желаемому фиксации.
Сброс Git проверяет требуемый контент фиксации на вашу промежуточную область и/или на ваш рабочий каталог на основе значения --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 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

26
ответ дан CodeWizard 28 янв. '17 в 3:10
источник поделиться

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

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

git reset --soft HEAD~1

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

git reset FILE

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

26
ответ дан FraK 11 авг. '15 в 17:11
источник поделиться

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

git checkout -b old-state number_commit
25
ответ дан Fadid 27 дек. '17 в 21:42
источник поделиться

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

git checkout -b old-state 0d1d7fc32
25
ответ дан Jishnu Sukumaran 06 июля '15 в 11:30
источник поделиться

Удалите ошибку, которая уже перенесена в Github

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

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

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

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

22
ответ дан V V 04 дек. '15 в 20:20
источник поделиться

Использование:

git reset HEAD~1 --soft

Внесите изменения, добавьте и зафиксируйте изменения.

22
ответ дан Alex Wilson 28 февр. '17 в 18:32
источник поделиться

Вы всегда можете выполнить git checkout (SHA-код) предыдущей версии и затем снова выполнить новый код.

22
ответ дан shreshta bm 10 дек. '15 в 10:17
источник поделиться

Чтобы избавиться от (всех изменений) последнего коммита, последние 2 фиксации и последние n совершают:

git reset --hard HEAD~1
git reset --hard HEAD~2
...
git reset --hard HEAD~n

И, чтобы избавиться от чего-либо после конкретной фиксации:

git reset --hard <commit sha>

например,

git reset --hard 0d12345

PS:
1- Будьте осторожны, из-за "жесткого" варианта он также удаляет локальные изменения в вашем репо и возвращается к предыдущей фиксации. Вы должны запустить это, если вы уверены, что перепутались в своих последних фиксациях и хотите вернуться во времени.

2- Обычно достаточно 7 букв "commit sha", но в больших проектах вам может потребоваться до 12 букв, чтобы гарантировать уникальность. Вы также можете упомянуть все 40 букв ша.

3- Вышеупомянутые команды работают в Github для Windows.

21
ответ дан Alisa 06 нояб. '16 в 6:38
источник поделиться

Вам просто нужно использовать одну команду:

git reset --soft 'HEAD^' 

Он работает, чтобы отменить последнюю локальную фиксацию в вашем репозитории Git.

19
ответ дан sumeet 27 дек. '17 в 9:36
источник поделиться

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

Если у вас установлены Git Extensions, вы можете легко отменить/отменить фиксацию (вы можете скачать GIT-расширения здесь).

Откройте Git Extensions, щелкните правой кнопкой мыши на фиксации, которую вы хотите вернуть, затем выберите "Revert commit".

Git Extensions screen shot

Всплывающее окно будет открыто (см. Снимок экрана ниже)

Revert commit popup

Выберите "Автоматически создавать коммит", если вы хотите напрямую зафиксировать отмененные изменения или если вы хотите вручную зафиксировать отмененные изменения, сохраните этот флажок неактивным и нажмите кнопку "Отменить эту фиксацию".

18
ответ дан Ranadheer Reddy 30 марта '17 в 23:56
источник поделиться

Из отмены последнего фиксации вы хотите, чтобы вернуться к старой фиксации.

Перейдите к терминалу и введите следующие команды:

git reset --hard hash-to-reverted

git push origin HEAD --force

Для этого вам нужен хэш.

18
ответ дан user7950465 27 мая '17 в 13:56
источник поделиться

Отменить последнее коммит:

git reset --soft HEAD^ or git reset --soft HEAD~

Это приведет к отмене последнего фиксации.

Здесь --soft означает сброс настроек.

HEAD~ or HEAD^ означает переход к фиксации перед HEAD.

Заменить последнюю фиксацию на новую фиксацию:

git commit --amend -m "message"

Он заменит последнее коммит новым фиксатором.

17
ответ дан ankit patidar 15 февр. '18 в 10:08
источник поделиться

Вы можете отменить свои git-коммиты двумя способами: - Во-первых, вы можете использовать git revert, если хотите сохранить историю фиксации.

git revert HEAD~3
git revert <hashcode of commit>

Во-вторых, вы можете использовать сброс git, который удалит всю вашу историю фиксации и приведет вашу голову к фиксации там, где вы хотите.

git reset <hashcode of commit>
git reset HEAD~3

Вы также можете использовать ключевое слово --hard, если какое-либо из них начнет вести себя иначе. Но я бы порекомендовал, пока это не будет крайне необходимо.

16
ответ дан Shwetank 02 авг. '17 в 11:58
источник поделиться

Просто используйте git reset --hard <last good SHA> чтобы сбросить изменения и дать новый коммит. Вы также можете использовать git checkout -- <bad filename>.

15
ответ дан hubot 29 мая '16 в 17:21
источник поделиться
  • 1
  • 2
  • 3

Другие вопросы по меткам