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
Как только вы закончите с этим, вы должны принудительно нажать этот коммит, используя символ + перед веткой, как показано ниже. Я использовал здесь в качестве основного ветки, вы можете заменить его любым
Код
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, чтобы вернуть удаленный репозиторий в это состояние.