Как заставить rebase, когда одни и те же изменения применяются к обеим веткам вручную? - PullRequest
2 голосов
/ 22 апреля 2010

Мой репозиторий выглядит следующим образом:

X - Y- A - B - C - D - E             branch:master
     \                  \
      \                  \ merge master -> release
       \                  \
        M  ---  BCDE  ---  N         branch:release 

Здесь "M - BCDE - N" вручную (к сожалению!) Применяются изменения примерно так же, как отдельные коммиты "A - B - C - D - E" (но кажется GIT не знает, что эти изменения одинаковы).Я хотел бы перебазировать и получить следующую структуру:

X - Y- A - B - C - D - E     branch:master
                        \
                         *   branch:release 

Т.е. я хочу сделать ветвь: выпуск точно такой же, как ветвь: мастер и разветвлять ее из головы мастера.

Но когда я запускаю «git rebase master» в выпуске ветки, GIT сообщает о множестве конфликтов и отказывается от перебазировки.Как я мог решить эту проблему?

Другое объяснение этого: я хотел бы «воссоздать» ветку: освободить с нуля от HEAD мастера.И есть много других людей, которые уже сделали "git pull" для ветки: release, поэтому я не могу использовать git reset + git push -f.

Ответы [ 2 ]

1 голос
/ 22 апреля 2010

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

Если вы хотите выбросить все наотпустите ветку (меня немного смущает M) и сделайте ее идентичной мастеру (почему вы показываете *?), вот что вы можете сделать:

git checkout master
git merge --strategy=ours release   # merge in release, but keep master's contents
git checkout release
git merge master                    # fast-forward

You 'в итоге получим следующее:

X - Y- A - B - C - D - E ----- Z (master, release)
     \                  \     /
      \                  \   /
       \                  \ /
        M  ---  BCDE  ---  N

При коммите слияния Z все изменения будут отменены с момента выпуска;это просто для того, чтобы релиз двигался вперед.Из документации:

наша

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

Это как раз ваша ситуация!

Также неплохо использовать опцию --no-commit взатем выполните коммит вручную, чтобы у вас была возможность отредактировать сообщение и заметить, что вы сделали.

0 голосов
/ 22 апреля 2010

Вы можете использовать git rebase -i master и удалить строку для BCDE, чтобы полностью отменить эту ревизию. Если он действительно идентичен A-B-C-D-E, то у вас не должно быть проблем.

...