Как отменить git merge 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

Марк Longair является окончательным решением моей проблемы. Я только что протестировал его, и он работает. См. ниже процесс, который я использую сейчас, чтобы раздавить все внутренние коммиты в 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

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


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

прервать слияние с современным синтаксисом 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.

после неудачного слияния, когда есть нет!--6-->, неудачное слияние можно отменить с помощью git reset --merge но не обязательно git merge --abort, таким образом, они не только старый и новый синтаксис для одного и того же. Лично я нахожу git reset --merge гораздо полезнее в повседневной работе.