En un intento por lograr git nirvana, me paso el día aprendiendo cómo aprovechar el rebase para situaciones en las que actualmente me fusiono.
Al ejecutar lo que considero un flujo de git 101 (que deletreo a continuación), tengo que hacerlo push --force
cuando empujo mis cambios al origen.
No soy el único, sé que este es un terreno cubierto (ver 1 , 2 , 3 , 4 , 5 ) y entiendo las razones técnicas por las que es necesaria una fuerza. Mi problema es este: hay muchas (muchas) entradas de blog que alaban a rebase y cómo ha cambiado sus vidas (ver 1 , 2 , 3 , 4 para enumerar algunas), pero ninguna de ellas menciona que push --force
es parte de su flujo. Sin embargo, casi todas las respuestas a las preguntas de stackoverflow existentes dicen cosas como "sí, si vas a rebasar, debes usar push --force
".
Dado el número y la religiosidad de los defensores del rebase, tengo que creer que usar 'empujar - fuerza' no es una parte inherente de un flujo de rebase, y que si uno a menudo tiene que forzar sus empujes, está haciendo algo mal .
push --force
es algo malo .
Así que aquí está mi flujo. ¿De qué manera podría lograr los mismos resultados sin una fuerza?
Ejemplo simple
Dos ramas:
- v1.0 - una rama de lanzamiento, contiene solo parches
- master : todo para la próxima versión principal.
Tengo algunas confirmaciones de parches y algunas confirmaciones para la próxima versión.
Me gustaría incorporar los parches a mi master para que no se pierdan para el próximo lanzamiento. Pre-iluminación Yo simplemente:
git checkout master
git merge v1.0
Pero ahora lo estoy intentando
git checkout master
git rebase v1.0
Así que ahora estoy aquí:
Tiempo para:
git push
No dados.
fuente
@CodeGnome tiene razón. No debe rebasar el maestro en la rama v1.0 sino la rama v1.0 en el maestro, eso hará toda la diferencia.
Cree una nueva rama que apunte a v1.0, mueva esa nueva rama encima de la maestra y luego integre la nueva versión de los parches de la V1.0 a la rama maestra. Terminarás con algo como:
Esta forma de usar rebase es recomendada por la documentación oficial de git .
Creo que tienes razón
git push --force
: solo debes usarlo si cometiste un error y presionaste algo que no querías.fuente
master
y no nos importa fusionar la rama de características en sí, esto se puede hacer con:git checkout my-branch; git rebase master; git checkout master; git merge my-branch
Tienes que forzar el empuje si vuelves a basar, y ya has publicado tus cambios, ¿verdad?
Utilizo rebase mucho, pero publico en algo privado donde un impulso forzado no importa (por ejemplo: mi propio clon en GitHub, como parte de una solicitud de extracción), o realizo un cambio de base antes de presionar por primera vez.
Este es el corazón del flujo de trabajo donde usa rebase, pero no fuerce el empuje mucho: no publique cosas hasta que estén listas, no rebase después de empujar.
fuente
rebase
extrajo cambios en su rama de tema, pero cuando haya completado los cambios demerge
esa rama, regresará a la rama de desarrollo principal.Creo que hay un buen caso de uso para este patrón de rebase-luego-force-push que no es el resultado de un empujón equivocado: trabajar en una rama de función usted mismo desde múltiples ubicaciones (computadoras). Hago esto a menudo, ya que a veces trabajo en la oficina en mi escritorio y, a veces, desde mi casa / sitio del cliente en mi computadora portátil. Necesito reajustar ocasionalmente para mantenerme al día con la rama principal y / o hacer fusiones más limpias, pero también necesito forzar cuando dejo una máquina para ir a trabajar en otra (donde solo tiro). Funciona a las mil maravillas, siempre que sea el único que trabaje en la sucursal.
fuente
Esto es lo que uso (asumiendo que el nombre de su rama es foobar ):
fuente
git
no está exento de personalidadgit merge -s ours origin/<branch>
fue lo que nos arreglótl; dr fusionar con ramas compartidas, rebase con ramas individuales.
--force-with-lease
es una alternativa más segura a la fuerza y debería ayudarlo a lograr dicho nirvana git sin la naturaleza destructiva de la fuerza.Una regla general que he visto que funciona para los flujos de trabajo de varios equipos es usarla
merge
para ramas compartidas (es decir, master o desarrollar) y usarlarebase
cuando se trabaja en su propia rama de funciones. Este es un ciclo de vida típico de una rama de característicasUna versión en inglés simple de lo que hemos hecho aquí:
force-with-lease
El cuarto paso es REALMENTE importante y una de las principales razones por las que comencé a abogar por el uso de rebase.
force-with-lease
comprueba el control remoto para ver si se han agregado nuevas confirmaciones. Sigit push
se demostró que es destructivo, ¡no presionará!Espero que esto le dé a alguien más confianza para usar rebase.
fuente