Как отменить сквош git merge? - PullRequest
       33

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

17 голосов
/ 18 сентября 2011

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

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 ]

17 голосов
/ 18 сентября 2011

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

git commit

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

git reset --merge

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

0 голосов
/ 07 февраля 2015

Если вы передумаете перед фиксацией, у вас есть следующие опции:

Прервать слияние с современным синтаксисом git:

git merge --abort

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

git reset --merge

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

git reset --hard

Но на самом деле, стоит отметить, что git merge --abort эквивалентен только git reset --merge, учитывая, что MERGE_HEAD присутствует.Это можно прочитать в справке git для команды слияния.

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 гораздо более полезным в повседневной работе.

...