Cómo probar una fusión sin realmente fusionar primero

Respuestas:

132

No creo que haya una forma de simular lo que sucederá hasta que intentes la fusión. Sin embargo, si se asegura de que la salida de git statusesté vacía antes de hacer la fusión, es bastante seguro seguir adelante e intentarlo. Si tiene conflictos, puede volver inmediatamente al estado en el que se encontraba antes con:

git reset --merge

Desde git 1.7.4, también puede abortar la fusión haciendo:

git merge --abort

(Como explica el mensaje de confirmación que agregó esa opción , esto se agregó para mantener la coherencia, git rebase --abortetc.)

Mark Longair
fuente
44
La respuesta de @ Amber es responder exactamente lo que se pregunta "cómo simular la fusión". usar --no-commites mucho más fácil en mi opinión
samirahmed
14
@samirahmed: @Amber respondió la pregunta más literalmente, claro, aunque con --no-committodavía estás cambiando el índice y el árbol de trabajo, que no es exactamente "sin hacer ningún cambio" :) Mi punto es que cuando la gente pregunta este tipo de pregunta, generalmente es porque no son conscientes de que la mejor manera de ver cómo funcionaría una fusión es simplemente intentar la fusión , a menudo porque no son conscientes de lo fácil que es volver al estado en el que se encontraban antes si resultó haber problemas.
Mark Longair
2
No sé si esto se agregó en una versión más reciente de git, pero en los documentos (1.8.4) dice " git merge --abortes equivalente a git reset --mergecuándo MERGE_HEADestá presente", así que lo que sea más fácil de recordar :)
Samuel Meacham
@SamuelMeacham: gracias por señalarlo, se introdujo en 1.7.4. He actualizado la respuesta con eso. ¡Gracias!
Mark Longair
Esta sugerencia no hizo nada por mí, en git 1.9.4.
djangofan
137

Puede usar git merge --no-commitpara evitar que la fusión se confirme realmente, y si no le gusta cómo funciona la fusión, simplemente restablezca el encabezado original.

Si definitivamente no desea finalizar la fusión, incluso si es un avance rápido (y por lo tanto no tiene conflictos, por definición), también puede agregar --no-ff.

Ámbar
fuente
No creo que git merge --abortexista, ¿tal vez quieres decir git reset --merge?
Mark Longair
No, se me olvidó que a diferencia de rebaseque no existe una --abortpara git merge.
Ámbar
77
Yo también me tiraría --no-ff. Para evitar que se produzca una fusión ff.
Andy
1
@ Andy --no-ffes bastante obligatorio aquí, ya --no-commitque no detiene los cambios de avance rápido.
jackr
1
@Anant Anand Gupta: este es un buen truco, pero debería ser: git config --global alias.tm "fusionar --no-commit --no-ff"
pasx
109

Si quiero comparar los cambios en una rama de tema para dominar, me parece más fácil y seguro hacer lo siguiente:

git checkout master
git checkout -b trial_merge
git merge topic_branch

Después de completar la fusión, es fácil ver el cambio consolidado de maestro

git diff master

Cuando termine, simplemente elimine la rama trial_merge

git checkout master
git branch -D trial_merge

De esta manera, la rama maestra nunca cambia.

Ian
fuente
44
También puedes hacer git checkout --detachy probar lo que quieras. Más tarde, si desea conservar sus cambios, hágalo git checkout -b new_branch. Y si desea tirar sus cambios, verifique cualquier rama que desee ( git checkout master).
Shayan Toqraee
Si topic_branches enorme (como probablemente sea el caso si está en esta pregunta en primer lugar), el diff masterresultado es probablemente demasiado grande para que pueda mirarlo si una fusión va a causar conflictos.
Crescent Fresh
Definitivamente me gusta mucho ... seguro y simple.
leo
4

Yo suelo :

git merge --ff-only

de acuerdo con la documentación :

Negarse a fusionarse y salir con un estado distinto de cero a menos que el HEAD actual ya esté actualizado o la fusión se pueda resolver como un avance rápido.

No es realmente una simulación porque habrá una fusión de avance rápido en caso de que no haya conflictos entre las dos ramas. Pero en caso de conflictos, se le informará y no pasará nada.

Ortomala Lokni
fuente
4

He podido usar git merge --abort, recientemente. Sin embargo, esto solo se puede usar si hay un conflicto de fusión. Si está seguro de que no desea comprometerse, utilice los otros métodos mencionados anteriormente.

bean5
fuente
1
¿Qué otros métodos mencionados anteriormente? Todos lo mencionan git merge --abort. Debería comprobar su respuesta en el futuro especificando quién escribió la respuesta a la que se refiere.
Michael Fulton
3

¿Por qué no simplemente crear una rama desechable (git checkout -b) y hacer una fusión de prueba allí?

Mohan S Nayaka
fuente
1
Lo que sugiere es en realidad la respuesta de Ian expresada
brevemente
0

No sé exactamente si es tu caso , pero tu pregunta recuerda que a veces comienzo una función, me comprometo a lo largo de los días y combino el desarrollo muchas veces.

En este punto, pierdo el control sobre los archivos exactos que cambié y solo lo sabré cuando se cerró mi función y mi código se desarrolló.

En este caso, una buena manera de saber qué modificaciones realizó (no otras de las fusiones) es usar Sourcetree.

Debe hacer clic con el botón derecho en la rama base y seleccionar Diff Against Current:

La función de Sourcetree para conocer la diferencia entre dos ramas

Luego, sourcetree le mostrará todas las modificaciones que se fusionarán si fusiona su rama en la rama base.

Resultados

Por supuesto, no le mostrará los conflictos, pero es una herramienta útil en las fusiones.

Lucas Amorim Silva
fuente