Как отменить слияние 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 --hard
git 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
гораздо более полезным в повседневной работе.