Se master
crea una nueva rama de , la llamamos test
.
Hay varios desarrolladores que se comprometen master
o crean otras ramas y luego se fusionan master
.
Digamos que el trabajo test
lleva varios días y desea mantenerse test
actualizado continuamente con los compromisos dentro master
.
Lo haría git pull origin master
desde test
.
Pregunta 1: ¿Es este el enfoque correcto? Otros desarrolladores podrían haber trabajado fácilmente en los mismos archivos que yo he trabajado por cierto.
Mi trabajo test
está terminado y estoy listo para fusionarlo nuevamente master
. Estas son las dos formas en que puedo pensar:
UNA:
git checkout test
git pull origin master
git push origin test
git checkout master
git pull origin test
SI:
git checkout test
git pull origin master
git checkout master
git merge test
No estoy usando --rebase
porque, según tengo entendido, rebase obtendrá los cambios master
y apilará los míos además de eso, podría sobrescribir los cambios que otras personas hicieron.
Pregunta 2: ¿Cuál de estos dos métodos es el correcto? ¿Cuál es la diferencia allí?
El objetivo de todo esto es mantener mi test
rama actualizada con las cosas que suceden master
y luego podría fusionarlas nuevamente con la master
esperanza de mantener la línea de tiempo lo más lineal posible.
Respuestas:
Cómo haría esto
Si tengo una sucursal local desde una remota, no me siento cómodo fusionando otras sucursales que esta con el remoto. Además, no empujaría mis cambios, hasta que esté contento con lo que quiero empujar y tampoco empujaría las cosas, que son solo para mí y mi repositorio local. En tu descripción parece, ¿eso
test
es solo para ti? Entonces no hay razón para publicarlo.git siempre trata de respetar los cambios tuyos y de los demás, y así lo hará
--rebase
. No creo que pueda explicarlo apropiadamente, así que eche un vistazo al libro de Git - Rebasando o listo para git: Introducción a rebase para una pequeña descripción. Es una característica genialfuente
git merge test
me dafatal: 'test' does not point to a commit
. Tengo que buscargit log
el punto de confirmación en la rama de prueba, volver a la rama maestra y luego hacerlogit merge 0f37d3154abbf52a4cbbbb5109f08af6a7567234
.test
debe existir. Claro, puede usar el hash commit en su lugar, pero generalmente es más fácil usar el nombre de la rama. Internamente solo recupera el hashHEAD
de la rama.Esta es una pregunta muy práctica, pero todas las respuestas anteriores no son prácticas.
Me gusta
Este enfoque tiene dos problemas :
No es seguro, porque no sabemos si hay conflictos entre la rama de prueba y la rama maestra.
"Exprimiría" todos los commits de prueba en un commit de fusión en master; es decir, en la rama maestra, no podemos ver todos los registros de cambios de la rama de prueba.
Entonces, cuando sospechamos que habría algunos conflictos, podemos tener las siguientes operaciones de git:
Pruebe
merge
antescommit
, evite un compromiso de avance rápido por--no-ff
,Si se encuentra un conflicto, podemos ejecutar
git status
para verificar los detalles sobre los conflictos e intentar resolverUna vez que resolvemos los conflictos, o si no hay conflicto, nosotros
commit
ypush
ellosPero de esta manera perderá el historial de cambios registrado en la rama de prueba, y haría que la rama maestra sea difícil para que otros desarrolladores entiendan la historia del proyecto.
Entonces, el mejor método es que tenemos que usar en
rebase
lugar demerge
(supongamos que, en este momento, hemos resuelto los conflictos de las ramas).La siguiente es una muestra simple, para operaciones avanzadas, consulte http://git-scm.com/book/en/v2/Git-Branching-Rebasing
Sí, cuando haya terminado, todas las confirmaciones de la rama de prueba se moverán a la cabeza de la rama maestra. El principal beneficio de rebase es que obtienes un historial de proyecto lineal y mucho más limpio.
Lo único que debe evitar es: nunca use
rebase
en una rama pública, como la rama maestra.Nunca haga operaciones como las siguientes:
Detalles para https://www.atlassian.com/git/tutorials/merging-vs-rebasing/the-golden-rule-of-rebasing
apéndice:
fuente
Ni un rebase ni una fusión deben sobrescribir los cambios de nadie (a menos que elija hacerlo al resolver un conflicto).
El enfoque habitual durante el desarrollo es
Cuando estés listo para fusionarte nuevamente con el maestro,
Si te preocupa romper algo en la fusión,
git merge --abort
está ahí para ti.Usar empujar y luego tirar como medio de fusión es una tontería. Tampoco estoy seguro de por qué estás empujando la prueba al origen.
fuente
git stash
.Primero haría que la rama a fusionar fuera lo más limpia posible. Ejecute sus pruebas, asegúrese de que el estado sea el que desea. Limpia los nuevos commits con git squash .
Además de la respuesta de KingCrunches , sugiero usar
Es posible que haya realizado muchas confirmaciones en la otra rama, que solo debería ser una confirmación en la rama maestra. Para mantener el historial de confirmaciones lo más limpio posible, es posible que desee aplastar todas sus confirmaciones desde la rama de prueba en una confirmación en la rama maestra (consulte también: Git: ¿Aplastar o no a aplastar? ). Luego, también puede volver a escribir el mensaje de confirmación en algo muy expresivo. Algo que es fácil de leer y comprender, sin profundizar en el código.
editar: te puede interesar
Entonces, en GitHub, termino haciendo lo siguiente para una rama de características
mybranch
:Obtén lo último del origen
Encuentra el hash base de fusión:
Ahora asegúrese de que solo el primero sea
pick
, el resto ess
:A continuación, elija un mensaje de confirmación muy bueno y empuje a GitHub. Haga la solicitud de extracción entonces.
Después de la fusión de la solicitud de extracción, puede eliminarla localmente:
y en GitHub
fuente
Hilo antiguo, pero no he encontrado mi manera de hacerlo. Puede ser valioso para alguien que trabaja con rebase y quiere fusionar todos los commits de una rama (característica) en la parte superior del master. Si hay un conflicto en el camino, puede resolverlos para cada confirmación. Mantiene el control total durante el proceso y puede abortar en cualquier momento.
Obtenga Master y Branch actualizados:
Fusionar rama encima del maestro:
Opcional: si se encuentra con conflictos durante la rebase:
Primero, resuelva el conflicto en el archivo. Entonces:
Empuje su rama rebasada:
Ahora tienes dos opciones:
Hecho.
fuente
Este es el flujo de trabajo que uso en mi trabajo con el equipo. El escenario es como lo describiste. Primero, cuando
test
termino de trabajar en Rebasar con master para obtener todo lo que se ha agregado a master durante el tiempo que he estado trabajando en latest
rama.git pull -r upstream master
Esto extraerá los cambios al maestro ya que bifurcó la
test
rama y los aplicó, y luego aplicará los cambios que ha realizado para probar "encima" del estado actual del maestro. Puede haber conflictos aquí, si las otras personas han realizado cambios en los mismos archivos que ha editado en la prueba. Si los hay, deberá corregirlos manualmente y confirmar. Una vez que haya hecho eso, será bueno cambiar a la rama maestra y fusionarsetest
sin problemas.fuente
Después de fusionar, si se cambia el archivo, cuando lo fusione se producirá un error de "Resolver conflicto"
Entonces, primero debe resolver todos sus conflictos, luego debe confirmar nuevamente todos sus cambios y luego presionar
Es mejor hacer quién ha hecho cambios en la rama de prueba, porque sabía qué cambios había hecho.
fuente
Usaría el método de rebase. Principalmente porque refleja perfectamente su caso semánticamente, es decir. lo que desea hacer es actualizar el estado de su sucursal actual y "simular" como si se basara en la última.
Entonces, sin siquiera revisar
master
, yo haría:Por supuesto, solo buscar desde el origen no actualiza el estado local de su
master
(ya que no realiza una fusión), pero está perfectamente bien para nuestro propósito: queremos evitar cambiar, en aras de ahorrar tiempo.fuente
La respuesta de @ KingCrunch debería funcionar en muchos casos. Un problema que puede surgir es que puede estar en una máquina diferente que necesita extraer lo último de la prueba. Por lo tanto, recomiendo hacer la prueba primero. La revisión se ve así:
fuente
Debe extraer la rama para extraer, ya que extraer significa fusionarse con el maestro, y necesita un árbol de trabajo para fusionarse.
No es necesario verificar primero; rebase hace lo correcto con dos argumentos
git push por defecto empuja todas las ramas que existen aquí y en el control remoto
fuente
Como el título dice "Mejor manera", creo que es una buena idea considerar la estrategia de fusión de paciencia .
De: https://git-scm.com/docs/merge-strategies
Uso:
Git Alias
Siempre uso un alias para esto, por ejemplo, ejecutar una vez:
Ahora puedes hacer:
fuente
Esto es de GitLab: solo siga las instrucciones:
fuente
Contestaré según desarrollar y presentar ramas,
si está en la rama de características y necesita actualizarlo con el desarrollo, use los siguientes comandos: git checkout desarrollo git pull git checkout característica / xyz git merge desarrollo
Ahora que su característica se actualiza con desarrollo, puede impulsar sus cambios.
fuente