Отмена "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 обратно в прежнее состояние.

Что я должен делать?

18 ответов

Решение

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

Затем вам нужно "принудительно" нажать на старую ссылку.

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

Я считаю, что вы также можете сделать это:

git checkout alpha-0.3.0
git reset --hard cc4b63bebb6
git push origin +alpha-0.3.0

Это очень похоже на последний метод, за исключением того, что вам не нужно копаться в удаленном репо.

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 своим собственным коммитом.

Способ сделать это без потери изменений, которые вы хотели:

git reset cc4b63b 
git stash
git push -f origin alpha-0.3.0
git stash pop

Затем вы можете выбрать файлы, которые вы хотели нажать

git push origin +7f6d03:master

Это вернет ваш репо к указанному номеру коммита

Принятое решение (от @charles bailey) очень опасно, если вы работаете в общем репо.

Рекомендуется, чтобы все коммиты, переданные в удаленное репо с общим доступом, считались "неизменяемыми". Вместо этого используйте "git revert": http://www.kernel.org/pub/software/scm/git/docs/user-manual.html

https://git-scm.com/book/be/v2/Git-Basics-Undoing-Things

      git reset --hard HEAD^
git push origin -f

Это удалит последний коммит с вашего локального устройства, а также с Github.

Еще один способ сделать это:

  1. создать другую ветку
  2. оформить предыдущий коммит в этой ветке, используя "git checkout"
  3. нажмите новую ветку.
  4. удалить старую ветку и нажать удалить (использовать git push origin --delete <branch_name>)
  5. переименовать новую ветку в старую ветку
  6. нажмите снова

Сценарий 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

Отмена множественных коммитов git reset --hard 0ad5a7a6 (просто предоставьте хеш SHA1 коммитов)

Отменить последний коммит

git reset --hard HEAD~1 (изменения последнего коммита будут удалены) git reset --soft HEAD~1 (изменения последнего коммита будут доступны в виде незафиксированных локальных изменений)

Вы можете использовать команду сброса

git reset --soft HEAD^1

тогда:

git reset <files>
git commit --amend

а также

git push -f

Поскольку этот ответ, по-видимому, является дубликатом вопроса. Как удалить коммит на GitHub?, и туда нельзя добавить ответы, поскольку он помечен как повторяющийся, правильный еще не опубликованный ответ на этот вопрос следующий:

Вам необходимо обратиться в службу поддержки.В справочной документации GitHub говорится (выделено мной):

Коммиты по-прежнему могут быть доступны в любых клонах или ветвях вашего репозитория, напрямую через их хэши SHA-1 в кэшированных представлениях на GitHub и через любые запросы на включение, которые ссылаются на них. Вы не можете удалить конфиденциальные данные из клонов вашего репозитория, принадлежащих другим пользователям, но вы можете навсегда удалить кэшированные представления и ссылки на конфиденциальные данные в запросах на включение на GitHub , связавшись с нами через портал поддержки GitHub.

Пока их поддержка не удалит его вручную, вы всегда можете просмотреть идентификатор фиксации, и в запросах на включение он будет постоянно отображаться, даже если вы использовалиgit reset,git gc,push -fи т. д., как предполагают другие ответы.

Для вашего собственного репозитория удаление всего репозитория кажется единственным, что вы можете сделать самостоятельно, чтобы заставить GitHub удалить идентификатор фиксации. (Обратите внимание, что они все равно сохранят копию, если на коммит была ссылка где-то еще.)

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

Если вы хотите отменить определенное нажатие, вы также можете сделать это в интерактивном режиме с помощью

      git rebase -i HEAD~n

гдеnдолжен обозначать, сколько коммитов в прошлое вы хотите сделать, например

      git rebase -i HEAD~5

Теперь вы можете в интерактивном режиме перейти к коммиту в терминале, который хотите удалить (удалить), и написать «drop» (хотя в открывшемся терминале это тоже очень хорошо объяснено).

Когда вы закончите ребазирование, не забудьте принудительно отправить изменения, т.е.

      git push origin branch_name --force

Существующие ответы хороши и верны, но что, если вам нужно отменить push но:

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

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

git push -f origin refs/remotes/origin/<branch>@{1}:<branch>

Я была такая же проблема. Я просто копирую последний идентификатор фиксации (af12de...), который я хотел вернуть. Затем выполняет эту команду git revert af12de.... Затем вставьте мои изменения в master. Это сработало для меня

Чтобы отменить толчок

      git reset --hard HEAD@{1}
git push -f
git reset --hard HEAD@{1}

теперь ваш местный будет впереди удаленного

      git reset --hard origin/master

или альтернативный способ

  1. Чтобы сбросить нажатие: git reset --soft HEAD^1

  2. Появится файл изменения, поэтому сбросьте их: git reset <files>

  3. git commit --amend

  4. git push -f

Это удалит последний отправленный коммит в удаленной ветви (основной или вашей ветви):

git push origin +HEAD^:master      

У людей, использующих gitlab, есть кнопка «Параметры», которая содержит «Вернуться».

Другие вопросы по тегам