Как «показать» коммит слияния с комбинированным выводом diff, даже если каждый измененный файл согласовывается с одним из родителей? - PullRequest
169 голосов
/ 22 февраля 2011

После выполнения «простого» слияния (без конфликтов), git show обычно показывает только что-то вроде

commit 0e1329e551a5700614a2a34d8101e92fd9f2cad6 (HEAD, master)
Merge: fc17405 ee2de56
Author: Tilman Vogel <email@email>
Date:   Tue Feb 22 00:27:17 2011 +0100

Merge branch 'testing' into master

Это потому, что для слияний git show использует комбинированный формат diff, в котором отсутствуетфайлы, которые согласуются с любой из родительских версий.

Есть ли способ заставить git по-прежнему показывать все различия в комбинированном режиме сравнения?

Выполнение git show -m покажет различия (с использованием попарных различий между новой и всеми родительскими версиями соответственно), но я бы предпочел иметь это с различиями, отмеченными +/- в соответствующих столбцах, как в комбинированном режиме.

Ответы [ 11 ]

1 голос
/ 07 февраля 2017

Я построил универсальный подход к выполнению различных операций над коммитами слияния.

Шаг первый : добавьте псевдоним для git, отредактировав ~/.gitconfig:

[alias]
  range = "!. ~/.githelpers && run_on_merge_range"

Шаг второй : в ~/.githelpers определите функцию bash:

run_on_merge_range() {
  cmd=$1; shift
  commit=$1; shift
  range=$(git show $commit | grep Merge: | awk '{print $2 "..." $3}')
  echo "git $cmd $range $@"
  if [ -z $range ]; then
    echo "No merge detected"
    exit 1
  fi
  git $cmd $range $@
}

Шаг третий : Прибыль!

git range log <merge SHA> --oneline
git range diff <merge SHA> --reverse -p
git range diff <merge SHA> --name-only

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...