tag remove practices create crear best git merge commit difftool

remove - git tag best practices



Ver la fusión de Git ya comprometida en una herramienta externa de diff de 3 vías (3)

¿Hay alguna manera de ver una fusión que ya se ha cometido en una diferencia de 3 vías?

Si se cometió una gran fusión entre sucursales hace 3 semanas, ¿hay alguna manera de que pueda ver una diferencia de 3 vías en una herramienta externa como BeyondCompare3? Estoy buscando sólo los archivos cambiados en la confirmación de fusión . Bonificación si pudiera obtenerlo solo para mostrarme los conflictos y cualquier cambio manual, en lugar de ver la diferencia completa de un archivo entre las dos ramas.

No me importaría conformarme con un diferencial de 2 vías si el lado izquierdo tuviera los marcadores de conflicto <<<<< ===== >>>>> y el lado derecho fuera el resultado confirmado.

Intenté ver diff-tree , diff-files , diff , difftool , show y otros, y no pude resolverlo. Sé que gitk mostrará los cambios solo en la confirmación de fusión, pero no me gusta la vista de diferencias por encima y por debajo y es muy difícil de entender cuando hay toneladas de cambios.

Si solo pudiera hacer algo como git difftool --cc firstparent..secondparent..result


Al igual que sschuberth, escribí un guión que me ayudó a encontrar un cambio en una confirmación de fusión. Funciona en un solo archivo a la vez usando vimdiff para mostrar las diferencias entre los padres y la confirmación de fusión.

#! /usr/bin/env ruby require ''pp'' require ''tmpdir'' merge = ARGV[0] || abort("I need a merge commit as the first argument") file = ARGV[1] || abort("I need a path as the second argument") cmd = "vimdiff" commits = `git log -n 1 #{merge} --format="%H %P"`.split('' '') abort "expected three commits" unless commits.size == 3 commits[0], commits[1] = commits[1], commits[0] tmpdir = Dir.mktmpdir commits.each do |commit| tfile = "#{tmpdir}/#{commit[0..10]}" puts "git show #{commit}:./#{file} > #{tfile}" `git show #{commit}:./#{file} > #{tfile}` cmd += " #{tfile}" end puts cmd exec(cmd)

Es un poco intrincado, pero lo publiqué en la remota posibilidad de que ayude a alguien.


No sé cómo hacer un diff de tres vías en git sin alguna piratería, pero para un diff de dos vías usaría meld . meld es capaz de hacer un diff de tres vías si verifica las tres versiones diferentes de su proyecto, hace un nuevo diff por directorio y selecciona la opción "Comparación de tres vías".

Primero instala meld

sudo apt-get install meld

A continuación, establecer meld como el diftool

git config --global diff.tool meld

Encuentra los commits

git log | more

Abra los commits

git difftool <old-version>..HEAD


Respuesta actualizada: mi versión original de la secuencia de comandos a continuación tenía fallas en el sentido de que $conflicting_files de hecho no contenía solo los archivos que realmente tenían conflictos, sino todos los archivos que se modificaron en las dos ramas principales (pero no necesariamente tuvieron conflictos). Además, no usaba "la herramienta de combinación configurada" como se publicita en el análisis razonado, sino que se diffuse . He abordado ambos problemas en la versión actual del script .

Respuesta original: Digamos que tenemos una rama "maestra" con el desarrollo principal en curso, y una rama de "tema" que agrega alguna función sobre un estado más antiguo (más antiguo). Al decir que está buscando solo los archivos modificados en la confirmación de fusión, asumo que solo está interesado en los cambios "tema" introducido en "maestro" en la confirmación de combinación (incluida cualquier resolución de conflictos), no en la Los cambios conflictivos que se hicieron en "maestro" desde el "tema" se ramificaron. Además suponiendo que "maestro" es el primer padre de su compromiso de fusión y "tema" es el segundo, esto se puede lograr con

git difftool <merge commit>^1 <merge commit>

Tenga en cuenta que no tiene sentido utilizar una diferencia de 3 vías aquí ya que estamos viendo el estado que incluye cualquier resolución de conflicto . Esto también es lo que GitHub está mostrando para las confirmaciones de mezcla, por cierto, vea, por ejemplo, esta confirmación de combinación que he usado para la prueba.

Para ver solo los archivos en conflicto y sus resoluciones en una herramienta diff de 3 vías, se me ocurrió este script

#!/bin/sh if [ $# -ne 1 ]; then echo "Rationale : Show the conflict resolution of a given merge commit in the configured merge tool." echo "Usage : $(basename $0) <merge commit>" exit -1 fi # Test e.g. with https://github.com/git/git/commit/8cde60210dd01f23d89d9eb8b6f08fb9ef3a11b8 our=$1^1 their=$1^2 base=$(git merge-base $our $their) conflicting_files=$(git merge-tree $base $our $their | grep -A 3 "changed in both" | grep "base" | grep -Po "[^/s]+$") for f in $conflicting_files; do diffuse -r $our -r $base -r $their $f done

Estoy usando Diffuse lugar de Beyond Compare porque el primero puede funcionar directamente en confirmaciones de Git en comparación con los archivos locales; cambia el orden de los argumentos a tu gusto. Para usar BC, probablemente necesitarías hacer checkouts temporales; También estaba pensando en rehacer la fusión, aplicar la resolución conocida y ejecutar la configuración de git mergetool , pero estas dos ideas requerirían más trabajo para no desordenar su árbol de trabajo y realizar la limpieza correctamente.