Отмена '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, но:

  1. Вы хотите сохранить коммиты локально или оставить незафиксированные изменения
  2. Вы не знаете, сколько коммитов вы только что нажали

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

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