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