Как оправиться от git push -force?

git github

15432 просмотра

2 ответа

Вот что случилось:

У меня есть две удаленные ветви git: masterи feature1. По какой-то причине я должен использовать git push --forceдля feature1ветви, но я не знал, когда я использую git push --forceэто также подтолкнет masterветви. Затем произошла катастрофа, когда я перенес свой локальный masterфилиал в удаленный репозиторий.

К счастью, мой местный филиал не слишком далеко от удаленного. В основном, мой пульт masterимеет два запроса на слияние перед моим локальным master.

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

Есть ли другой способ оправиться от этой катастрофы? Я узнал, что --forceэто действительно очень плохой выбор. :(

Обновление, пример того, что произошло:

У меня есть следующие ветки:

master
feature1
origin/master
origin/feature1

Я интегрирую два запроса на получение с помощью GitHub Auto merge pull requests. Тогда я не получил masterветку на моей локальной машине. Таким образом, я думаю, что мои origin/masterдве версии позади удаленного мастера.

Тогда я случайно использовал git -f push, который переписал удаленную ветку, и теперь я потерял коммиты из запросов на извлечение в удаленном репозитории.

Как я могу восстановиться после этого, не испортив историю других участников?

Автор: Brian Источник Размещён: 13.11.2019 11:31

Ответы (2)


80 плюса

Решение

Вы всегда можете восстановить ранее наблюдаемое состояние master, сбросив старый коммит и выдав другой push -f. Шаги обычно выглядят так:

# work on local master
git checkout master

# reset to the previous state of origin/master, as recorded by reflog
git reset --hard origin/master@{1}

# at this point verify that this is indeed the desired commit.
# (if necessary, use git reflog to find the right one, and
# git reset --hard to that one)

# finally, push the master branch (and only the master branch) to the server
git push -f origin master

Тем не менее, обратите внимание, что это восстанавливает удаленное masterсостояние, которое было получено последним git fetchили эквивалентным. Любые коммиты, выдвинутые другими после последней загрузки, будут потеряны. Тем не менее, эти коммиты будут по-прежнему доступны в их reflogs, поэтому они могут восстановить их, используя шаги, как указано выше.

Автор: user4815162342 Размещён: 24.09.2012 05:06

22 плюса

Обратите внимание, что с Github вы можете использовать API для восстановления принудительной отправки, даже если у вас нет клонированного хранилища локально (т. Е. Когда у вас нет reflog) или коммитов sha.

Сначала вы должны получить предыдущий коммит ша, предшествующий принудительному пушу:

curl -u <username> https://api.github.com/repos/:owner/:repo/events

Затем вы можете создать ветку из этого ша:

curl -u <github-username> -X POST -d '{"ref":"refs/heads/<new-branch-name>", "sha":"<sha-from-step-1>"}' https://api.github.com/repos/:owner/:repo/git/refs

Наконец, вы можете локально клонировать репозиторий и снова принудительно нажать на master:

git clone repo@github
git checkout master
git reset --hard origin/<new-branch-name>
git push -f origin master

Обратите внимание, что при двухфакторной аутентификации вам необходимо предоставить токен ( дополнительную информацию см. Здесь ).

Предоставлено: Шанкара Рамесваран.

Автор: GHugo Размещён: 07.04.2017 06:54
Вопросы из категории :
32x32