Usando gitk log
, no pude detectar una diferencia entre los dos. ¿Cómo puedo observar la diferencia (con un comando git o alguna herramienta)?
git
merge
fast-forward
usuario1162226
fuente
fuente
Respuestas:
El
--no-ff
indicador evita lagit merge
ejecución de un "avance rápido" si detecta que su actualHEAD
es un antepasado de la confirmación que está intentando fusionar. Un avance rápido es cuando, en lugar de construir una confirmación de fusión, git simplemente mueve el puntero de la rama para apuntar a la confirmación entrante. Esto ocurre comúnmente cuando se realiza ungit pull
sin cambios locales.Sin embargo, ocasionalmente desea evitar que ocurra este comportamiento, generalmente porque desea mantener una topología de rama específica (por ejemplo, se está fusionando en una rama de tema y quiere asegurarse de que se vea de esa manera cuando lea el historial). Con el fin de hacer eso, se puede pasar la
--no-ff
bandera ygit merge
lo harás siempre la construcción de una fusión en lugar de avance rápido.Del mismo modo, si desea ejecutar
git pull
o usargit merge
para avanzar explícitamente y desea rescatar si no puede avanzar rápidamente, puede usar la--ff-only
bandera. De esta manera, puede hacer algo comogit pull --ff-only
pensar sin pensar, y luego, si se produce un error, puede regresar y decidir si desea fusionar o cambiar la base.fuente
gitk
ogit log --graph
la fusión de avance rápido no creó una confirmación de fusión, mientras que la de avance rápido no lo hizo.--no-ff
una característica para desarrollar o desarrollar para dominar es similar a fusionar una solicitud de extracción?--no-ff
.Respuesta gráfica a esta pregunta.
Aquí hay un sitio con una explicación clara y una ilustración gráfica del uso
git merge --no-ff
:Hasta que vi esto, estaba completamente perdido con git. El uso le
--no-ff
permite a alguien que revisa el historial ver claramente la sucursal que desprotegió para trabajar. (ese enlace apunta a la herramienta de visualización de "red" de github) Y aquí hay otra gran referencia con ilustraciones. Esta referencia complementa muy bien la primera con un mayor enfoque en aquellos menos familiarizados con git.Información básica para novatos como yo
Si eres como yo, y no un Git-guru, mi respuesta aquí describe cómo manejar la eliminación de archivos del seguimiento de git sin eliminarlos del sistema de archivos local, lo que parece estar mal documentado pero a menudo ocurre. Otra situación nueva es obtener el código actual , que aún logra eludirme.
Ejemplo de flujo de trabajo
Actualicé un paquete a mi sitio web y tuve que volver a mis notas para ver mi flujo de trabajo; Pensé que era útil agregar un ejemplo a esta respuesta.
Mi flujo de trabajo de comandos git:
Abajo: uso real, incluyendo explicaciones.
Nota: la salida a continuación se corta; git es bastante detallado.
Observe 3 cosas de arriba:
1) En la salida puede ver los cambios de la actualización del paquete ECC, incluida la adición de nuevos archivos.
2) Observe también que hay dos archivos (no en la
/ecc
carpeta) que eliminé independientemente de este cambio. En lugar de confundir esas eliminaciones de archivos conecc
, haré unacleanup
rama diferente más tarde para reflejar la eliminación de esos archivos.3) ¡No seguí mi flujo de trabajo! Me olvidé de git mientras intentaba que ecc volviera a funcionar.
A continuación: en lugar de hacer el todo incluido
git commit -am "updated ecc package"
que normalmente haría, solo quería agregar los archivos en la/ecc
carpeta. Esos archivos eliminados no eran específicamente parte de migit add
, pero debido a que ya estaban rastreados en git, necesito eliminarlos del commit de esta rama:Script para automatizar lo anterior
Habiendo usado este proceso más de 10 veces en un día, me dediqué a escribir scripts por lotes para ejecutar los comandos, así que hice un
git_update.sh <branch> <"commit message">
script casi adecuado para realizar los pasos anteriores. Aquí está la fuente de Gist para ese guión.En lugar de
git commit -am
seleccionar archivos de la lista "modificada" producida a través degit status
y luego pegarlos en este script. Esto sucedió porque hice docenas de ediciones pero quería varios nombres de sucursales para ayudar a agrupar los cambios.fuente
--no-ff
opción?Estrategias de fusión
Fusión explícita : crea una nueva confirmación de fusión. (Esto es lo que obtendrás si lo usaste
--no-ff
).Fusión de avance rápido : avance rápidamente, sin crear una nueva confirmación:
Rebase : establezca un nuevo nivel base:
Squash: aplastar o exprimir (algo) con fuerza para que quede plano:
fuente
La
--no-ff
opción garantiza que no se produzca una combinación de avance rápido y que siempre se creará un nuevo objeto de confirmación . Esto puede ser deseable si desea que git mantenga un historial de ramas de características. En la imagen de arriba, el lado izquierdo es un ejemplo del historial de git después de usargit merge --no-ff
y el lado derecho es un ejemplo de usogit merge
donde era posible una fusión ff.EDITAR : una versión anterior de esta imagen indicaba solo un padre principal para la confirmación de fusión. Las confirmaciones de fusión tienen varias confirmaciones primarias que git usa para mantener un historial de la "rama característica" y de la rama original. Los enlaces principales múltiples se resaltan en verde.
fuente
Esta es una vieja pregunta, y esto se menciona de manera algo sutil en las otras publicaciones, pero la explicación que hizo este clic para mí es que las fusiones no rápidas requerirán una confirmación por separado .
fuente
git merge --no-ff ecc
simplemente tendrá una confirmación de fusión adicional en elgit log
maestro de sucursal. Esto técnicamente no es necesario en caso de que master apunte a un antecesor directo del commit ecc, pero al especificar la opción --no-ff está forzando la creación de ese commit de fusión. Tendrá el título:Merge branch 'ecc'
El indicador --no-ff hace que la fusión siempre cree un nuevo objeto de confirmación, incluso si la fusión se puede realizar con un avance rápido. Esto evita perder información sobre la existencia histórica de una rama de características y agrupa todas las confirmaciones que juntas agregaron la característica
fuente