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?
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