Git fast forward заменяет весь репо, удаляя предыдущую историю
На github есть репозиторий A. Я клонировал этот репо в свой местный житель из github. Исходное хранилище A имеет ветку с именем "a", которая принадлежит предыдущей версии от A. Владелец хранилища сделал коммит, который удалил историю и заменил все файлы в хранилище. На GitHub, если вы объединяете два, он говорит, A and a are entirely different commit histories
Моя проблема в том, что я хочу отправить коммит на синхронизированный вид, который был похож на резервное копирование, прежде чем владелец быстро перенаправил основную ветвь. Но если я сделаю git pull перед коммитом (что является хорошей практикой), я обязательно столкнусь с проблемами, потому что это совсем не синхронизируется.
Лучшим решением было бы прекратить отслеживать, что делает мастер, и заменить его веткой, что невозможно в отношении того, что я знаю. Что я должен сделать, чтобы удалить коммит ускоренной перемотки и синхронизировать его с веткой 'a'.
PS Владелец репо получает ![rejected] master -> master (non-fast-forward)
это он пытается сделать git pull. Говорит "верхушка его текущей ветви находится позади его удаленного коллеги"
Если какая-либо часть неясна, пожалуйста, не стесняйтесь спрашивать, я сталкиваюсь с этой проблемой, так как непрерывно 2 дня! Благодарю.
2 ответа
Я решил это простым решением.
1. Локальные изменения были совершены сgit commit -a -m 'temp'
,
2. Я сделал новую ветку со всеми этими изменениями, отраженными на моей локальной машине.
3. Сделал заказ на мастер ветке. git checkout master
4. Сделал принудительный толчок после совершения моего первоначального репо. git push -f upstream master
Теперь мои локальные и оригинальные репо полностью синхронизированы.
PS Существует много предупреждений о принудительном толчке, поскольку это меняет историю. Так что используйте его очень осторожно.
(Если у вас где-то спрятан вопрос, я точно не смог его найти. Вот мой ответ, основанный на угадывании того, что вы пытались задать:)
Я не уверен, почему вы думаете, что делать слепой git pull
хорошая практика перед тем, как что-то делать. Делать git fetch
с последующим gitk master origin/master
Конечно, имеет смысл получить представление о текущем статусе. Тогда вы обычно хотите выбрать между git checkout master && git rebase origin/master
а также git checkout master && git merge origin/master
,
Если ваш местный master
Ветка где-то не должна быть, сначала убедитесь, что у вас нет незафиксированных изменений, а затем выполните git checkout master && git reset --hard [sha1-of-the-commit-you-want]
переместить master
Ветка где угодно. Если вы хотите переписать основную ветку на origin
с вашим новым правильным состоянием, просто сделайте git push -f origin master
, Обратите внимание, что если другие люди проверили старые master
от origin
, нужно будет отменить все свои коммиты, чтобы подписаться на ваш новый master
, См. https://www.kernel.org/pub/software/scm/git/docs/git-rebase.html для получения подробной информации.