/ / Чи є спосіб застосувати зміни, внесені в результаті злиття в минулому? - git, github, merge, git-merge

Чи є спосіб застосувати зміни, зроблені зі злиття в минулому? - git, github, merge, git-merge

Мені довелося повернути злиття в головну гілкуоскільки гілка містила деякі небажані зміни. Однак відділення також містило багато змін, які мені потрібно переглянути. Чи є спосіб застосувати всі зміни, які це злиття додало до шаблону, до моєї поточної гілки та вирішити, які із цих змін я хотів би здійснити, а які залишити?

Заздалегідь спасибі.

Відповіді:

0 для відповіді № 1

Як завжди, ви можете вибрати злиття,або скасувати скасування злиття. Якщо ви вирішили вибрати злиття, ви повинні вказати батьківський номер так само, як і батьковий номер, щоб повернути злиття.

Якщо ви не хочете, щоб результат був зафіксований, навіть якщо команда cherry-pick або revert успішно працює самостійно, ви можете сказати команді не робити крок фіксації. Або ви можете дозволити фіксацію, а потім скористайтеся git reset --soft HEAD^ або git reset --soft HEAD~1 для переміщення поточної гілки назад на один крок - майже так само, як і для видалення самого коміту - взагалі не змінюючи вміст індексу та дерева роботи.

(Я кажу "майже те саме", оскільки коміт продовжує існувати і за замовчуванням захищений щонайменше 30 днів, оскільки його хеш-ідентифікатор зберігається щонайменше у записі перезапису.)

Альтернативи

Однак це може бути не наймудрішою загальною стратегією.

Припустимо, у вас є щось подібне:

...--o--o-----*---------M--F--W--G--H   <-- mainline
             /
A--B--C--D--E   <-- feature

де M - погане злиття, і A--B--C--D--E це оригінальний ланцюжок комітів, який використовується для спроби створити якусь особливість. Здійснити W - повернення злиття M (w - це свого роду перевернуте m), і, можливо, були й різні інші коміти, наприклад F через H.

Що робити M є / робить - крім того, що, звичайно, є об’єднанням - це те, що він вносить зміни до свого перший батько (*, вгорі) на основі відмінності від батьківської бази злиття A до останнього feature вчинити E. Тож він вносить великий набір змін, і ви тепер виявили, що великий набір змін є помилковим. Здійсніть W вводить ще один великий набір змін: ті, що точно скасовують M.

Якщо зараз повернути W, або вишневий M, ви отримуєте ще один великий набір змін. Якщо ви зробите це, не здійснюючи все-таки (або повернути назад), ви можете вибірково застосувати або скасувати ці зміни, вередуючи з робочим деревом (можливо, використовуючи для цього ваш індекс, або просто повністю вручну), а потім git addвиправлення великого набору змін та здійснення. Але це дає вам ще одну велику групу змін у новому коміті I:

...--o--o-----*---------M--F--W--G--H--I   <-- mainline
             /
A--B--C--D--E   <-- feature

The останній коли ви додали велику групу змін, це булобаггі. Можливо, було б гарною ідеєю вносити зміни поетапно, по черзі, таким чином, щоб кожна з них могла індивідуально перевірятися, а не як A-B-C-D-E послідовності.

Насправді, саме ця послідовність, мабуть, є гарним місцем для початку. Припустимо, ви мали скопіювати кожен коміт у A-B-C-D-E послідовність до a новий (але виправлено) коміт: A", після чого B", після чого C", і так далі. Якщо A саме по собі правильно - якщо всі проблеми, скажімо, B і пізніше — все одно скопіюйте:

                                      A"  <-- feature.1
/
...--o--o-----*---------M--F--W--G--H   <-- mainline
             /
A--B--C--D--E   <-- feature

Повторіть для B через E:

                                      A"-B"-C"-D"-E"  <-- feature.1
/
...--o--o-----*---------M--F--W--G--H   <-- mainline
             /
A--B--C--D--E   <-- feature

і тепер у вас є правильна (і перевірена) переглянута гілка об’єктів, яку ви можете об’єднати як завжди:

                                      A"-B"-C"-D"-E"  <-- feature.1
/             
...--o--o-----*---------M--F--W--G--H---------------M"   <-- mainline
             /
A--B--C--D--E

На даний момент нічого особливого не потрібно, а feature.1 гілка може повністю ділитися, щоб знайти будь-яку новий помилки в нещодавно доданій функції, яка пов’язана лише за назвою та наміром (але не з хешами комітів) із початково доданою функцією помилок.

Насправді, тепер, коли ви про це знаєте, ви, мабуть, вже вже використовується git bisect до знайти який з A-B-C-D-E представив помилки, тож якби ви могли просто масово копіювати A через E виробляти A" через E" (і ще не об’єднати), тоді ви можете запустити git rebase -i і поставити розумним edits, щоб виправити їх, або скористайтеся для цього функціями автоматичного сквошу / автоматичного виправлення Git.

Все, що вам потрібно, - це операція "масового копіювання" ... яка, як виявляється, є вже вбудований в git rebase, як --no-ff варіант, як описано тут.