Git: применить ветку темы, используя rebase (без слияния) - PullRequest
2 голосов
/ 01 марта 2011

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

git merge contributor/topic-branch

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

Наивный запуск git rebase contributor/topic-branch, очевидно, не будет работать, потому что он применяет мой мастер к ветви темы, как если бы ветка темы была моей основной веткой разработки. Итак, я попробовал это:

git rebase master contributor/topic-branch

И это делает то, что я хочу, за исключением того, что теперь у меня есть отдельный HEAD, и мне нужно исправить ветку master, чтобы она указала на HEAD (используя branch -f). Конечно, я мог бы написать функцию Bash, чтобы сделать это автоматически, но есть ли «правильный» способ получить ветку темы без использования merge?

Ответы [ 3 ]

12 голосов
/ 01 марта 2011

Как насчет:

git checkout topic-branch
git rebase master
git checkout master
git merge topic-branch

Это решает проблему для локальной ветки.Решение для отслеживания ветви оставлено в качестве упражнения.

РЕДАКТИРОВАТЬ: я полагаю, я должен объяснить, что здесь происходит.Сначала вы переходите на ветку темы;затем вы перебазируете ветку темы так, чтобы она основывалась на master.(Затем, конечно, вы проверяете, что все по-прежнему работает. У вас do есть автоматические тесты, верно?) Теперь, когда ветвь темы опережает основную, вы можете перейти обратно в главную и объединить тему в главную;фиксация слияния не требуется, поскольку это ускоренная перемотка вперед.

2 голосов
/ 02 марта 2011

Я также только что понял, что cherry-pick поддерживает диапазоны фиксации, поэтому вы можете сделать

git cherry-pick HEAD..contributor/topic-branch

(Это последовательно применяет все коммиты в topic-branch, которые недоступны из HEAD.)

На странице руководства я чувствую, что это не удастся, если в ветке темы есть коммиты слияния, поэтому это работает только для простых случаев с линейной историей.

Кроме того, если вы сделаете это с локальной веткой тем, branch -d не обнаружит, что topic-branch было объединено, поэтому вам придется использовать -D. (Метод Филиппа rebase + merge для сравнения не имеет этой проблемы.)

0 голосов
/ 01 марта 2011

Если вы хотите портировать диапазон коммитов от commit-start-id до topic-branch-head, тогда выполните

git checkout contributor/topic-branch
git rebase --onto master <commit-start-id>
...