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