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