¿Qué command de Git mostrará el contenido presente solo en una twig cuyas confirmaciones se fusionaron por completo con el maestro?

¿Qué commands de Git mostrarán el contenido presente solo en una twig cuyas confirmaciones se fusionaron por completo con el master ? Es posible que falte algo de contenido en el master porque, por ejemplo, algunas operaciones de fusión pueden haber usado ours estrategia, ignorando el contenido de la sucursal (es decir, git merge --strategy ours branch ).

He descubierto que las operaciones de comparación de Git habituales no producen el resultado que deseo.

Por ejemplo, los commands git diff master..branch y git diff branch..master no funcionan porque muestran las diferencias de contenido presentes en el master . (¿Cómo puedo modificar este command para omitir los cambios en el master ?)

Command git diff master...branch tampoco funciona porque todas las confirmaciones de la branch se fusionaron previamente con la maestra en varias operaciones de fusión a lo largo del time.

Ejemplo:

  1. Crear file a.txt en branch master .
  2. Agregue la línea 1 a a.txt en el master twigs.
  3. Crear twig de branch .
  4. Agregue la línea 2 a a.txt en la twig de branch .
  5. Cambiar a master twig.
  6. Agregue la línea 2 a a.txt en el master twigs.
  7. Merge branch branch to master usando la estrategia ours . Esto es como una fusión "ficticia" que fusiona todas las confirmaciones en la branch a la master , pero descarta su contenido.
  8. Comparar twigs master y branch .

Secuencia de commands:

 derek@derek-lubuntu:~/Projects$ git init test Initialized empty Git repository in /home/derek/Projects/test/.git/ derek@derek-lubuntu:~/Projects$ cd test derek@derek-lubuntu:~/Projects/test$ touch a.txt derek@derek-lubuntu:~/Projects/test$ git add a.txt derek@derek-lubuntu:~/Projects/test$ git commit --message "Added a.txt." [master (root-commit) 6a36816] Added a.txt. 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 a.txt derek@derek-lubuntu:~/Projects/test$ echo "Line 1 from master." >> a.txt derek@derek-lubuntu:~/Projects/test$ git commit -a --message "Added line 1." [master c9ebf16] Added line 1. 1 file changed, 1 insertion(+) derek@derek-lubuntu:~/Projects/test$ git checkout -b branch Switched to a new branch 'branch' derek@derek-lubuntu:~/Projects/test$ echo "Line 2 from branch." >> a.txt derek@derek-lubuntu:~/Projects/test$ git commit -a --message "Added line 2." [branch 8a142dd] Added line 2. 1 file changed, 1 insertion(+) derek@derek-lubuntu:~/Projects/test$ cat a.txt Line 1 from master. Line 2 from branch. derek@derek-lubuntu:~/Projects/test$ git checkout master Switched to branch 'master' derek@derek-lubuntu:~/Projects/test$ echo "Line 2 from master." >> a.txt derek@derek-lubuntu:~/Projects/test$ git commit -a --message "Added line 2." [master d496cc7] Added line 2. 1 file changed, 1 insertion(+) derek@derek-lubuntu:~/Projects/test$ git merge --strategy ours branch Merge made by the 'ours' strategy. derek@derek-lubuntu:~/Projects/test$ git merge branch Already up-to-date. derek@derek-lubuntu:~/Projects/test$ git diff master..branch diff --git a/a.txt b/a.txt index f773e76..5dae91a 100644 --- a/a.txt +++ b/a.txt @@ -1,2 +1,2 @@ Line 1 from master. -Line 2 from master. +Line 2 from branch. derek@derek-lubuntu:~/Projects/test$ git diff branch..master diff --git a/a.txt b/a.txt index 5dae91a..f773e76 100644 --- a/a.txt +++ b/a.txt @@ -1,2 +1,2 @@ Line 1 from master. -Line 2 from branch. +Line 2 from master. derek@derek-lubuntu:~/Projects/test$ git diff master...branch derek@derek-lubuntu:~/Projects/test$ git diff branch...master diff --git a/a.txt b/a.txt index 5dae91a..f773e76 100644 --- a/a.txt +++ b/a.txt @@ -1,2 +1,2 @@ Line 1 from master. -Line 2 from branch. +Line 2 from master. 

Qué operación de Git puedo usar para mostrar solo "+ Línea 2 desde la twig". mientras ignoras "+ Line 2 desde master". o "-Línea 2 del maestro".

¿De qué manera hago un diff unidireccional en Linux? :

Puede canalizar la salida de diff a grep para orderar los cambios presentes en el maestro. La mejor manera de hacerlo es ignorar cualquier línea que comience con un guión.

git diff master branch | grep -v "^-"

Para mí esto mostró el siguiente resultado después de seguir sus pasos:

diff – git a / a.txt b / a.txt

índice f908dc1..1b5b3bd 100644

+++ b / a.txt

@@ -1,2 +1,2 @@

esta línea en ambos files

+ línea2 en una twig

mientras que la git diff master branch muestra

diff – git a / a.txt b / a.txt

índice f908dc1..1b5b3bd 100644

— a / a.txt

+++ b / a.txt

@@ -1,2 +1,2 @@

esta línea en ambos files

-line2 en el maestro

+ línea2 en una twig

Esto tiene el efecto secundario de eliminar el color del diff e imprimirlo directamente a stdout en lugar de a less . Como el color está ahí para ayudar a diferenciar en qué file se encuentra cada cambio listdo, no debería ser necesario eliminar en un file los cambios. Si necesita mantener las cosas en less , simplemente agregue una tubería a less al final del command.

Editar: como @DerekMahar señaló en su comentario, esto solo muestra las adiciones en la branch que no se reflejan en el master . No estoy seguro de cómo modificar esto para include todos los cambios de la branch , ya que no conozco una manera simple de diferenciar entre una adición al master y una resta de la branch mientras veo una diferencia.


La siguiente es una idea muy aproximada que, como se explica aquí, no resolvería del todo el problema, pero parece un comienzo lo suficientemente bueno como para pensar que debería tomar nota en caso de que alguien más sepa cómo solucionar los problemas con él:

Mi mejor pensamiento inicial (que requiere más secuencias de commands de las que tengo time por ahora, y también tiene su propia colección de problemas, pero pensé que lo pondría aquí en caso de que alguien más pueda trabajar con él) es tomar la salida de la git diff master branch | grep "^-" de git diff master branch | grep "^-" git diff master branch | grep "^-" (observe la falta de -v ), y luego busque las líneas de esa salida en el file correcto en la branch (el nombre de file estaría disponible en la primera línea de salida). Entonces sabríamos que cualquier línea encontrada en la branch se eliminó de la master , mientras que las líneas que no se encontraron se agregaron al master . Sin embargo, las líneas que pueden repetirse (p. Ej., { sí mismas) rápidamente causarían problemas con este método, y no estoy seguro de cómo resolver ese problema.

Aplicando el algorithm al que me referí en mi comentario anterior :

  1. Calcule todos los cambios en la branch ya que se ramificó desde el master usando el command git diff $(git merge-base master branch)^ branch . En el ejemplo dado, $(git merge-base master branch)^ refiere al padre del primer commit en branch .
  2. Aplique estos cambios a la master patch -p1 en el patch -p1 .
  3. Calcula la diferencia usando git diff .

Por ejemplo:

 derek@derek-lubuntu:~/Projects/test$ git diff $(git merge-base master branch)^ branch | patch -p1 patching file a.txt Hunk #1 succeeded at 1 with fuzz 1. derek@derek-lubuntu:~/Projects/test$ git diff diff --git a/a.txt b/a.txt index f773e76..de87c33 100644 --- a/a.txt +++ b/a.txt @@ -1,2 +1,3 @@ Line 1 from master. +Line 2 from branch. Line 2 from master. derek@derek-lubuntu:~/Projects/test$ 

Aunque esto no omite los cambios aplicados al master , evita que git diff informe como cambios.

Tenga en count que el paso 1 funcionaría solo para los casos en que una twig se fusiona solo una vez, que no es mi caso. En cambio, podríamos labelr el compromiso de la twig original, que afortunadamente lo he hecho.