Термін, який я думаю, що ви шукаєте, - це «вишневий вибір». Тобто візьміть одну комітку з середини однієї гілки та додайте її до іншої:
A-----B------C
\
\
D
стає
A-----B------C
\
\
D-----C'
Це, звичайно, можна зробити за допомогою команди git cherry-pick.
Проблема цього комітету полягає в тому, що git вважає, що комісії включають всю історію до них - таким чином, якщо у вас є три коміти, як:
A-----B-----C
І намагайтеся позбутися B, ви повинні створити абсолютно нове зобов’язання на зразок:
A-----------C'
Де C 'має інший ідентифікатор SHA-1. Крім того, вишневий вибір комісії з однієї гілки на іншу в основному передбачає генерування патча, а потім його нанесення, тим самим втрачаючи історію і таким чином.
Ця зміна ідентифікаторів комітів порушує функцію злиття git серед інших речей (хоча, якщо використовувати їх економно, є евристика, яка буде обробляти цю інформацію). Що ще важливіше, вона ігнорує функціональні залежності - якщо C фактично використовував функцію, визначену в B, ви ніколи не дізнаєтесь.
Можливо, кращим способом впоратися з цим було б мати більш дрібнозернисті гілки. Тобто, замість того, щоб просто мати "master", мати "featureA", "bugfixB" тощо. Виконайте огляд коду на всій гілці одночасно - де кожна гілка дуже зосереджена на тому, щоб робити лише одне - і потім об'єднайте це одна гілка, коли ви закінчите. Це робочий процес, для якого створений git, і для чого це добре :)
Якщо ви наполягаєте на тому, щоб розібратися з речами на рівні патчів, можливо, ви захочете поглянути на дарків - він вважає сховище набором патчів, і, таким чином, вибір черешні стає основною операцією. Однак у цього є свій ряд проблем, таких як дуже повільний :)
Редагувати: Також я не впевнений, що я розумію ваше друге питання щодо двох сценаріїв. Можливо, ви могли б описати це більш докладно, можливо, як окреме запитання, щоб не заплутатися?