Перебазировать ветку назад в главную ветку? - PullRequest
2 голосов
/ 02 апреля 2019

У меня есть ветвь функций B, которая состоит из ветви функций A. Я хочу перебазировать ветвь B обратно на мастер без коммитов ветви A.

Мой репозиторий выглядит так:

c1---c2---c3  master
            \
             c4---c5---c6  A
                        \
                        c7---c8---c9  B

Я хочу вот что:

             c7---c8---c9 B
            /
c1---c2---c3  master
            \
             c4---c5---c6  A

Я попытался сделать ребаз из ветви B на мастер.Это ничего не делало и держало ветку B на ветке A.

Ответы [ 3 ]

5 голосов
/ 02 апреля 2019

Можно проследить от B до master, поэтому, что касается Git, ветвь B уже "включена" master.Другими словами, B "содержит" master.

Попытайтесь четко указать ветвь, которая должна быть перебазирована, и восходящий поток:

git rebase --onto master A B
4 голосов
/ 02 апреля 2019

3-строчное черри-решение, менее лаконичное, чем отличный ответ Криса, но, возможно, более ясное для некоторых, может выглядеть так:

git branch backup-B B
git checkout -B B master
git cherry-pick A..backup-B

Объяснение шагов:

1) сделать резервную копию (также служит ссылкой для последующего выбора вишни)

git branch backup-B B

c1---c2---c3  <<< master
            \
             c4---c5---c6  <<< A
                        \
                        c7---c8---c9  <<< backup-B, B <<< HEAD

2)точка B в мастере (и проверить его одновременно)

git checkout -B B master

c1---c2---c3  <<< master, B <<< HEAD
            \
             c4---c5---c6  <<< A
                        \
                        c7---c8---c9  <<< backup-B

3) "скопировать" недостающие коммиты (НЕ доступно изA, но достижимый из "старого" B, ​​здесь c7, c8, c9)

git cherry-pick A..backup-B

             c7'---c8'---c9'  <<< B <<< HEAD
            /
c1---c2---c3  <<< master
            \
             c4---c5---c6  <<< A
                        \
                        c7---c8---c9  <<< backup-B

(конечно, на данный момент, хотя и не обязательно, вы можете просто сбросить резервную копию с помощью git branch -D backup-B, чтобы получить точный результат, о котором вы просили. Однако такой спасательный жилет - легкая ноша для гититана; -)

2 голосов
/ 02 апреля 2019

Наряду с предлагаемым решением, вот третье.

Вы можете запустить интерактивный ребаз.Когда проверено на B, запустите git rebase --interactive master.Ваш $EDITOR будет открыт со следующим:

pick c4 Message of c4
pick c5 Message of c5
pick c6 Message of c6
pick c7 Message of c7
pick c8 Message of c8
pick c9 Message of c9

Здесь вам просто нужно удалить коммиты, принадлежащие A, поэтому вам нужно сделать файл похожим на:

pick c7 Message of c7
pick c8 Message of c8
pick c9 Message of c9

Затем сохраните и выйдите, и вуаля .

...