Git - Отменить нажатые фиксации

У меня есть проект в удаленном репозитории, синхронизированный с локальным репозиторием (разработка) и сервером (prod). Я делаю некоторые внесенные изменения, уже перенесенные на удаленный и вытаскиваемый с сервера. Теперь я хочу отменить эти изменения. Поэтому я мог бы просто git checkout выполнить фиксацию перед изменениями и зафиксировать новые изменения, но я предполагаю, что возникнут проблемы, чтобы снова нажать их на удаленный. Любое предложение о том, как мне следует продолжить?

Ответ 1

Вы можете отменить отдельные коммиты с помощью:

git revert <commit_hash>

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

git revert <oldest_commit_hash>..<latest_commit_hash>

Он отменяет коммиты между указанными коммитами и включая их.

Посмотрите man-страницу git-revert для получения дополнительной информации о команде git revert. Также посмотрите на этот ответ для получения дополнительной информации о возврате коммитов.

Ответ 2

Решение, которое не оставляет следов "отмены".

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

делать:

git reset <previous label or sha1>

это будет повторно оформлять все обновления локально (поэтому в git status будут перечислены все обновленные файлы)

затем вы "делаете свою работу" и повторно фиксируете свои изменения (Примечание: этот шаг не является обязательным)

git commit -am "blabla"

В данный момент ваше локальное дерево отличается от удаленного

git push -f <remote-name> <branch-name>

подтолкнет и заставит удаленное устройство рассмотреть это нажатие и удалит предыдущее (указание remote-name и branch-name не обязательно, но рекомендуется избегать обновления всех веток с флагом обновления).

!! следите за тем, чтобы некоторые теги все еще указывали на удаленный коммит !! как к удалению-а-удаленный тег

Ответ 3

Что я делаю в этих случаях:

  • На сервере переместите курсор обратно к последнему известному хорошему фиксации:

    git push -f origin <last_known_good_commit>:<branch_name>
    
  • Локально, сделайте то же самое:

    git reset --hard <last_known_good_commit>
    #         ^^^^^^
    #         optional
    



См. полный пример в ветке my_new_branch, которую я создал для этой цели:

$ git branch
my_new_branch

Это недавняя история после добавления некоторого материала в myfile.py:

$ git log
commit 80143bcaaca77963a47c211a9cbe664d5448d546
Author: me
Date:   Wed Mar 23 12:48:03 2016 +0100

    Adding new stuff in myfile.py

commit b4zad078237fa48746a4feb6517fa409f6bf238e
Author: me
Date:   Tue Mar 18 12:46:59 2016 +0100

    Initial commit

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

$ git push -f origin b4zad078237fa48746a4feb6517fa409f6bf238e:my_new_branch
Total 0 (delta 0), reused 0 (delta 0)
To [email protected]:me/myrepo.git
 + 80143bc...b4zad07 b4zad078237fa48746a4feb6517fa409f6bf238e -> my_new_branch (forced update)

Ницца! Теперь я вижу, что файл, который был изменен на этом коммите (myfile.py), показан в "не поставлен для фиксации":

$ git status
On branch my_new_branch
Your branch is up-to-date with 'origin/my_new_branch'.

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    modified:   myfile.py

no changes added to commit (use "git add" and/or "git commit -a")

Так как я не хочу этих изменений, я просто перемещаю курсор обратно локально:

$ git reset --hard b4zad078237fa48746a4feb6517fa409f6bf238e
HEAD is now at b4zad07 Initial commit

Итак, теперь HEAD находится в предыдущем фиксации, как локальном, так и удаленном:

$ git log
commit b4zad078237fa48746a4feb6517fa409f6bf238e
Author: me
Date:   Tue Mar 18 12:46:59 2016 +0100

    Initial commit

Ответ 4

Вы можете ОБРАТИТЬ (или вы также можете назвать это УДАЛИТЬ) Git Commit ОБА Локально и Удаленно, если вы выполните шаги, указанные ниже, через командную строку git.

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

git log --oneline --decorate --graph

Вы получите следующий скриншот enter image description here

Если вы также проверите удаленный (через веб-интерфейс), вы увидите, что это будет так же, как показано ниже

enter image description here

Согласно скриншоту, в данный момент вы находитесь на коммите e110322, однако вы хотите вернуться к 030bbf6 ОБА ЛОКАЛЬНО и УДАЛЕННО.

Выполните следующие шаги, чтобы УДАЛИТЬ/ОТМЕНИТЬ коммиты локально + удаленно


Первый локальный возврат к фиксации id 030bbf6

git reset --hard 030bbf6

с последующим

git clean -f -d

Эти две команды очищают принудительный сброс до фиксации стадии 030bbf6, как показано ниже на снимке

enter image description here

Теперь, если вы запустите git status, вы увидите, что вы ДВА КОМИТЕТА ВНИЗ из удаленной ветки, как показано ниже enter image description here

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

git fetch --all

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

enter image description here Код

git push -u origin +master

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

enter image description here

Ответ 5

git revert HEAD -m 1

В приведенной выше строке кода. "Последний аргумент представляет"

  • 1 - возвращает один коммит.

  • 2 - возвращает последние два коммита.

  • n - возвращает последние n коммитов.

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


Позже используйте git commit -am "COMMIT_MESSAGE" затем git push или git push -f

Ответ 6

Это удалит ваши заданные коммиты

git reset --hard 'xxxxx'

git clean -f -d

git push -f

Ответ 7

Использование команды git reflog для определения последнего известного хорошего состояния вашего репо.

Затем выполните git reset --hard < commit >, чтобы вернуться к нему.

Затем другой git нажмите --force, чтобы вернуть удаленный репозиторий в это состояние.