Как я могу перебазировать 2 ветки темы в новую ветку? - PullRequest
3 голосов
/ 29 декабря 2011

Это текущее состояние моей истории репозитория git:

--o--o--o--o--o--o--o master
            \
             o--o--o--o--o  topic2
                   |
                 topic1

Я хочу переназначить topic1 и topic2 на master и сделать так:

--o--o--o--o--o--o--o master
                     \
                      o--o--o--o--o  topic2
                            |
                          topic1

Каков наилучший метод для достижения этой цели?

Ответы [ 3 ]

4 голосов
/ 29 декабря 2011
git rebase master topic2
git branch -f topic1 HEAD~2   # On (rebased) topic2, set topic1 pointer

Обратите внимание, что это предполагает, что topic1 - это просто указатель на прошлое topic2, то есть не должно быть никаких коммитов на topic1, которые не на topic2. (HEAD~2 предполагает историю коммитов, как показано, на самом деле вы, вероятно, захотите использовать конкретный идентификатор фиксации. Обратите внимание, как это также будет работать, если topic1 даже не существует: поскольку он не имеет коммитов своего «собственного» , указатель может быть установлен произвольно.)

Редактировать : В этом случае вы можете сделать:

git rebase master topic1
git rebase topic1 topic2

Конечный результат должен совпадать с первым параметром (если topic2 содержит все коммиты topic1!). Этот синтаксис может быть проще для понимания, но решения будут отличаться, если topic1 содержит фиксации, которые не находятся в topic2. Если это так, то первое решение просто отбрасывает любые коммиты в topic1, которые не входят в topic2, тогда как последний объединит их в topic2. Оба результата, вероятно, нежелательны, но, по моему мнению, из первого решения более ясно, что произойдет, именно поэтому я поставил это на первое место.

Для иллюстрации, если ваша история коммитов выглядит так:

a1 - a2 - a3 - a4 - a5 - a6 - a7 master
               \
                b1 - b2 - b3 - b4 - b5 topic2
                          \
                           c1 topic1

Тогда первое решение (rebase, branch) даст вам:

a1 - a2 - a3 - a4 - a5 - a6 - a7 - b1' - b2' - b3' - b4' - b5' topic2
                               \ master         \ topic1

И второй (rebase, rebase):

a1 - a2 - a3 - a4 - a5 - a6 - a7 - b1' - b2' - b3' - c1' - b4' - b5' topic2
                               \ master               \ topic1

Однако в этом случае вы, вероятно, хотели получить:

a1 - a2 - a3 - a4 - a5 - a6 - a7 - b1' - b2' - b3' - b4' - b5' topic2
                               \ master         \
                                                 c1' topic1

Решение для этого результата будет:

git branch tmp id_of_b3_commit   # In this case id_of_b3_commit == topic1^
git rebase master tmp
git rebase tmp topic1
git rebase tmp topic2
git branch -d tmp

(Если вы превратили это в скрипт, вы можете использовать git merge-base topic1 topic2, чтобы найти идентификатор коммита, который нужно поместить в ветку tmp.)

1 голос
/ 29 декабря 2011

Если тема 2 на самом деле является веткой с хотя бы одним из ее собственных коммитов, тогда вы можете сделать прививку. Но более простой способ сделать это - объединить тему 1 и тему 2. Теперь «перебазировать - на» новое место этой объединенной ветви с --preserve-merges. Сбросьте тему 1 и тему 2 туда, где они должны сидеть.

0 голосов
/ 29 декабря 2011

Вы можете перебазировать ветки topic1 и topic2 по одному.

Перебазировать первый

git checkout topic1
git rebase master

Затем перебазируйте второй

git checkout topic2
git rebase master

Но я не уверен, что будет с точкой topic1^.

Я предлагаю сделать это немного более сложным способом, который сохранит историю слияния веток.

Сначала создайте новую ветку со всеми коммитами, общими для обеих тем (вместо этого вы можете использовать коммит или тег)

git checkout -b topics topic1^

Затем перебазируйте его на мастер

git rebase master

Затем перебазируйте обе темы в общей ветке.

git checkout topic1
git rebase topics
git checkout topic2
git rebase topics

Это должно работать. Теперь вы можете отбросить временную ветку.

git branch -d topics
...