Tengo una rama git (la línea principal, por ejemplo) y quiero fusionarme en otra rama de desarrollo. O yo?
Para decidir si realmente quiero fusionar esta rama, me gustaría ver algún tipo de vista previa de lo que hará la fusión. Preferiblemente con la capacidad de ver la lista de confirmaciones que se están aplicando.
Hasta ahora, lo mejor que se me ocurre es merge --no-ff --no-commit
, y luego diff HEAD
.
git merge
ygit reset --keep HEAD@{1}
si no me gusta el resultado.git reset --keep HEAD@{1}
devolvió lafatal: Cannot do a keep reset in the middle of a merge.
Ayuda?--preview
opción en git-merge?Respuestas:
Descubrí que la solución que mejor funciona para mí es simplemente realizar la fusión y abortarla si hay conflictos . Esta sintaxis particular me parece limpia y simple. Esta es la estrategia 2 a continuación.
Sin embargo, si desea asegurarse de no estropear su rama actual, o simplemente no está listo para fusionarse, independientemente de la existencia de conflictos, simplemente cree una nueva sub-rama y fusione eso:
Estrategia 1: La forma segura: fusionar una rama temporal:
De esa manera, simplemente puede tirar la rama temporal si solo quiere ver cuáles son los conflictos. No necesita molestarse en "abortar" la fusión, y puede volver a su trabajo: simplemente vuelva a pagar 'mybranch' y no tendrá ningún código fusionado o conflictos de fusión en su sucursal.
Esto es básicamente una carrera en seco.
Estrategia 2: cuando definitivamente quieres unirte, pero solo si no hay conflictos
Si git informa conflictos (y SOLO SI HAY conflictos), puede hacer lo siguiente:
Si la fusión es exitosa, no puede cancelarla (solo restablecer).
Si no está listo para fusionarse, use la forma más segura anterior.
[EDITAR: 2016-noviembre - Cambié la estrategia 1 por 2, porque parece ser que la mayoría de la gente está buscando "la forma segura". La Estrategia 2 ahora es más una nota de que simplemente puede abortar la fusión si la fusión tiene conflictos con los que no está listo para lidiar. ¡Tenga en cuenta si lee los comentarios!]
fuente
git merge --no-ff --no-commit
si no desea confirmar los cambios directamente. Esto elimina la "necesidad" de una rama diferente, lo que hace que sea un poco más fácil revisar los cambios, en mi opinión.git merge --no-ff --no-commit
? Supongo que aún puedes hacer algogit merge --abort
después si no te gusta lo que ves. ¿Incluso si la fusión no produce conflictos?git reset --hard HEAD
y luego verifique una rama diferentegit checkout <different branch name>
y elimine la rama temporalgit delete -b <name of temporary branch>
.git log ..otherbranch
git diff ...otherbranch
gitk ...otherbranch
La cadena vacía implica
HEAD
, así que es por eso solo en..otherbranch
lugar deHEAD..otherbranch
.Los puntos dos frente a tres tienen un significado ligeramente diferente para diff que para los comandos que enumeran revisiones (log, gitk, etc.). Para log y otros dos puntos (
a..b
) significa todo lo que está dentrob
pero noa
y tres puntos (a...b
) significa todo lo que está en solo uno dea
ob
. Pero diff obras con dos revisiones y existe el caso más simple representados por dos puntos (a..b
) es simple diferencia dea
ab
y tres puntos (a...b
) diferencia media entre ancestro común yb
(git diff $(git merge-base a b)..b
).fuente
git checkout master
antes de intentar esto. Me preguntaba por qué decía que todos mis cambios iban agit show ..otherbranch
mostrará una lista de cambios y diferencias que se fusionarán en la rama actual.Si eres como yo, estás buscando un equivalente a
svn update -n
. Lo siguiente parece hacer el truco. Tenga en cuenta que asegúrese de hacer unagit fetch
primera para que su repositorio local tenga las actualizaciones apropiadas para comparar.o si quieres un diferencial de tu cabeza al control remoto:
En mi opinión, esta solución es mucho más fácil y menos propensa a errores (y, por lo tanto, mucho menos riesgosa) que la solución principal que propone "fusionar y luego abortar".
fuente
$ git checkout target-branch
y luego$ git diff --name-status ...branch-to-be-merged
(tres puntos son esenciales, así queLa mayoría de las respuestas aquí requieren un directorio de trabajo limpio y múltiples pasos interactivos (malos para las secuencias de comandos), o no funcionan para todos los casos, por ejemplo, fusiones anteriores que ya traen algunos de los cambios pendientes en su rama de destino, o selecciones de cereza haciendo el mismo.
Para ver realmente qué cambiaría en la
master
rama si se fusionaradevelop
con ella, en este momento:- https://git.seveas.net/previewing-a-merge-result.html
(gracias a David Normington por el enlace)
PD:
Si obtiene conflictos de fusión, aparecerán con los marcadores de conflicto habituales en la salida, por ejemplo:
El usuario @dreftymac hace un buen punto: esto lo hace inadecuado para las secuencias de comandos, porque no se puede captar fácilmente del código de estado. Los marcadores de conflicto pueden ser bastante diferentes dependiendo de las circunstancias (eliminado frente a modificado, etc.), lo que hace que sea difícil de asimilar también. Tener cuidado.
fuente
true
si hay conflictos yfalse
si no hay conflictos (por ejemplo, un valor booleano que no requiere la prueba de "globo ocular" o cualquier intervención humana).git merge-tree ... | grep -q '^[a-z].*in both$' && echo conflict || echo safe to merge
pero es fastidioso; Probablemente estoy olvidando un caso. ¿tal vez quieras comprobar los marcadores de conflicto? por ejemplo, esto probablemente no capta los conflictos de estilo "ellos borrados, los nuestros cambiados". (Acabo de comprobar y eso ni siquiera muestra marcadores de conflicto, por lo que necesita una expresión regular meticulosa para estar seguro aquí)less -R
para manejar la salida en color sin modificar su configuración.Si ya obtuvo los cambios, mi favorito es:
Eso necesita git 1.7.x, creo. La
@{u}
notación es una "taquigrafía" para la rama aguas arriba, por lo que es un poco más versátil quegit log ...origin/master
.Nota: Si usa zsh y el elemento extendido de glog, es probable que tenga que hacer algo como:
fuente
Además de las respuestas existentes, se podría crear un alias para mostrar la diferencia y / o el registro antes de una fusión. Muchas respuestas omiten
fetch
que se haga primero antes de "previsualizar" la fusión; Este es un alias que combina estos dos pasos en uno (emulando algo similar a Mercurialhg incoming
/outgoing
)Entonces, basándose en "
git log ..otherbranch
", puede agregar lo siguiente a~/.gitconfig
:Para la simetría, el siguiente alias se puede usar para mostrar lo que está comprometido y lo que se empujaría, antes de empujar:
Y luego puede ejecutar "
git incoming
" para mostrar muchos cambios, o "git incoming -p
" para mostrar el parche (es decir, el "diff"), "git incoming --pretty=oneline
", para un breve resumen, etc. Luego puede (opcionalmente) ejecutar "git pull
" para En realidad fusionarse. (Sin embargo, dado que ya ha obtenido, la fusión se podría hacer directamente).Del mismo modo, "
git outgoing
" muestra lo que se presionaría si tuviera que correr "git push
".fuente
git log currentbranch..otherbranch
le dará la lista de confirmaciones que irán a la rama actual si hace una fusión. Los argumentos habituales para iniciar sesión que dan detalles sobre los commits le darán más información.git diff currentbranch otherbranch
te dará la diferencia entre los dos commits que se convertirán en uno. Esta será una diferencia que le dará todo lo que se fusionará.¿Ayudarían estos?
fuente
git log otherbranch..currentbranch
da una lista de confirmaciones en currentbranch . Legit diff otherbranch currentbranch
da la diferencia de la versión a fusionar a la punta actual, que es tan inútil como puede ser, porque lo que desea es la diferencia de la base de fusión a la cabeza de fusión.Solicitud de extracción: he utilizado la mayoría de las ideas ya enviadas, pero una que también utilizo a menudo es (especialmente si es de otro desarrollador) hacer una solicitud de extracción que proporciona una forma práctica de revisar todos los cambios en una fusión antes de que tome sitio. Sé que es GitHub, no git, pero seguro que es útil.
fuente
A menos que realmente realice la fusión de una manera descartable (vea la respuesta de Kasapo), no parece haber una forma confiable de ver esto.
Dicho esto, aquí hay un método que se acerca marginalmente:
Esto da una indicación justa de qué commits lo harán en la fusión. Para ver las diferencias, agregue
-p
. Para ver los nombres de archivo, añadir cualquiera de--raw
,--stat
,--name-only
,--name-status
.El problema con el
git diff TARGET_BRANCH...SOURCE_BRANCH
enfoque (consulte la respuesta de Jan Hudec) es que verá diferencias para los cambios que ya se encuentran en su rama de destino si su rama de origen contiene fusiones cruzadas.fuente
Tal vez esto pueda ayudarle ? git-diff-tree : compara el contenido y el modo de los blobs encontrados a través de dos objetos de árbol
fuente
No quiero usar el comando git merge como precursor para revisar archivos en conflicto. No quiero hacer una fusión, quiero identificar posibles problemas antes de fusionar, problemas que la fusión automática podría ocultarme. La solución que he estado buscando es cómo hacer que git escupe una lista de archivos que se han cambiado en ambas ramas que se fusionarán en el futuro, en relación con algún antepasado común. Una vez que tenga esa lista, puedo usar otras herramientas de comparación de archivos para explorar más las cosas. He buscado varias veces, y todavía no he encontrado lo que quiero en un comando git nativo.
Aquí está mi solución, en caso de que ayude a alguien más:
En este escenario, tengo una rama llamada QA que tiene muchos cambios desde la última versión de producción. Nuestro último lanzamiento de producción está etiquetado con "15.20.1". Tengo otra rama de desarrollo llamada new_stuff que quiero fusionar en la rama QA. Tanto QA como new_stuff apuntan a confirmaciones que "siguen" (según lo informado por gitk) la etiqueta 15.20.1.
Aquí hay algunas discusiones que explican por qué estoy interesado en apuntar a estos archivos específicos:
¿Cómo puedo confiar en Git Merge?
/software/199780/how-far-do-you-trust-automerge
fuente