Вы должны иметь возможность принудительно установить локальную ревизию в удаленном репо, используя
git push -f <remote> <branch>
(например git push -f origin master
). Уход <remote>
и <branch>
заставит толкнуть все локальные ветви, которые установили --set-upstream
.
Просто предупреждаю, что если другие люди делятся этим хранилищем, их история изменений будет конфликтовать с новой. И если у них есть какие-либо локальные коммиты после точки изменения, они станут недействительными.
Обновление : думал, я бы добавил примечание. Если вы создаете изменения, которые будут просматривать другие, то нередко создается ветка с этими изменениями и периодически обновляется, чтобы поддерживать их актуальность в основной ветке разработки. Просто сообщите другим разработчикам, что это будет происходить периодически, чтобы они знали, чего ожидать.
Обновление 2 : из-за растущего числа зрителей я хотел бы добавить дополнительную информацию о том, что делать, когда вы upstream
испытываете принудительный толчок.
Скажем, я клонировал ваш репо и добавил несколько коммитов так:
D ---- E тема
/
A ---- B ---- C разработка
Но позже в development
ветке появляется буква a rebase
, которая заставляет меня получать сообщение об ошибке, например, при запуске git pull
:
Распаковка предметов: 100% (3/3), готово.
Из <репо-местоположения>
* развитие филиала -> FETCH_HEAD
Авто-слияние <файлы>
КОНФЛИКТ (контент): конфликт слияния в <местоположениях>
Автоматическое объединение не выполнено; исправить конфликты, а затем зафиксировать результат.
Здесь я мог бы исправить конфликты и commit
, но это оставило бы меня с действительно ужасной историей коммитов:
C ---- D ---- E ---- F тема
/ /
A ---- B -------------- C 'разработка
Это может показаться заманчивым в использовании, git pull --force
но будьте осторожны, потому что это оставит вас с мельчайшими коммитами:
D ---- E тема
A ---- B ---- C 'разработка
Так что, вероятно, лучший вариант - это сделать git pull --rebase
. Это потребует от меня разрешения любых конфликтов, как раньше, но для каждого шага вместо фиксации я буду использовать git rebase --continue
. В итоге история коммитов будет выглядеть намного лучше:
D '--- E' тема
/
A ---- B ---- C 'разработка
Обновление 3: Вы также можете использовать эту --force-with-lease
опцию в качестве «более безопасного» принудительного толчка, как упомянул Кексейк в своем ответе :
Принудительное нажатие с помощью «аренды» позволяет принудительно выполнить принудительное нажатие, если на удаленном компьютере появятся новые коммиты, которых вы не ожидали (технически, если вы еще не загрузили их в ветку удаленного отслеживания), что полезно, если Вы не хотите случайно перезаписывать чужие коммиты, о которых вы даже не знали, и просто хотите переписать свои собственные:
git push <remote> <branch> --force-with-lease
Вы можете узнать больше о том, как использовать --force-with-lease
, прочитав любое из следующего:
git push origin --force
работал у вас?