Как восстановить из git push -force? - программирование
Подтвердить что ты не робот

Как восстановить из git push -force?

Вот что произошло:

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

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

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

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

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

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

master
feature1
origin/master
origin/feature1

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

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

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

4b9b3361

Ответ 1

Вы всегда можете восстановить ранее наблюдаемое состояние 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/[email protected]{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 или эквивалентное. Любые коммиты, проталкиваемые другими после того, как вы в последний раз вы получите, будут потеряны. Тем не менее, эти коммиты по-прежнему будут доступны в своих журналах, поэтому они могут восстановить их с помощью таких шагов, как указано выше.

Ответ 2

Обратите внимание, что с помощью Github вы можете использовать API для восстановления принудительного нажатия, даже если у вас нет локального хранилища репозитория (т.е. когда у вас нет рефлога) или commit 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

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

git clone [email protected]
git checkout master
git reset --hard origin/<new-branch-name>
git push -f origin master

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

Кредит: Sankara Rameswaran