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

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

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

18222
задан Hamza Yerlikaya 29 мая '09 в 21:09
источник поделиться
87 ответов
  • 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 :)
13
ответ дан Eugen Konkov 28 февр. '18 в 11:34
источник поделиться

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

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

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

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

В нижеприведенном изображении я проверяю ветку проверки (используя Git command 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, и все же выполнить commit.

enter image description here

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

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

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

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

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

git rebase --onto HEAD~1 HEAD

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

a → b → c → d → master

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

git rebase --onto b c

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

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

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

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

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

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

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

enter image description here

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

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

ГЛАВА:

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

git committ:

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

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

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

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

Способ 2: (если вы знаете, что совершите переадресацию на ваш известный коммит)

git reset 0xab3 # номер фиксации

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

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

enter image description here

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

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

git log

затем

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

Шаг 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 --hard <commit_hash>

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

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

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

$ git log

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

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

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

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

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

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

  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 для принудительного нажатия.
5
ответ дан Theo Itzaris 16 сент. '18 в 11:36
источник поделиться
git reset --hard your_last_good_commit_hash_here

git push --force origin master
4
ответ дан sony vizio 17 марта '17 в 0:20
источник поделиться

Повторно опубликованный из моего ответа на другой экземпляр этого вопроса: Как раскрыть мой последний коммит в 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 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 .
3
ответ дан Nicholas 24 сент. '18 в 14:58
источник поделиться
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
источник поделиться

На моей стороне я использую 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
источник поделиться

Git Revert to Old Commit

git reset --hard hash-to-reverted

git push origin HEAD --force

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

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

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

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

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

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
источник поделиться

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

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

Visual Studio Code Git options

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

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

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