Как отменить сквош слияния git?

Я только что сделал

git merge --squash feature-branch

в ветки develop.

Проблема в том, что приведенная выше команда обновила голову, не создавая новую фиксацию. Мое намерение состояло в том, чтобы создать одну фиксацию для приложения к главе develop.

Итак, журнал для ветки develop до и после слияния точно такой же.

Есть ли способ вернуть назад develop к тому, что было до git merge?

Спасибо.

Решение

Основываясь на комментарии от Dan D. и принятого ниже ответа, я смог решить мою проблему. Ниже показано, что я сделал, если вы находитесь в одной лодке:

1 - я запустил git reflog и в нем перечислены все фиксации и проверки, которые я сделал с ветвью develop.

2 - Вместо того, чтобы предлагать git reset [email protected]{1}, как было предложено, я нашел номер, когда я сделал последнюю фиксацию для разработки, которую я хотел сохранить. В моем случае это было [email protected]{188}. Поэтому я набрал git reset [email protected]{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"

Вышеуказанная последовательность работает как шарм.

Ответы

Ответ 1

Если вы запустите git merge --squash <other-branch>, то рабочее дерево и индекс обновляются с тем, каков будет результат слияния, но он не создает фиксацию. Все, что вам нужно сделать, это запустить:

git commit

Однако, если вы передумали перед фиксацией и просто хотите прервать слияние, вы можете просто запустить:

git reset --merge

Вам не нужно использовать reflog.

Ответ 2

Если вы передумали перед совершением, у вас есть следующие варианты:

Прервать слияние с помощью современного синтаксиса git:

git merge --abort

И с более старым синтаксисом:

git reset --merge

И действительно старая школа:

git reset --hard

Но на самом деле стоит заметить, что git merge --abort эквивалентен только git reset --merge, если присутствует MERGE_HEAD. Это можно прочитать в справке git для команды 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 гораздо полезнее в повседневной работе.