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

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

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

18614
задан Hamza Yerlikaya 29 мая '09 в 21:09
источник поделиться
90 ответов
  • 1
  • 2
  • 3
$ git reset --soft HEAD~1  

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

$ git reset --hard HEAD~1  

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

14
ответ дан Joseph Mathew 26 окт. '17 в 21:11
источник поделиться

Вот сайт: Oh shit, git! ,

Вот много рецептов, как отменить вещи в Git. Некоторые из них:

О, дерьмо, мне нужно изменить сообщение на мой последний бой!

git commit --amend
# follow prompts to change the commit message

О, дерьмо, я случайно совершил что-то, чтобы справиться с этим, должно быть, было в совершенно новой отрасли!

# Create a new branch from the current state of master
git branch some-new-branch-name
# Remove the commit from the master branch
git reset HEAD~ --hard
git checkout some-new-branch-name
# Your commit lives in this branch now :)
14
ответ дан Eugen Konkov 28 февр. '18 в 11:34
источник поделиться

Я нашел этот сайт, который описывает, как отменить все, что вы сделали в репозитории.

Некоторые команды:

git commit --amend        # Change last commit
git reset HEAD~1 --soft   # Undo last commit
14
ответ дан Eugen Konkov 15 дек. '16 в 19:21
источник поделиться

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

В приведенном ниже изображении я проверяю ветку "test" (с помощью теста Git git checkout -b test) в качестве локального состояния и проверки (с использованием Git-команды git status) локальной ветки, которой нечего зафиксировать.

Enter image description here

На следующем изображении изображения, которое вы видите здесь, я сделал несколько изменений в файле Filter1.txt и добавил этот файл в промежуточную область, а затем передал свои изменения с некоторым сообщением (используя команду Git git commit -m "Doing commit to test revert back").

"-m для сообщения фиксации"

Enter image description here

На следующем изображении вы можете видеть, что ваш журнал совершает все, что вы совершили, (используя Git-команду git log).

Enter image description here

Таким образом, в приведенном выше изображении вы можете увидеть идентификатор фиксации с каждой фиксацией и с вашим сообщением о фиксации сейчас, независимо от того, что вы хотите вернуть назад или отменить копию, которая зафиксирует идентификатор и нажать ниже команду Git, git revert {"paste your commit id"}, Пример:

git revert 9ca304ed12b991f8251496b4ea452857b34353e7

Enter image description here

Я вернул обратно свой последний коммит. Теперь, если вы проверяете свой статус Git, вы можете увидеть измененный файл, который является Filter1.txt, и все же выполнить фиксацию.

Enter image description here

13
ответ дан Raj S. Rusia 06 марта '18 в 15:26
источник поделиться

В IntelliJ IDEA вы можете просто открыть журнал репозитория Git, нажав Alt + 9, щелкнув правой кнопкой мыши по какому-либо тегу из списка коммитов и выберите: "Сбросить текущую ветвь до...".

13
ответ дан Krzysztof Walczewski 20 июня '17 в 13:05
источник поделиться

Найдите последний хеш-код фиксации, просмотрев журнал:

git log

затем

git reset <the previous co>
12
ответ дан Praveen Singh 03 июня '17 в 22:32
источник поделиться

ГОЛОВА:

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

Git совершает:

Каждое изменение присваивается под фиксацией, которая представлена уникальным тегом. Конец нельзя удалить. Поэтому, если вам нужна последняя фиксация, вы можете просто погрузиться в нее с помощью git reset.

Вы можете погрузиться в последнее совершение, используя два метода:

Способ 1: (если вы не знаете номер фиксации, но хотите перенести на первое)

git reset HEAD~1  # It will move your head to last commit

Способ 2: (если вы знаете коммит, который вы просто перезагрузите на свой известный коммит)

git reset 0xab3 # Номер git reset 0xab3

Примечание: если вы хотите узнать недавний коммит, попробуйте git log -p -1

Вот графическое представление:

Enter image description here

12
ответ дан Mohideen ibn Mohammed 18 июля '17 в 14:05
источник поделиться

Для полноты я дам один очевидный метод, который был упущен предыдущими ответами.

Поскольку фиксация не была нажата, пульт не изменился, поэтому:

  1. Удалите локальный репозиторий.
  2. Клонировать удаленный репозиторий.

Это иногда необходимо, если ваш причудливый клиент Git отправит вас в прошлое.

Не забудьте повторно зафиксировать сохраненные изменения со времени последнего нажатия.

11
ответ дан Dominic Cerisano 28 июня '17 в 0:34
источник поделиться

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

Если вам нужно сбросить самую верхнюю фиксацию, то следующий однострочный

git rebase --onto HEAD~1 HEAD

Но если вы хотите сбросить 1 из многих коммитов, вы сказали

a → b → c → d → master

и вы хотите отказаться от commit 'c'

git rebase --onto b c

Это создаст 'b', поскольку новая база 'd' устраняет 'c'

11
ответ дан Khem 23 мая '18 в 2:52
источник поделиться

enter image description here

Предполагая, что вы работаете в Visual Studio, если вы входите в историю веток и просматриваете все свои коммиты, просто выберите событие до фиксации, которую вы хотите отменить, щелкните его правой кнопкой мыши и выберите " Revert. Легко.

11
ответ дан Uchiha Itachi 16 нояб. '16 в 0:07
источник поделиться

Шаг 1: Получить Git commit-id: - git log

Шаг 2: Используйте Git reset: git reset --hard commit-id

Шаг 3: Если вы уже нажали свои изменения на пульте дистанционного управления, вы можете использовать git push для возврата изменения на пульт: git push origin branch-name -f

9
ответ дан Tom_cook 04 авг. '17 в 20:57
источник поделиться

Если вы хотите устранить неправильные файлы, вы должны сделать

git reset --soft <your_last_good_commit_hash_here> Здесь, если вы выполняете git status, вы увидите файлы в промежуточной области. Вы можете выбрать неправильные файлы и снять их с промежуточной области.

Как и следующее.

git reset wrongFile1 wrongFile2 wrongFile3

Теперь вы можете просто добавить файлы, которые нужно нажать,

git add goodFile1 goodFile2

совершать их

git commit -v или git commit -am "Message"

и толчок

git push origin master

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

от

git reset --hard <your_last_good_commit_hash_here>

git push origin master

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

git push --force origin master

7
ответ дан nPcomp 17 марта '17 в 0:20
источник поделиться

Попробуйте это, жесткий сброс предыдущей фиксации, где эти файлы не были добавлены, а затем:

git reset --hard <commit_hash>

Убедитесь, что у вас есть резервная копия изменений на всякий случай, поскольку это жесткий сброс, что означает, что они будут потеряны (если только вы не спрятали ранее)

6
ответ дан serdarsenay 17 апр. '18 в 18:41
источник поделиться

То, что я делаю каждый раз, когда мне нужно отменить фиксацию/фиксации, является:

  1. git reset HEAD~<n>//число последних коммитов, которые мне нужно отменить
  2. git status//необязательно. Все файлы теперь красны (нестационарны).

  3. Теперь я могу добавить и зафиксировать только те файлы, которые мне нужны:

    • git add <file names> & git commit -m "message" -m "details"
  4. Необязательно: я могу отменить изменения остальных файлов, если нужно, в их предыдущем состоянии, с проверкой:
    • git checkout <filename>
  5. если я уже подтолкнул его к удаленному происхождению, ранее:
    • git push origin <branch name> -f//использование -f для принудительного нажатия.
6
ответ дан Theo Itzaris 16 сент. '18 в 11:36
источник поделиться

Поскольку вы передали некоторые вещи в своем филиале, идентификатор commit можно найти, если вы введете:

$ git log

Обратите внимание на предыдущий идентификатор фиксации вашего фиксации и выполните мягкий сброс.

Предположим, что ваш идентификатор фиксации - "C2", а предыдущий идентификатор фиксации - "C1", а затем сброс $ git C1

Ни HEAD не указывает на C1. C2 теперь нестационарен.

Если вы хотите удалить свои изменения из ветки вместе с нестационарностью, выполните сброс $ git --hard C1

5
ответ дан SKM 24 нояб. '17 в 10:16
источник поделиться

Если вы хотите отменить самую первую фиксацию в своем репо

Вы столкнетесь с этой проблемой:

$ git reset HEAD~
fatal: ambiguous argument 'HEAD~': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions, like this:
'git <command> [<revision>...] -- [<file>...]'

Ошибка возникает из-за того, что если последняя фиксация является первоначальной фиксацией (или отсутствием родителей) в репозитории, нет HEAD ~.

Решение

Если вы хотите сбросить только фиксацию на "ведущей" ветке

$ git update-ref -d HEAD
$ git rm --cached -r .
4
ответ дан Nicholas 24 сент. '18 в 14:58
источник поделиться

Повторно опубликованный из моего ответа на другой экземпляр этого вопроса: Как раскрыть мой последний коммит в Git

Чтобы сохранить изменения от фиксации, которую вы хотите отменить

git reset --soft HEAD^

Чтобы уничтожить изменения от фиксации, которую вы хотите отменить

git reset --hard HEAD^

Вы также можете сказать

git reset --soft HEAD~2

для возврата двух коммитов.

Как упоминалось в charsi, если вы находитесь в Windows, вам нужно будет поставить HEAD или зафиксировать хеш в кавычках.

git reset --soft "HEAD^"
git reset --soft "asdf"
3
ответ дан Alex Kinnee 21 янв. '18 в 8:13
источник поделиться

Получите последний идентификатор фиксации с помощью этой команды (в журнале один вверху он является последним):

git log

Получите идентификатор фиксации (GUID) и запустите эту команду:

git revert <commit_id>
2
ответ дан Nalan Madheswaran 12 нояб. '18 в 3:49
источник поделиться
git revert commit

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

https://git-scm.com/docs/git-revert

1
ответ дан Gjorgi Gjorgiev 03 сент. '18 в 16:19
источник поделиться

Если вы просто хотите удалить все локальные изменения/коммиты и сделать свой локальный филиал похожим на ветвь происхождения, с которой вы начали...

git reset --hard origin/branch-name

1
ответ дан JeremyWeir 29 нояб. '18 в 23:44
источник поделиться
git reset --soft HEAD~1  // For soft delete
git reset --hard HEAD~1  // Complete removal

Вы можете использовать бесплатную программу gitkraken для удобства управления.

1
ответ дан Tijo John 15 янв. '18 в 16:07
источник поделиться

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

git reset --soft

Все изменения последнего фиксации будут нефиксированы.

Теперь, если вы хотите удалить ненужные файлы в рабочем дереве, вы можете использовать

git clean -f //use -d with -f if you want to process directories too

Теперь вы можете делать свои изменения и совершать снова с помощью:

git commit -m "removed unwanted files from last commit"
1
ответ дан Vivek Maru 18 дек. '17 в 13:08
источник поделиться

Git Revert to Old Commit

git reset --hard hash-to-reverted

git push origin HEAD --force

0
ответ дан JosephStar 09 июля '18 в 1:37
поделиться

Самый простой способ отменить последний коммит

git reset HEAD^

Это принесет состояние проекта до того, как вы сделали коммит.

0
ответ дан Arun Karnawat 10 дек. '18 в 10:05
источник поделиться

Если вы хотите отменить последнюю фиксацию, выполните следующий шаг:

1. git log: - для того, чтобы узнать commit-id, который вы хотите отменить

2. git revert commit-id: - используя эту команду, вы можете отменить фиксацию

или

1. git reset --hard HEAD ~ 1: - используйте это для сброса фиксации, вы также можете использовать commit-id вместо HEAD ~ 1

0
ответ дан Jitendra virani 06 февр. '18 в 8:31
источник поделиться

На моей стороне я использую GitKraken и просто нужно нажать на кнопку отмены/повтора...

0
ответ дан E.Racineux 20 янв. '18 в 23:12
источник поделиться
git push --delete (branch_name) //this will be removing the public version of your branch

git push origin (branch_name) //This will add the previous version back
0
ответ дан Omkaar.K 18 мая '18 в 10:00
источник поделиться

Как отредактировать предыдущую фиксацию

Как правило, я не хочу отменять кучу коммитов, а скорее редактирую более раннее сообщение о том, как бы я хотел, чтобы я его совершил в первую очередь.

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

Здесь рабочий процесс:

  1. git commit-edit <commit-hash>
    

    Это выведет вас на фиксацию, которую вы хотите отредактировать.

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

  2. Исправьте и выполните фиксацию, как вы хотели, в первую очередь.

    (Вы можете использовать git stash save --keep-index чтобы бежать от любых файлов, которые вы не совершаете)

  3. Повторите фиксацию с помощью --amend, например:

    git commit --amend
    
  4. Заполните rebase:

    git rebase --continue
    

Вызовите это следующее git-commit-edit и поместите его в свой $PATH:

#!/bin/bash

# Do an automatic git rebase --interactive, editing the specified commit
# Revert the index and working tree to the point before the commit was staged
# https://stackoverflow.com/a/52324605/5353461

set -euo pipefail

script_name=${0##*/}

warn () { printf '%s: %s\n' "$script_name" "$*" >&2; }
die () { warn "$@"; exit 1; }

[[ $# -ge 2 ]] && die "Expected single commit to edit. Defaults to HEAD~"

# Default to editing the parent of the most recent commit
# The most recent commit can be edited with 'git commit --amend'
commit=$(git rev-parse --short "${1:-HEAD~}")

# Be able to show what commit we're editing to the user
if git config --get alias.print-commit-1 &>/dev/null; then
  message=$(git print-commit-1 "$commit")
else
  message=$(git log -1 --format='%h %s' "$commit")
fi

if [[ $OSTYPE =~ ^darwin ]]; then
  sed_inplace=(sed -Ei "")
else
  sed_inplace=(sed -Ei)
fi

export GIT_SEQUENCE_EDITOR="${sed_inplace[*]} "' "s/^pick ('"$commit"' .*)/edit \\1/"'
git rebase --quiet --interactive --autostash --autosquash "$commit"~
git reset --quiet @~ "$(git rev-parse --show-toplevel)"  # Reset the cache of the toplevel directory to the previous commit
git commit --quiet --amend --no-edit --allow-empty  #  Commit an empty commit so that that cache diffs are un-reversed

echo
echo "Editing commit: $message" >&2
echo
0
ответ дан Tom Hale 27 сент. '18 в 16:12
источник поделиться

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

-2
ответ дан emory 11 окт. '17 в 3:48
источник поделиться

Visual Studio Code Git options

Я использую VS Code, и есть удобная интеграция git, которая позволяет мне отменить последнюю фиксацию одним щелчком мыши.

-2
ответ дан Lalnuntluanga Chhakchhuak 12 сент. '17 в 15:06
источник поделиться
  • 1
  • 2
  • 3

Другие вопросы по меткам или Задайте вопрос