Как восстановить из 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
, который перезаписал удаленную ветку, и теперь я потерял коммиты из запросов на перенос в удаленном репозитории.
Как я могу оправиться от него, не испортив историю других авторов?
Ответы
Ответ 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