git resetвсе стосується переїзду HEAD, і взагалі гілки ref .
Питання: а що з робочим деревом та індексом?
При роботі з --soft, рухається HEAD, найчастіше оновлюючи відгалуження галузі, і тількиHEAD .
Це відрізняється від commit --amend:
- це не створює нового комітету.
- він може фактично перемістити HEAD до будь-якого комітету (як
commit --amendце стосується лише не переміщення HEAD, дозволяючи повторити поточну комісію)
Щойно знайшов такий приклад поєднання:
- класичне злиття
- злиття піддерева
всі в одну (восьминога), оскільки з’єднано більше двох гілок) здійснюють злиття.
Томаш "wasHamster" Карнекі пояснює у своїй статті "Злиття підводного восьминога" :
- Стратегія злиття піддіречка може бути використана, якщо ви хочете об'єднати один проект у підкаталог іншого проекту, а згодом постійно оновлювати підпроект. Це альтернатива подмодулям git.
- Стратегію злиття восьминога можна використовувати для об'єднання трьох і більше гілок. Звичайна стратегія може об'єднати лише дві гілки, і якщо ви спробуєте об'єднати більше, git автоматично повертається до стратегії восьминога.
Проблема полягає в тому, що ви можете вибрати лише одну стратегію. Але я хотів об'єднати ці два, щоб отримати чисту історію, в якій весь сховище атомно оновлено до нової версії.
У мене є суперпроект, назвемо його projectA, і підпроект projectB, який я об'єднав у підкаталог projectA.
(це частина злиття піддерева)
Я також підтримую кілька місцевих комітетів.
ProjectAрегулярно оновлюється, projectBмає нову версію кожні пару днів або тижнів і зазвичай залежить від конкретної версії projectA.
Коли я вирішую оновити обидва проекти, я не просто переходжу від цього, projectAі projectB це створить два коміти для того, що має бути атомним оновленням всього проекту .
Замість цього я створюю один злиття зробити який поєднує в собі projectA, projectBі мої коммітов .
Тут складна частина полягає в тому, що це злиття восьминога (три голови), але projectBйого потрібно об'єднати зі стратегією підкреслень . Отже, це я роблю:
# Merge projectA with the default strategy:
git merge projectA/master
# Merge projectB with the subtree strategy:
git merge -s subtree projectB/master
Тут автор використав a reset --hard, а потім read-treeдля відновлення того, що перші два злиття було зроблено з робочим деревом та індексом, але саме тут reset --softможе допомогти:
Як переробити ці два злиття , які спрацювали, тобто моє робоче дерево та індекс добре, але без того, щоб записувати ці два коміти?
# Move the HEAD, and just the HEAD, two commits back!
git reset --soft HEAD@{2}
Тепер ми можемо відновити рішення Томаса:
# Pretend that we just did an octopus merge with three heads:
echo $(git rev-parse projectA/master) > .git/MERGE_HEAD
echo $(git rev-parse projectB/master) >> .git/MERGE_HEAD
# And finally do the commit:
git commit
Отже, кожен раз:
- вас влаштовує те, що ви закінчуєте (що стосується робочого дерева та індексу)
- вас не влаштовують усі зобов’язання, які взяли вас до туди:
git reset --soft це відповідь.
git reset --soft: stackoverflow.com/questions/6869705 / ...