2012-04-16 7 views
20

Quiero encontrar todas las confusiones de fusión que afectan o afectan a un archivo determinado.Lista de fusiones confirmadas que afectan a un archivo

Para el fondo, alguien resolvió mal un conflicto al fusionarse, y el equipo no lo notó durante unos días. En ese momento, se habían cometido muchas otras fusiones no relacionadas (algunos de nosotros preferimos no usar rebase, o las cosas serían más simples). Necesito ubicar el compromiso de fusión "malo", por lo que se puede verificar para identificar qué más se pudo haber revertido (y, por supuesto, para identificar y castigar a los culpables).

El escenario es la siguiente:

$ echo First > a.txt && git add a.txt && git commit -m 'First commit' 
$ git branch branch1 
$ echo "Second: main-branch" >> a.txt && git commit -a -m 'Commit on master' 
$ git tag a1 
$ echo "Third: main" >> a.txt && git commit -a -m 'Other commit on master' 
$ git checkout branch1 
$ echo "Second: on branch1" >> a.txt && git commit -a -m 'Commit on branch' 
$ git tag b1 

... Así que ahora hay cambios conflictivos a a.txt en master y BRANCH1.

$ git checkout master 
$ git merge branch1 
Auto-merging a.txt 
CONFLICT (content): Merge conflict in a.txt 
Automatic merge failed; fix conflicts and then commit the result. 
$ cat a.txt 
First 
<<<<<<< HEAD:a.txt 
Second: main-branch 
Third: main 
======= 
Second: on branch1 
>>>>>>> branch1:a.txt 
$ vi a.txt 
# ... 
$ cat a.txt 
First 
Second: on branch1 
$ git add a.txt 
$ git commit -m 'Merge commit' 

... En otras palabras, la resolución es "tomar la suya". El gráfico ahora se ve así:

$ git log --graph --branches --format='%h %s %d' 
* fefb623 Merge commit (refs/heads/master) 
|\ 
| * 93e065e Commit on branch (refs/tags/b1, refs/heads/branch1) 
* | cf4d12b Other commit on master 
* | 6fade67 Commit on master (refs/tags/a1) 
|/ 
* 07545ea First commit 

En este punto, la versión incorrecta de a.txt está en el maestro. La versión en a1 es lo que queremos, pero la versión b1 estaba comprometida. Hasta ahora he intentado:

$ git log --decorate --oneline a.txt 
93e065e (refs/tags/b1, refs/heads/branch1) Commit on branch 
07545ea First commit 

Ok, por lo que ni a1 ni la fusión comprometo aparece.

$ git log --decorate --oneline --follow a.txt 
... 

Esto me muestra todo en ambas ramas, pero todavía omite las confusiones de fusión.

$ git log --oneline --graph --decorate a1..master 
... 

Esto es, por supuesto "todo en el maestro no en A1", que trabaja en este ejemplo de juguete, pero en mi caso real me da todas las fusiones hecho recientemente (y no hay indicación de que se tocó a.txt) .

Puedo racionalizar la desaparición de a1 del historial del archivo, ya que la combinación optó por omitir ese cambio (al menos en el sentido de que a Git le importa, creo). ¿Pero cómo puedo ubicar todas las asignaciones de fusión que afectan a.txt? ¿Esto es posible incluso sin inspeccionar manualmente todas las confusiones de fusión candiate?

+0

El registro de confirmación no muestran fusiones porque Diffs con la primera matriz cometer, que está en la rama que fue fusionada a partir; entonces git considera que no se modificó ningún archivo. – CharlesB

Respuesta

21

El problema en su caso es que las confusiones de fusión están vacías, porque se toman cosas solo de una rama, por lo que git simplifica el historial al eliminar esas confirmaciones "vacías".

Para que sus confusiones de fusión se muestren en el registro, debe indicarle a git que cambie la simplificación del historial, diciendo --simplify-merges. Si quiere entender por qué tiene que usar esto, vaya a la página del manual git log, pero estoy fuera :) De todos modos, en este caso, la confirmación de fusión se muestra correctamente con un filtro .txt, así que eso es lo que quiere .

Finalmente, desea mostrar diff dos veces, con cada padre, con -m.

Así que esto da

git log -U -m --simplify-merges --merges -- a.txt 

con la salida

commit a7340d6e91deedff6f52c8ec8da932245f73e5f6 (from d577e6c4dcbff5485ded666c89f38 
Merge: d577e6c fe3c4d2 

    merge commit 

diff --git a/a.txt b/a.txt 
index 319137b..1aa6dc4 100644 
--- a/a.txt 
+++ b/a.txt 
@@ -1,3 +1,2 @@ 
First 
-Second: main-branch 
-Third: main 
+Second: on branch1 
+0

Sí, esa es la diferencia que estaba buscando. –

+0

+1 para --simplificar-fusiona. Al no ver las confusiones de la fusión, ni al darme cuenta de que están ocultas del registro, perdí horas de mi tiempo hoy. – staafl

2

Puede agregar --merges al comando de registro. Esto solo mostrará las asignaciones de combinación. Además, puede especificar --first-parent para que solo siga el historial de sucursal y no tenga en cuenta el historial de sucursales fusionadas en él.

+0

esto no funcionará porque 'git log a.txt' no muestra la fusión de commit (no sé por qué) – CharlesB

+0

Probablemente solo si ha resuelto conflictos en la fusión de commit que involucran ese archivo ... ¿qué tal 'git log - a.txt'? –

+0

no, no aparece, aunque el conflicto de combinación implicó 'a.txt'; si resuelve el conflicto de fusión seleccionando solo los cambios de los suyos, commit diff está vacío y el registro lo oculta. Sin embargo, encontré cómo eludir – CharlesB

Cuestiones relacionadas