Отмена 'git push'
Вот что я сделал на моей предположительно устойчивой ветке...
% git rebase master
First, rewinding head to replay your work on top of it...
Fast-forwarded alpha-0.3.0 to master.
% git status
# On branch alpha-0.3.0
# Your branch is ahead of 'origin/alpha-0.3.0' by 53 commits.
#
nothing to commit (working directory clean)
% git push
Fetching remote heads...
refs/
refs/heads/
refs/tags/
refs/remotes/
'refs/heads/master': up-to-date
updating 'refs/heads/alpha-0.3.0'
from cc4b63bebb6e6dd04407f8788938244b78c50285
to 83c9191dea88d146400853af5eb7555f252001b0
done
'refs/heads/unstable': up-to-date
Updating remote server info
Это была ошибка, как я понял позже. Я хотел бы отменить весь этот процесс и вернуть ветку alpha-0.3.0 обратно в то, что было.
Что мне делать?
Ответы
Ответ 1
Вам нужно убедиться, что другие пользователи этого репозитория не получат неправильные изменения или не пытаются построить поверх коммитов, которые вы хотите удалить, потому что вы собираетесь перемотать историю.
Затем вам нужно "принудительно" нажать старую ссылку.
git push -f origin last_known_good_commit:branch_name
или в вашем случае
git push -f origin cc4b63bebb6:alpha-0.3.0
В удаленном репозитории может быть установлен receive.denyNonFastForwards
. Если это так, тогда вы получите сообщение об ошибке, которое включает фразу [remote rejected]
.
В этом случае вам нужно будет удалить и воссоздать ветвь.
git push origin :alpha-0.3.0
git push origin cc4b63bebb6:refs/heads/alpha-0.3.0
Если это не сработает - возможно, потому, что у вас установлен receive.denyDeletes
, тогда вы должны иметь прямой доступ к репозиторию. В удаленном репозитории вы должны сделать что-то вроде следующей команды сантехника.
git update-ref refs/heads/alpha-0.3.0 cc4b63bebb6 83c9191dea8
Ответ 2
Я считаю, что вы также можете это сделать:
git checkout alpha-0.3.0
git reset --hard cc4b63bebb6
git push origin +alpha-0.3.0
Это очень похоже на последний метод, за исключением того, что вам не нужно гасить в удаленном репо.
Ответ 3
git revert
менее опасен, чем некоторые из предложенных здесь подходов:
prompt> git revert 35f6af6f77f116ef922e3d75bc80a4a466f92650
[master 71738a9] Revert "Issue #482 - Fixed bug."
4 files changed, 30 insertions(+), 42 deletions(-)
prompt> git status
# On branch master
# Your branch is ahead of 'origin/master' by 1 commit.
#
nothing to commit (working directory clean)
prompt>
Замените 35f6af6f77f116ef922e3d75bc80a4a466f92650 своей собственной фиксацией.
Ответ 4
Принятое решение (от @charles bailey) очень опасно, если вы работаете в общем репо.
Как наилучшая практика, все коммиты, отодвинутые к удаленному репо, который является общим, должны считаться "неизменяемыми".
Вместо этого используйте git revert ':
http://www.kernel.org/pub/software/scm/git/docs/user-manual.html#fixing-mistakes
https://git-scm.com/book/be/v2/Git-Basics-Undoing-Things
Ответ 5
Способ сделать это, не теряя желаемых изменений:
git reset cc4b63b
git stash
git push -f origin alpha-0.3.0
git stash pop
Затем вы можете выбрать файлы, которые вы хотели нажать
Ответ 6
Другой способ сделать это:
- создать другую ветку
- проверить предыдущую фиксацию на этой ветке с помощью "git checkout"
- нажмите новую ветку.
- удалите старую ветку и нажмите delete (используйте
git push origin --delete <branch_name>
)
- переименуйте новую ветку в ветвь
- нажмите еще раз.
Ответ 7
git push origin +7f6d03:master
Это приведет к возврату вашего репо к указанному номеру фиксации
Ответ 8
Отменить несколько коммитов
git reset --hard 0ad5a7a6 (просто укажите фиксацию SHA1)
Отменить последнюю фиксацию
git reset --hard HEAD ~ 1 (изменения последнего фиксации будут удалены) git reset --soft HEAD ~ 1 (изменения в последнем фиксации будут доступны как локальные локальные изменения)
Ответ 9
Сценарий 1. Если вы хотите отменить последний коммит, скажем, 8123b7e04b3, ниже приведена команда (это работает для меня):
git push origin +8123b7e04b3^:<branch_name>
Вывод выглядит так:
Total 0 (delta 0), reused 0 (delta 0)
To https://testlocation/code.git
+ 8123b7e...92bc500 8123b7e04b3^ -> master (forced update)
Дополнительная информация: Сценарий 2: В некоторых ситуациях вы можете вернуть обратно то, что вы только что отменили (в основном, отменить отмену) с помощью предыдущей команды, а затем использовать следующую команду:
git reset --hard 8123b7e04b3
Выход:
HEAD is now at cc6206c Comment_that_was_entered_for_commit
Более подробная информация здесь: https://github.com/blog/2019-how-to-undo-almost-anything-with-git
Ответ 10
Существующие ответы являются хорошими и правильными, однако что если вам нужно отменить push
, но:
- Вы хотите сохранить коммиты локально или оставить незафиксированные изменения
- Вы не знаете, сколько коммитов вы только что нажали
Используйте эту команду, чтобы вернуть изменения в ссылку:
git push -f origin refs/remotes/origin/<branch>@{1}:<branch>
Ответ 11
Если вы хотите игнорировать последний коммит, который вы только что выдвинули в удаленной ветке: это не удалит коммит, а просто проигнорирует его, переместив указатель git на коммит ранее, на который ссылается HEAD ^ или HEAD ^ 1
git push origin +HEAD^:branch
Но если вы уже выдвинули этот коммит, а другие потянули ветку. В этом случае переписывание истории веток нежелательно, и вам следует вместо этого отменить этот коммит:
git revert <SHA-1>
git push origin branch