Перебазировать ветку объектов на другую ветку


305

У меня есть две (частные) ветки, над которыми я работаю.

a -- b -- c                  <-- Master
     \     \
      \     d -- e           <-- Branch1
       \
        f -- g               <-- Branch2

Немного поработав над этими ветками, я обнаружил, что мне нужны изменения из Branch2 в Branch1. Я хотел бы перенести изменения в Branch2 на Branch1. Я хотел бы закончить со следующим:

a -- b -- c                  <-- Master
           \
            d -- e -- f -- g <-- Branch1

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

Эта команда даст желаемый результат?

(Branch1)$ git rebase --onto Branch1 Branch2

11
Чтобы ответить на ваш вопрос, я бы создал тестовый репозиторий, создал структуру коммита, которую вы показали, и попробовал команду, которую вы показали. Но я думаю, что вы можете сделать это самостоятельно, поэтому я не собираюсь делать это :)
Даниэль Хилгарт

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

4
Я так и думал, вот почему я разместил этот комментарий :) Каждый раз, когда я делаю что-то, я не уверен, что это будет делать то, что я думаю, я создаю тестовое хранилище и выполняю там свои тесты. Или я создаю копию своего реального репозитория и выполняю тесты на копии.
Даниэль Хилгарт

Примечание: Git 2.0 представит ярлык для этого вида перебазироваться: git rebase -. см. мой ответ ниже
VonC

5
Небольшое примечание: ответы здесь дают branch2 как результат. ОП хотел ветку1. Или я что-то пропустил?
Josef.B

Ответы:


353
  1. Переключиться на Branch2

    git checkout Branch2
    
  2. Примените текущие изменения (Branch2) поверх изменений Branch1, оставаясь в Branch2:

    git rebase Branch1
    

Что оставило бы вас с желаемым результатом в Branch2:

a -- b -- c                      <-- Master
           \
            d -- e               <-- Branch1
           \
            d -- e -- f' -- g'   <-- Branch2

Вы можете удалить Branch1.


Спасибо! При удалении ветки после ребазинга я получаю сообщение, что ветка не полностью слита. Я предполагаю, что могу смело игнорировать это сообщение и принудительно удалить?
Арьен

10
он не хотел, чтобы все изменения в Branch1?
tomasz_kusmierczyk

6
Это похоже на то, что он хотел, нет?
1252748

1
Действительно, @tomasz_kusmierczyk и @ 1252748, и я тоже запуталась. Но затем я понял, что выполнение git rebaseво время пребывания в Branch1 перезапишет историю Branch1, чтобы изменения Branch1 превысили изменения, скопированные из Branch2. Это приведет к следующему порядку фиксации a - b - f - g - c' - d' - e'.
угорь ghEEz

1
@tomasz_kusmierczyk и 1252748, это не противоположность того, что он хочет, это именно то, что он хотел. Названия ветвей не имеют значения, вы всегда можете их поменять.
a3y3

56

Примечание: если вы были Branch1включены, вы с Git 2.0 (Q2 2014) сможете набрать:

git checkout Branch2
git rebase -

См совершить 4f40740 по Brian Gesiakmodocache :

rebase: разрешить -сокращение " " для предыдущей ветви

Научите перебазировать ту же стенографию, что checkoutи mergeдля имени ветви rebaseтекущей ветви; то есть « -» означает «ветку, на которой мы были ранее».


26
приятно, но тоже немного опасно. иногда многословие побеждает. но опять же, я тоже люблю Java ... (-:
sthzg

3

Я знаю, что вы попросили Ребаз, но я бы выбрал коммиты Cherry-Pick, которые я хотел переместить из Branch2 в Branch1. Таким образом, мне не нужно было бы заботиться о том, какая ветка была создана из master, и у меня был бы больший контроль над слиянием.

a -- b -- c                  <-- Master
     \     \
      \     d -- e -- f -- g <-- Branch1 (Cherry-Pick f & g)
       \
        f -- g               <-- Branch2
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.