¿Cómo puedo encontrar fusiones con conflictos inesperados en git?

En el siguiente ejemplo, produzco una fusión en la cabecera del maestro que es "extraña": cambia un file en el que no hubo conflicto. A Git no parece gustarme decir que lo he hecho.

git init test cd test seq 1 5 > file1 git add file1 seq 6 10 > file2 git add file2 git commit -m root git branch branch sed -i 's/7/8/' file2 git commit -a -m '7++' git checkout branch sed -i 's/7/6/' file2 sed -i 's/3/4/' file1 git commit -a -m '7--; 3++' git checkout master git branch oldmaster git merge branch git checkout master file1 git checkout branch file2 git commit 

Obviamente, el process de producir este problema es inusual, pero suponiendo que no soy el que lo creó, ¿cómo puedo encontrarlo? el logging de git no es útil; ni siquiera muestra cuál de los conflictos elegí:

 git log -p --graph * commit cde4ac55b4c60d5c5c7f36bae9d9cc34689b20c1 |\ Merge: 8689e18 f42deb9 | | Author: David Buckley <bucko@gambitresearch.com> | | Date: Tue Dec 9 12:29:51 2014 +0000 | | | | Merge branch 'branch' | | | | Conflicts: | | file2 | | | * commit f42deb9971ca05afbff11bb5dcc77650585c990b | | Author: David Buckley <bucko@gambitresearch.com> | | Date: Tue Dec 9 12:29:51 2014 +0000 | | | | 7--; 3++ | | | | diff --git a/file1 b/file1 | | index 8a1218a..6234030 100644 | | --- a/file1 | | +++ b/file1 | | @@ -1,5 +1,5 @@ | | 1 | | 2 | | -3 | | +4 | | 4 | | 5 | | diff --git a/file2 b/file2 | | index 1e1140b..63f0f17 100644 | | --- a/file2 | | +++ b/file2 | | @@ -1,5 +1,5 @@ | | 6 | | -7 | | +6 | | 8 | | 9 | | 10 | | * | commit 8689e183d785af50dd2f92e3d7bed3b62507447f |/ Author: David Buckley <bucko@gambitresearch.com> | Date: Tue Dec 9 12:29:51 2014 +0000 | | 7++ | | diff --git a/file2 b/file2 | index 1e1140b..6f1177a 100644 | --- a/file2 | +++ b/file2 | @@ -1,5 +1,5 @@ | 6 | -7 | +8 | 8 | 9 | 10 | * commit bb2a50a7164ffe79a2fc26d0008ca4fe26b07442 Author: David Buckley <bucko@gambitresearch.com> Date: Tue Dec 9 12:29:51 2014 +0000 root diff --git a/file1 b/file1 new file mode 100644 index 0000000..8a1218a --- /dev/null +++ b/file1 @@ -0,0 +1,5 @@ +1 +2 +3 +4 +5 diff --git a/file2 b/file2 new file mode 100644 index 0000000..1e1140b --- /dev/null +++ b/file2 @@ -0,0 +1,5 @@ +6 +7 +8 +9 +10 

Lo que está en juego es que la fusión confirmada a la cabeza revierte el cambio a file1, pero el logging de git no indica que esto haya tenido lugar, o incluso que esta fusión sea interesante en absoluto.

git culpa no puede ver la reversión (afirma que todo el file 1 puede ser culpado en la confirmación inicial), incluso cuando fusiono el maestro en twig en vez de hacerlo en el reverso.

Puedo encontrarlo en este caso forzando diffs con cada padre usando '-m', pero esto es inútil cuando se ha hecho mucho trabajo en ambas twigs antes de la fusión: el cambio inusual será inundado por legitimidad cambios de ambos lados, y cada cambio 'normal' hecho en cada padre se repetirá.

Claramente, 'git merge' podría encontrar el problema aquí, ya que el compromiso difiere de los padres en una forma que la fusión por sí sola no hubiera sugerido. Parece que la salida de diff está formateada utilizando solo la confirmación en cuestión y todos sus padres como información de origen. Preferiría que también tuviera en count la base de fusión de todos los padres, y en el caso de ninguna base de fusión, se obtendría un resultado similar a '-m'.

Puedo get algo cercano a lo que quiero con:

 diff -u <(git diff oldmaster..master) <(git diff $(git merge-base oldmaster branch)..branch) --- /proc/self/fd/11 2014-12-09 13:01:44.576808417 +0000 +++ /proc/self/fd/12 2014-12-09 13:01:44.576808417 +0000 @@ -1,10 +1,21 @@ +diff --git a/file1 b/file1 +index 8a1218a..6234030 100644 +--- a/file1 ++++ b/file1 +@@ -1,5 +1,5 @@ + 1 + 2 +-3 ++4 + 4 + 5 diff --git a/file2 b/file2 -index 6f1177a..63f0f17 100644 +index 1e1140b..63f0f17 100644 --- a/file2 +++ b/file2 @@ -1,5 +1,5 @@ 6 --8 +-7 +6 8 9 

Y:

 diff -u <(git diff branch..master) <(git diff $(git merge-base oldmaster branch)..oldmaster) --- /proc/self/fd/11 2014-12-09 13:02:05.680455766 +0000 +++ /proc/self/fd/12 2014-12-09 13:02:05.680455766 +0000 @@ -1,14 +1,14 @@ -diff --git a/file1 b/file1 -index 6234030..8a1218a 100644 ---- a/file1 -+++ b/file1 +diff --git a/file2 b/file2 +index 1e1140b..6f1177a 100644 +--- a/file2 ++++ b/file2 @@ -1,5 +1,5 @@ - 1 - 2 --4 -+3 - 4 - 5 + 6 +-7 ++8 + 8 + 9 + 10 

Sin embargo, la segunda salida es obviamente algo torpe.

¿Puedo persuadir a git para que haga esta lógica por mí?