Невозможно нажать Мастер после сброса, ветвления и слияния - PullRequest
0 голосов
/ 11 октября 2011

Я сделал несколько нестабильных изменений коммита, которые также были выдвинуты.Мое воображаемое дерево коммитов выглядит следующим образом:

A -> B -> C -> D

Коммит "A" был последним стабильным коммитом.Обнаружив, что более поздние изменения были нестабильными, я вернулся к последней стабильной ревизии, используя

git checkout A

Затем я создал новую ветку "stable" с

git checkout -b stable

И продолжил работу в этой ветке.Теперь я хочу объединить с master, но я не хочу удалять изменения, которые у меня были ранее, поэтому я хотел добавить их в новую ветку вместо использования revert.Следуя совету в этой ветке , я сделал следующее из основной ветки:

нестабильная ветка git

сброс git --hard HEAD ~ 3

Так что теперь HEAD указывает на фиксацию A, и новая ветка "unstable" начинается с фиксации B. Но я хочу объединить мои стабильные изменения (в ветке "stable"), поэтому я использую

git merge stable

И оно успешно завершается без конфликтов, и HEAD теперь указывает на последнюю ревизию с объединенными стабильными изменениями. Теперь я могу выдвинуть все ветки в свой репозиторий, кромемастер, который сообщает об ошибке не-перемотки вперед.Если я потяну, он, похоже, вытянет все нестабильные изменения, которые у меня были ранее.

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

1 Ответ

1 голос
/ 11 октября 2011

Ключевой вопрос здесь заключается в том, использует ли кто-нибудь еще вашу основную ветку и может уже получить эту версию. Если нет, тогда вы можете сделать «принудительный» толчок, который перезапишет старую версию master. Вы можете сделать это с помощью:

 git push -f origin master

Однако, если кто-то мог использовать ветку master, вы не хотите переписывать публичную историю. В этом случае вы можете сделать:

 git fetch origin
 git merge -s ours origin/master
 git push origin master

"Наша" стратегия слияния гласит, что нужно создать коммит слияния, но игнорировать весь контент, в который вы сливаете (то есть вашу старую ветвь master). Тогда ваша история будет содержать историю master в origin, поэтому вы сможете использовать ее без использования опции -f (--force).

Ваша ветка unstable, конечно же, будет существовать локально в обоих случаях.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...