Как оправиться от git push -force?
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, поэтому они могут восстановить их, используя шаги, как указано выше.
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Вопросы из категории :
- git Как я могу отменить git reset --hard HEAD ~ 1?
- git Как настроить Git голый доступный по HTTP репозиторий на IIS
- git Как мне отменить неустановленные изменения в Git?
- git Как удалить локальные (неотслеживаемые) файлы из текущего рабочего дерева Git?
- git Как клонировать все удаленные ветки в Git?
- git Частичные коммиты с Subversion
- git Как перенести репозиторий SVN с историей в новый репозиторий Git?
- git Как восстановить сброшенный тайник в Git?
- git Как я могу добавить пустой каталог в Git-репозиторий?
- git Как вытащить из Git-репозитория через HTTP-прокси?
- github Как я могу удалить коммит на GitHub?
- github Доступ к оболочке git в GitX в OS X
- github Как мне вытащить свой проект из github?
- github Обновление локального репозитория с изменениями из репозитория GitHub
- github Ссылка на номер проблемы на GitHub в сообщении фиксации
- github Как клонировать проект github для локального запуска?
- github Лучший рабочий процесс с Git & Github
- github Git - только push up самый последний коммит на github
- github Как лучше всего работать с паролями в git-репозиториях?