Мені довелося повернути злиття в головну гілкуоскільки гілка містила деякі небажані зміни. Однак відділення також містило багато змін, які мені потрібно переглянути. Чи є спосіб застосувати всі зміни, які це злиття додало до шаблону, до моєї поточної гілки та вирішити, які із цих змін я хотів би здійснити, а які залишити?
Заздалегідь спасибі.
Відповіді:
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
і поставити розумним edit
s, щоб виправити їх, або скористайтеся для цього функціями автоматичного сквошу / автоматичного виправлення Git.
Все, що вам потрібно, - це операція "масового копіювання" ... яка, як виявляється, є вже вбудований в git rebase
, як --no-ff
варіант, як описано тут.