Как отменить слияние git squash?
Я только что сделал
git merge --squash feature-branch
В мою ветвь develop.
Проблема заключается в том, что вышеприведенная команда обновила заголовок без создания нового коммита. Мое намерение состояло в том, чтобы создать один единственный коммит, чтобы обратиться к главе develop.
developдо и после слияния абсолютно одинаковы.
Есть ли способ вернуться назад develop к тому, что было до git merge?
Спасибо ты.
решение
Основываясь на комментарии Дэна Д. и принятом ниже ответе, я смог решить свою проблему. Смотрите ниже, что я сделал, если вы находитесь в той же лодке:1-я запустил git reflog, и в нем перечислены все коммиты и проверки, которые я сделал с моей веткой develop.
2-вместо того, чтобы сделать git reset HEAD@{1}, как предлагалось, я нашел номер, когда я сделал последний коммит для разработки, который я хотел сохранить. В моем случае это было HEAD@{188}. Поэтому я напечатал: git reset HEAD@{188}.
3-я запустил git log, и у него был чистый журнал, показывающий только коммиты, которые я имел, прежде чем я сделал неправильное слияние.
4-я запустил git add -A ., Чтобы запустить все новые файлы, созданные во время разработки моей функции.
5-я пробежала git commit -m "install feature-x"
6-в результате теперь у меня есть ветка develop с правильными файлами, и журнал чист-показывая только один коммит для всех изменений, которые я сделал во время разработки feature-x.
Мне все еще нужно выяснить, почему мой оригинал git merge --squash feature-branch сделал это. не сработает так, как задумано.
решение 2
Ответ Марка Лонгера-это окончательное решение моей проблемы. Я только что проверил его, и он работает. Смотрите ниже процесс, который я использую сейчас, чтобы раздавить все внутренние коммиты вfeature-branch и включить только один коммит в ветвь develop:
git checkout develop
git merge --squash feature-branch
git commit -m "install of feature-branch"
Вышеприведенная последовательность работает как заклинание.2 ответа:
При запуске
git merge --squash <other-branch>рабочее дерево и индекс обновляются с тем, каким будет результат слияния, но он не создает фиксацию. Все, что вам нужно сделать, это запустить:git commitОднако, если вы передумали перед фиксацией и просто хотите прервать слияние, вы можете просто запустить:
git reset --mergeВам не нужно использовать рефлог.
Если вы передумаете перед совершением, у вас есть следующие варианты:
Прервать слияние с современным синтаксисом git:
git merge --abortИ с более старым синтаксисом:
git reset --mergeИ действительно старая школа:
Но на самом деле, стоит заметить, чтоgit reset --hardgit merge --abortэквивалентно толькоgit reset --merge, учитывая, чтоMERGE_HEADприсутствует. Это можно прочитать в команде git help for merge.git merge --abort is equivalent to git reset --merge when MERGE_HEAD is present.После неудачного слияния, когда нет
MERGE_HEAD, неудачное слияние можно отменить с помощьюgit reset --mergeно не обязательно сgit merge --abort, таким образом, они не только старый и новый синтаксис для одного и того же предмета. Лично я нахожуgit reset --mergeгораздо более полезным в повседневной работе.