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

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

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

Ответы [ 78 ]

25 голосов
/ 10 декабря 2015

Вы всегда можете сделать git checkout <SHA code> предыдущей версии, а затем зафиксировать снова с новым кодом.

24 голосов
/ 06 ноября 2016

Чтобы избавиться от (всех изменений) последнего коммита, последних 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 голосов
/ 02 августа 2017

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

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

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

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

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

18 голосов
/ 30 марта 2017

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

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

Откройте Git Extensions, щелкните правой кнопкой мыши на коммите, который вы хотите отменить, и выберите «Отменить коммит».

Git Extensions screen shot

Откроется всплывающее окно (см. Скриншот ниже)

Revert commit popup

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

16 голосов
/ 21 декабря 2018

Разница между git reset --mixed, --soft и --hard

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

Давайте рассмотрим пример:

- A - B - C (master)

HEAD указывает на C, а индекс соответствует C.

- мягкая

  • Когда мы выполняем git reset --soft B с намерением удалить коммит C и , указывая мастеру / HEAD значение B .
  • Master / HEAD теперь будет указывать на B, но индекс все еще изменился с C .
  • При выполнении git status вы могли видеть файлы, проиндексированные в commit C как staged .
  • Выполнение git commit в этот момент создаст новый коммит с теми же изменениями, что и C

- смешанный

  • Выполнить git reset --mixed B.
  • При выполнении master / HEAD будет указывать на B, а индекс также изменяется в соответствии с B из-за используемого смешанного флага.
  • Если в этот момент мы запустим git commit, ничего не произойдет, так как индекс соответствует HEAD .
  • У нас все еще есть изменения в рабочем каталоге, но, поскольку они отсутствуют в индексе, git status показывает их как неизмененные .
  • Чтобы зафиксировать их, вы должны git add, а затем зафиксировать как обычно.

- жесткий

  • Выполнить git reset --hard B
  • При выполнении master / HEAD будет указывать на B и изменяет ваш рабочий каталог
  • Изменения , добавленные в C и , все незафиксированные изменения будут удалены .
  • Файлы в рабочей копии будут соответствовать коммиту B, это приведет к окончательной потере всех изменений, которые были внесены в коммит C, а также к незафиксированным изменениям

Надеюсь, что сравнение флагов, доступных для использования с командой git reset, поможет кому-то использовать их с умом. Обратитесь к ним для получения более подробной информации link1 & link2

16 голосов
/ 29 мая 2016

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

16 голосов
/ 15 декабря 2016

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

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

git commit --amend        # Change last commit
git reset HEAD~1 --soft   # Undo last commit
16 голосов
/ 28 февраля 2018

Вот сайт: 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 :)
15 голосов
/ 10 декабря 2018

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

git reset HEAD^

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

15 голосов
/ 06 марта 2018

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

На изображении ниже я проверяю ветку '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

...