Побазуйте гілку функції на іншу гілку функції


304

У мене є дві (приватні) функції, над якими я працюю.

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
Дякую. Я настільки схилився до отримання цього права вперше, що мені не прийшло в голову, що я міг легко перевірити це сам :-)
Арджен

4
Я так подумав, тому я опублікував цей коментар :) Кожен раз, коли я щось роблю, я не впевнений, що він буде робити те, що, на мою думку, робить, я створюю тестовий сховище і виконую свої тести там. Або я створюю копію свого реального сховища та виконую тести на копії.
Даніель Гільгарт

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

5
Незначна примітка: відповіді тут дають галузь2 як результат. ОП хотіла відділення1. Або я щось пропустив?
Josef.B

Відповіді:


353
  1. Перехід на відділення2

    git checkout Branch2
    
  2. Застосуйте поточні зміни (Branch2) поверх змін Branch1, залишившись у Branch2:

    git rebase Branch1
    

Що дозволить вам отримати бажаний результат у Branch2:

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

Ви можете видалити відділення1.


Дякую! Під час видалення гілки після повторного використання я отримую повідомлення про те, що гілка не є повністю об'єднаною. Я припускаю, що можу сміливо ігнорувати це повідомлення та змусити видалити?
Аржен

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

Я знаю, що ви попросили Rebase, але я б Cherry-Pick взяв на себе зобов’язання, які хотів перейти з Branch2 на Branch1. Таким чином, мені не потрібно було б піклуватися про те, яка галузь створена від головного, і я мав би більше контролю над об'єднанням.

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.