Возврат главной ветви в предыдущее состояние - PullRequest
2 голосов
/ 05 января 2012

У меня есть две ветви: мастер и бонбон

В настоящее время они находятся в одной точке.Bonbon был побочным проектом, который собирался выпустить, но сейчас он был приостановлен.Я хотел бы вернуть основную ветвь до точки, предшествующей ветке bonbon.Однако я также хотел бы сохранить некоторые из изменений, которые я сделал в ветке bonbon, и в будущем может потребоваться слияние с веткой bonbon, поэтому я не хочу терять эти изменения.Каков наилучший способ отменить основную ветку и выбрать необходимые изменения.

Я попытался сбросить ветку, но когда я зафиксировал и протолкнул изменения, это не удалось, и я закончил слияние двух ветвей вместеснова!Должен ли я сделать сильный толчок (править: я имел в виду принудительный толчок)?

Ответы [ 2 ]

2 голосов
/ 05 января 2012

Что касается первой части вопроса.Если слияние с веткой bonbon является только верхним коммитом, то вам нужно только сбросить основную ветвь в состояние до слияния.

git reset --hard HEAD~1

Если у вас есть несколько точек слияния, вам придется сделатьинтерактивная перебазировка

git rebase -i

Теперь для синхронизации репо с пультом.Поскольку вы только что переписали историю, git не позволит вам просто зафиксировать это состояние.Вы должны будете сделать принудительное нажатие.

git push --force

Обратите внимание, что это перезапишет историю удаленного репо, и любой, кто использует это репо, будет вынужден вытащить изменения.

2 голосов
/ 05 января 2012

Я предполагаю, что, сбрасывая ветку, вы имели в виду что-то вроде этого, в то время как на ветке master:

git reset --hard some_ref_below_master

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

Итак, у вас нетдругой выбор, кроме принудительного нажатия - либо с помощью git push --force, либо с git push +localref:remoteref (локальная спецификация ссылки может быть опущена, если удаленная ссылка имеет то же имя).

Например:

git push remote +master # force local and remote master on the same commit
git push +foo:bar # force remote's bar ref to point to the same commit as local's foo
...