git resetэто все о переезде HEAD, и вообще ветка исх .
Вопрос: как насчет рабочего дерева и индекса?
При применении с --soft, движется HEAD, чаще обновляя ветви реф, и толькоHEAD .
Это отличается от commit --amendкак:
- это не создает новый коммит.
- на самом деле он может переместить HEAD в любой коммит (как
commit --amendтолько в том случае, если не переместить HEAD, при этом позволяя повторить текущий коммит)
Просто нашел этот пример объединения:
- классическое слияние
- объединение поддеревьев
все в одну (осьминог, так как объединено более двух веток) совершить слияние.
Томас "wereHamster" Карнекки объясняет в своей статье "Слияние поддеревьев осьминога" :
- Стратегия слияния поддеревьев может использоваться, если вы хотите объединить один проект с подкаталогом другого проекта и впоследствии поддерживать подпроект в актуальном состоянии. Это альтернатива подмодулям 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
Здесь автор использовал 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/…