У меня есть ветка git (например, mainline), и я хочу объединиться в другую ветку разработки. Или я?
Чтобы решить, действительно ли я хочу объединить эту ветку, я хотел бы увидеть какой-то предварительный просмотр того, что сделает слияние. Желательно с возможностью видеть список коммитов, которые применяются.
Пока что лучшее, что я могу придумать - это merge --no-ff --no-commit
и тогда diff HEAD
.
git merge
иgit reset --keep HEAD@{1}
если мне не понравится результат.git reset --keep HEAD@{1}
вернуласьfatal: Cannot do a keep reset in the middle of a merge.
справка?--preview
опции в git-merge?Ответы:
Я обнаружил, что лучшим решением для меня является просто выполнить слияние и прервать его, если возникнут конфликты . Этот конкретный синтаксис кажется мне чистым и простым. Это стратегия 2 ниже.
Однако, если вы хотите убедиться, что вы не испортили свою текущую ветку или просто не готовы к слиянию, независимо от наличия конфликтов, просто создайте из нее новую ветвь и объедините ее:
Стратегия 1: Безопасный путь - объединить временную ветку:
Таким образом, вы можете просто выбросить временную ветвь, если вы просто хотите увидеть, что это за конфликты. Вам не нужно беспокоиться об «отмене» слияния, и вы можете вернуться к своей работе - просто зарегестрируйте mybranch снова, и у вас не будет никакого кода слияния или конфликтов слияния в вашей ветке.
Это в основном всухую.
Стратегия 2: когда вы определенно хотите объединиться, но только если нет конфликтов
Если git сообщает о конфликтах (и ТОЛЬКО ЕСЛИ ЕСТЬ конфликты), вы можете сделать:
Если слияние прошло успешно, вы не можете прервать его (только сбросить).
Если вы не готовы к слиянию, используйте безопасный способ выше.
[EDIT: 2016-ноябрь - я поменял стратегию 1 на 2, потому что, похоже, большинство людей ищут «безопасный путь». Стратегия 2 теперь больше напоминает, что вы можете просто прервать слияние, если слияние имеет конфликты, с которыми вы не готовы иметь дело. Имейте в виду, если читаете комментарии!]
источник
git merge --no-ff --no-commit
если не хотите фиксировать изменения напрямую. Это устраняет «необходимость» в другой ветке и упрощает просмотр изменений, imo.git merge --no-ff --no-commit
? Я думаю, что вы все еще можете сделатьgit merge --abort
после этого, если вам не нравится то, что вы видите? Даже если слияние не вызывает конфликтов?git reset --hard HEAD
а затем извлечь другую веткуgit checkout <different branch name>
и удалить временную веткуgit delete -b <name of temporary branch>
.git log ..otherbranch
git diff ...otherbranch
gitk ...otherbranch
Пустая строка подразумевает
HEAD
, поэтому просто..otherbranch
вместоHEAD..otherbranch
.Две точки против трех имеют немного другое значение для diff, чем для команд, которые перечисляют ревизии (log, gitk и т. Д.). Для журнала и других две точки (
a..b
) означают все, что есть,b
но неa
три, а три точки (a...b
) означают все, что есть только в одномa
илиb
. Но diff работает с двумя ревизиями, и там более простой случай, представленный двумя точками (a..b
), представляет собой простое отличие отa
to,b
а три точки (a...b
) означают разницу между общим предком иb
(git diff $(git merge-base a b)..b
).источник
git checkout master
до того, как попробовал это. Мне было интересно, почему он говорил, что все мои изменения будут переписаны ...git show ..otherbranch
покажет список изменений и diff, которые будут объединены в текущую ветку.Если вы похожи на меня, вы ищете эквивалент
svn update -n
. Следующее, кажется, делает трюк. Обратите внимание, чтоgit fetch
сначала нужно сделать так, чтобы в вашем локальном репо были соответствующие обновления для сравнения.или если вы хотите получить разность от вашей головы к пульту:
IMO это решение намного проще и менее подвержено ошибкам (и, следовательно, намного менее рискованно), чем топовое решение, которое предлагает «объединить, а затем прервать».
источник
$ git checkout target-branch
и тогда$ git diff --name-status ...branch-to-be-merged
(три точки необходимы, поэтому введите их как есть)Большинство ответов здесь либо требуют чистого рабочего каталога и нескольких интерактивных шагов (плохо для сценариев), либо не работают для всех случаев, например, прошлые слияния, которые уже вносят некоторые из ожидающих изменений в целевую ветку, или cherry-picks, выполняющие одни и те же.
Чтобы по-настоящему увидеть, что изменится в
master
ветке, если вы объединитесьdevelop
с ней прямо сейчас:- https://git.seveas.net/previewing-a-merge-result.html
(спасибо Дэвиду Нормингтону за ссылку)
PS:
Если вы получите конфликты слияния, они будут отображаться с обычными маркерами конфликта в выходных данных, например:
Пользователь @dreftymac делает хорошее замечание: это делает его непригодным для сценариев, потому что вы не можете легко это уловить из кода состояния. Маркеры конфликта могут сильно различаться в зависимости от обстоятельств (удаленные или измененные и т. Д.), Что также затрудняет поиск. Осторожно.
источник
true
если есть конфликты иfalse
если нет конфликтов (например, логическое значение, которое не требует теста «глазного яблока» или какого-либо вмешательства человека).git merge-tree ... | grep -q '^[a-z].*in both$' && echo conflict || echo safe to merge
но это привередливый; Я, наверное, забыл случай. может быть, вы хотите проверить маркеры конфликта? например, это, вероятно, не ловит конфликты стилей "их удалили, наши изменили". (Я только что проверил, и это даже не показывает маркеры конфликта, поэтому вам нужно тщательное регулярное выражение, чтобы быть в безопасности здесь)less -R
для обработки цветного вывода без изменения вашей конфигурации.Если вы уже получили изменения, мой любимый:
Это нужно мерзавец 1.7.x Я верю, хотя.
@{u}
Обозначения являются «сокращенным» для восходящего потока ветви , так что это немного более универсально , чемgit log ...origin/master
.Примечание. Если вы используете zsh и функцию glog, вам, вероятно, придется сделать что-то вроде:
источник
В дополнение к существующим ответам можно создать псевдоним, чтобы показать различия и / или журнал до слияния. Во многих ответах пропускается, что
fetch
нужно сделать перед «предварительным просмотром» слияния; это псевдоним , который сочетает в себе эти два шага в один (эмуляция нечто похожее на ртутных хhg incoming
/outgoing
)Итак, опираясь на "
git log ..otherbranch
", вы можете добавить следующее к~/.gitconfig
:Для симметрии можно использовать следующий псевдоним, чтобы показать, что зафиксировано и будет передано до нажатия:
И затем вы можете запустить «
git incoming
», чтобы показать множество изменений, или «git incoming -p
», чтобы показать патч (т. Е. «Diff»), «git incoming --pretty=oneline
», для краткого изложения и т. Д. Затем вы можете (необязательно) запустить «git pull
» для на самом деле слить. (Хотя, так как вы уже получили, слияние может быть сделано напрямую.)Точно так же "
git outgoing
" показывает, что будет толкаться, если вы будете бежать "git push
".источник
git log currentbranch..otherbranch
выдаст вам список коммитов, которые войдут в текущую ветку, если вы сделаете слияние. Обычные аргументы в журнале, которые дают подробности о коммитах, дадут вам больше информации.git diff currentbranch otherbranch
даст вам разницу между двумя коммитами, которые станут одним. Это будет diff, который даст вам все, что будет объединено.Это поможет?
источник
git log otherbranch..currentbranch
дает список коммитов на текущей ветке . Этоgit diff otherbranch currentbranch
дает вам различие от версии, которая будет объединена, до текущей подсказки, которая настолько бесполезна, насколько это возможно, потому что вам нужно различие от базы слияния до головки слияния.Запрос на извлечение - я использовал большинство уже представленных идей, но я также часто использую (особенно если он от другого разработчика) выполняет запрос на извлечение, который дает удобный способ просмотреть все изменения в слиянии, прежде чем оно произойдет место. Я знаю, что это GitHub, а не Git, но это, безусловно, удобно.
источник
Если не считать фактического выполнения слияния одноразовым способом (см. Ответ Касапо), то, похоже, нет надежного способа увидеть это.
Сказав это, вот метод, который немного приближается:
Это дает четкое представление о том, какие коммиты попадут в слияние. Чтобы увидеть различия, добавьте
-p
. Чтобы увидеть имена файлов, добавить любой из--raw
,--stat
,--name-only
,--name-status
.Проблема с
git diff TARGET_BRANCH...SOURCE_BRANCH
подходом (см. Ответ Яна Худека) состоит в том, что вы увидите различия в изменениях уже в вашей целевой ветви, если ваша исходная ветвь содержит перекрестные слияния.источник
Может быть, это может помочь вам? git-diff-tree - сравнивает содержимое и режим BLOB-объектов, найденных с помощью двух объектов дерева.
источник
Я не хочу использовать команду git merge в качестве предвестника для проверки конфликтующих файлов. Я не хочу делать слияние, я хочу определить потенциальные проблемы до слияния - проблемы, которые автоматическое слияние может скрыть от меня. Решение, которое я искал, состоит в том, как заставить git выложить список файлов, которые были изменены в обеих ветвях, которые будут объединены вместе в будущем, по отношению к некоторому общему предку. Как только у меня будет этот список, я смогу использовать другие инструменты сравнения файлов для дальнейшего изучения. Я искал несколько раз, и я до сих пор не нашел то, что я хочу в нативной команде git.
Вот мой обходной путь, на случай, если он поможет кому-то еще:
В этом сценарии у меня есть ветка под названием QA, в которой есть много изменений с момента последнего производственного выпуска. Наш последний производственный выпуск помечен как «15.20.1». У меня есть другая ветка разработки под названием new_stuff, которую я хочу объединить с веткой QA. И QA, и new_stuff указывают на коммиты, которые «следуют» (как сообщает gitk) за тегом 15.20.1.
Вот некоторые обсуждения, в которых рассказывается, почему я заинтересован в нацеливании на эти конкретные файлы:
Как я могу доверять Git Merge?
/software/199780/how-far-do-you-trust-automerge
источник