Как отменить слияние 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 14

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