Как проверить слияние без фактического слияния


166

Есть ли способ симуляции git mergeмежду двумя ветвями, текущей рабочей ветвью и мастером, но без внесения каких-либо изменений?

У меня часто возникают конфликты, когда я должен сделать git merge. Есть ли способ имитации слияния в первую очередь?



Ответы:


132

Я не думаю, что есть способ имитировать то, что произойдет, пока вы не попробуете слияние. Однако, если вы убедитесь, что выходные данные git statusпустые перед выполнением слияния, вполне безопасно просто пойти дальше и попробовать. Если у вас возникли конфликты, вы можете немедленно вернуться в состояние, в котором вы были раньше:

git reset --merge

Начиная с git 1.7.4, вы также можете прервать слияние, выполнив:

git merge --abort

(Как объясняется в сообщении о фиксации, добавляющем эту опцию , это было добавлено для согласованности git rebase --abortи т. Д.)


4
@ Амбер отвечает точно так, как спрашивают «как имитировать слияние». использовать --no-commitнамного проще, на мой взгляд
Самирахмед

14
@samirahmed: @Amber ответил на вопрос более буквально, конечно, хотя --no-commitвы все еще меняете индекс и рабочее дерево, что не совсем «без внесения изменений» :) Я хочу сказать, что когда люди спрашивают такого рода вопрос, как правило, потому что они не знают, что лучший способ увидеть, как будет происходить слияние, - это просто попробовать слияние , часто потому, что они не знают, как легко вернуться к тому состоянию, в котором они были до если возникли проблемы.
Марк Лонгэйр

2
Я не знаю, было ли это добавлено в более поздней версии git, но в документации (1.8.4) говорится, что « git merge --abortэквивалентно тому, git reset --mergeкогда MERGE_HEADприсутствует», так что все, что легче запомнить :)
Самуэль Мичам,

@SamuelMeacham: спасибо за указание на это - это было введено в 1.7.4. Я обновил ответ с этим. Спасибо!
Марк Лонгэйр

Это предложение ничего не сделало для меня, на git 1.9.4.
Джангофан

137

Вы можете использовать, git merge --no-commitчтобы предотвратить фактическое слияние, и если вам не нравится, как слияние происходит, просто верните исходную головку.

Если вы определенно не хотите завершать слияние, даже если это быстрая перемотка вперед (и, следовательно, по определению не имеет конфликтов), вы также можете добавить --no-ff.


Я не думаю, что git merge --abortсуществует - возможно, вы имеете в виду git reset --merge?
Марк Лонгэйр

Нет, я просто забыл, что в отличие от rebaseне существует --abortдля git merge.
Янтарь,

7
Я бы --no-ffтоже бросил . Чтобы предотвратить слияние FF.
Энди

1
@ Andy's --no-ffздесь в значительной степени обязателен, так как --no-commitне останавливает быстрые изменения.
Джек

1
@ Anant Anand Gupta - это хороший трюк, но он должен быть: git config --global alias.tm "merge --no-commit --no-ff"
pasx

109

Если я хочу сравнить изменения в ветке темы с master, я считаю, что проще и безопаснее сделать следующее:

git checkout master
git checkout -b trial_merge
git merge topic_branch

После завершения слияния легко увидеть консолидированное изменение из основного

git diff master

Когда закончите, просто удалите ветку trial_merge

git checkout master
git branch -D trial_merge

Таким образом, основная ветвь никогда не меняется.


4
Вы также можете сделать git checkout --detachи проверить все, что вы хотите. Позже, если вы хотите сохранить свои изменения, сделайте git checkout -b new_branch. И если вы хотите выбросить свои изменения, отметьте любую нужную вам ветку ( git checkout master).
Шаян Токрей

Если topic_branchон огромен (как, вероятно, в случае, если вы, во-первых, diff masterзанимаетесь этим вопросом), результат, вероятно, слишком велик, чтобы вы могли его заметить, если слияние вызовет конфликты.
Fresh Crescent

Мне определенно нравится это много ... безопасно и просто.
Лев

4

Я использую :

git merge --ff-only

согласно документации :

Отказаться от слияния и выхода с ненулевым статусом, если текущий HEAD уже не обновлен или слияние не может быть разрешено как ускоренная перемотка вперед.

На самом деле это не симуляция, потому что произойдет ускоренное слияние в случае отсутствия конфликтов между двумя ветвями. Но в случае конфликтов вы будете проинформированы и ничего не произойдет.


4

Я был в состоянии использовать git merge --abort, недавно. Однако это может быть использовано только в случае конфликта слияния. Если вы уверены, что не захотите совершать коммит, используйте другие упомянутые выше методы.


1
Какие другие методы упомянуты выше? Они все упоминают git merge --abort. Вы должны в будущем подтвердить свой ответ, указав, кто написал ответ, на который вы ссылаетесь.
Майкл Фултон

3

Почему бы просто не создать одноразовую ветку (git checkout -b) и выполнить тестовое слияние там?


1
То, что вы предлагаете, на самом деле является
кратким

0

Я не знаю точно, относится ли это к вашему случаю , но ваш вопрос помните, что иногда я запускаю функцию, я фиксирую ее в течение нескольких дней и объединяю разработку с ней много раз.

На этом этапе я теряю контроль над точными файлами, которые я изменил, и я узнаю об этом только тогда, когда моя функция будет закрыта и мой код будет разрабатываться.

В этом случае, хороший способ узнать, какие изменения вы сделали (а не какие-либо из слияний), использует Sourcetree.

Вы должны щелкнуть правой кнопкой мыши на базовой ветви и выбрать Diff Against Current:

Возможность Sourcetree узнать разницу между двумя ветками

Затем sourcetree покажет вам все модификации, которые будут объединены, если вы объедините свою ветку с базовой веткой.

Полученные результаты

Конечно, это не покажет вам конфликты, но это полезный инструмент в слияниях.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.