Команда, яку ви шукаєте, - це git rebase
конкретно -i/--interactive
варіант.
Я припускаю, що ви хочете залишити команду c на гілці A, і що ви дійсно означаєте, що хочете перемістити інші коміти в інші гілки, а не зливатися, оскільки злиття є прямими. Почнемо з маніпулювання гілкою А.
git rebase -i <SHA1 of commit a>^ branchA
В ^
означає попередній Комміт, тому ця команда говорить перебазуватися гілка А з допомогою фіксації , перш ніж «а» в якості основи. Git представить вам список зобов'язань у цьому діапазоні. Перередагуйте їх і скажіть git, щоб розім'яти відповідні:
pick c ...
pick a ...
squash d ...
squash e ...
squash g ...
pick b
squash f
Тепер історія повинна виглядати так:
c - [a+d+e+g] - [b+f] (branchA)
/
--o-x-x-x-x-x-x-x-x-x-x (master)
Тепер давайте захопимо нещодавно скошений комірок b + f для гілкиB.
git checkout branchB
git cherry-pick branchA # cherry-pick one commit, the tip of branchA
І те саме для + d + e + g для master:
git checkout master
git cherry-pick branchA^
Нарешті, оновіть відділенняA, щоб воно вказувало на c:
git branch -f branchA branchA^^
Тепер ми повинні мати:
c (branch A) - [a+d+e+g] - [b+f] (dangling commits)
/
--o-x-x-x-x-x-x-x-x-x-x-[a+d+e+g] (master)
\
x-x-x-x-x-[b+f] (branchB)
Зауважте, що якщо у вас було декілька комітетів, які ви хотіли переміщати між гілками, ви можете знову використовувати ребайт (неінтерактивно):
# create a temporary branch
git branch fromAtoB branchA
# move branchA back two commits
git branch -f branchA branchA~2
# rebase those two commits onto branchB
git rebase --onto branchB branchA fromAtoB
# merge (fast-forward) these into branchB
git checkout branchB
git merge fromAtoB
# clean up
git branch -d fromAtoB
Нарешті, відмова від відповідальності: Цілком можливо змінити порядок здійснення зобов’язань таким чином, що деякі більше не застосовують чисто. Це може бути тому, що ви вибрали поганий порядок (накладення виправлення перед фіксацією, введення функції, яку він виправляв); у такому випадку вам потрібно скасувати ребазу ( git rebase --abort
). Інакше вам доведеться розумно виправляти конфлікти (так само, як це стосується конфліктів злиття), додавати виправлення, а потім бігти, git rebase --continue
щоб рухатися далі. Ці інструкції також надаються повідомленням про помилку, надрукованим під час конфлікту.