theirs origin force git merge

origin - ¿Cómo "mostrar git" una fusión se compromete con salida de diff combinada incluso cuando cada archivo cambiado está de acuerdo con uno de los padres?



git merge--abort (9)

Después de hacer una fusión "simple" (una sin conflictos), el git show usualmente solo muestra algo así como

commit 0e1329e551a5700614a2a34d8101e92fd9f2cad6 (HEAD, master) Merge: fc17405 ee2de56 Author: Tilman Vogel <email@email> Date: Tue Feb 22 00:27:17 2011 +0100 Merge branch ''testing'' into master

Esto se debe a que, para las fusiones, git show usa el formato de diferencias combinado que omite los archivos que concuerdan con cualquiera de las versiones principales.

¿Hay alguna manera de obligar a Git a que muestre todas las diferencias en el modo de combinación combinada?

Al hacer git show -m se mostrarán las diferencias (usando diferencias por pares entre la versión nueva y todas las versiones principales respectivamente), pero preferiría tener eso con las diferencias marcadas con +/- en las columnas respectivas, como en el modo combinado.


Como señaló Kris Nuttycombe, la mejor solución es

git diff fc17405...ee2de56

para el compromiso de fusión

commit 0e1329e551a5700614a2a34d8101e92fd9f2cad6 (HEAD, master) Merge: fc17405 ee2de56 Author: Tilman Vogel <email@email> Date: Tue Feb 22 00:27:17 2011 +0100

para mostrar todos los cambios en ee2de56 que se puede fc17405 desde confirmaciones en fc17405 . Tenga en cuenta el orden de los hashes de confirmación: es el mismo que se muestra en la información de combinación: Merge: fc17405 ee2de56

También tenga en cuenta los 3 puntos ... lugar de dos !

Para obtener una lista de archivos modificados, puede usar:

git diff fc17405...ee2de56 --name-only


Construí un enfoque de propósito general para hacer varias operaciones en los commit de una fusión.

Paso uno : agregue un alias a git editando ~/.gitconfig :

[alias] range = "!. ~/.githelpers && run_on_merge_range"

Paso dos : en ~/.githelpers , define una función bash:

run_on_merge_range() { cmd=$1; shift commit=$1; shift range=$(git show $commit | grep Merge: | awk ''{print $2 "..." $3}'') echo "git $cmd $range $@" if [ -z $range ]; then echo "No merge detected" exit 1 fi git $cmd $range $@ }

Paso tres : ¡Ganar!

git range log <merge SHA> --oneline git range diff <merge SHA> --reverse -p git range diff <merge SHA> --name-only

Es probable que haya MUCHO margen de mejora aquí, simplemente lo armé todo para superar una situación molesta. Siéntase libre de burlarse de mi sintaxis y / o lógica de bash.


Creo que solo necesitas ''git show -c $ ref''. Probar esto en el repositorio de git en a8e4a59 muestra un diff combinado (caracteres más / menos en una de 2 columnas). Como menciona el manual de git-show, prácticamente delega a ''git diff-tree'', por lo que esas opciones parecen útiles.


Mira el mensaje de compromiso:

commit 0e1329e551a5700614a2a34d8101e92fd9f2cad6 (HEAD, master) Merge: fc17405 ee2de56 Author: Tilman Vogel <email@email> Date: Tue Feb 22 00:27:17 2011 +0100 Merge branch ''testing'' into master

fíjate en la línea:

Merge: fc17405 ee2de56

toma esos dos identificadores de commit y revésalos. entonces para obtener la diferencia que deseas, harías:

git diff ee2de56..fc17405

para mostrar solo los nombres de los archivos modificados:

git diff --name-only ee2de56..fc17405

y para extraerlos, puedes agregar esto a tu gitconfig:

exportfiles = !sh -c ''git diff $0 --name-only | "while read files; do mkdir -p /"$1/$(dirname $files)/"; cp -vf $files $1/$(dirname $files); done"''

luego úsala haciendo:

git exportfiles ee2de56..fc17405 /c/temp/myproject


No, no hay forma de hacer esto. Pero a veces sería agradable, y probablemente sería relativamente fácil de implementar en el código fuente de git (después de todo, solo tienes que decirle que no recorte lo que piensa que es salida extraña), entonces el parche para hacerlo probablemente sea aceptado por los mantenedores de git.

Tenga cuidado con lo que desea, sin embargo; fusionar una rama con un cambio de una línea que se bifurcó hace tres meses todavía tendrá una gran diferencia frente a la línea principal, por lo que una diferencia completa sería casi completamente inútil. Es por eso que git no lo muestra.



Puede crear una bifurcación con HEAD configurado en una confirmación antes de la fusión. Entonces, puedes hacer:

git merge --squash testing

Esto se fusionará, pero no se comprometerá. Entonces:

git diff


Puede usar el comando diff-tree con el indicador -c. Este comando muestra qué archivos han cambiado en la confirmación de fusión.

git diff-tree -c {merged_commit_sha}

Git-Scm la descripción de la bandera -c de Git-Scm :

Este indicador cambia la forma en que se muestra una confirmación de fusión (lo que significa que es útil solo cuando el comando recibe una, o --stdin). Muestra las diferencias de cada uno de los padres con el resultado de fusión simultáneamente en lugar de mostrar la diferencia por pares entre un elemento primario y el resultado de a uno por vez (que es lo que hace la opción -m). Además, enumera solo los archivos que fueron modificados de todos los padres.


en su caso solo necesita

git diff HEAD^ HEAD^2

o simplemente hash para ti:

git diff 0e1329e55^ 0e1329e55^2