"Git pull" o "git merge" entre las ramas maestra y de desarrollo


243

Tengo mi mastersucursal y una developsucursal para trabajar en algunos cambios. Necesito fusionar los cambios desde masterdentro develop, pero eventualmente fusionaré todo desde developdentro master. Tengo dos flujos de trabajo diferentes en mente:

  1. git pull origin masteren developrama
  2. git merge masteren developrama

¿Cuál es la mejor manera de hacer esto y por qué?



2
git pull= git fetch+git merge FETCH_HEAD
Yousha Aleayoub

Respuestas:


104

Ten cuidado con rebase. Si está compartiendo su rama de desarrollo con alguien, rebase puede hacer un desastre. Rebase es bueno solo para sus propias sucursales locales.

Como regla general, si ha empujado la rama al origen, no use rebase. En su lugar, use merge.


Sin embargo, ¿es seguro rebase y un git push origin rebasedBranch --forcerepositorio privado? El único usuario soy yo.
k0pernikus

Sí, si eres el único usuario, por supuesto, es seguro. Uso git push --force todo el tiempo cuando soy el único usuario. :)
Tyler Rick

3
Me hago eco de la advertencia de Eric. Sin embargo, también está perfectamente bien cambiar la base de su propia rama remota. Juegue con rebase y fusión y comprenderá los pros y los contras de cada uno y aprenderá cuándo usarlos.
Ian Lotinsky

Buen artículo sobre el uso de rebase, incluso fusionándose después de resolver conflictos: github.com/everpix/Everpix-Intelligence
Ian Lotinsky

@IanLotinsky su enlace no apunta a un artículo sobre rebase. Tiro largo, pero ¿todavía tienes el enlace correcto? :)
Daniel Serodio

347

Este flujo de trabajo funciona mejor para mí:

git checkout -b develop

... hacer algunos cambios ...

... aviso maestro ha sido actualizado ...

... cometer cambios para desarrollar ...

git checkout master
git pull

... traer esos cambios nuevamente al desarrollo ...

git checkout develop
git rebase master

... hacer algunos cambios más ...

... comprometerlos a desarrollar ...

... fusionarlos en maestro ...

git checkout master
git pull
git merge develop

2
Así es como yo también trabajo, y creo que funciona bien. Sin embargo, hay una cosa que no hago, y es git pulljusto antes de la final git merge develop. ¿Cuál es el propósito de eso?
crdx

Después de que ... el maestro de avisos se haya actualizado ..., ¿no eliminaría el maestro de pago sus cambios locales para desarrollarlos si no los confirma?
a1an

1
@ a1an No, pero si no los confirma, los cambios se moverán a la rama maestra y git no le permitirá retirarlos hasta que se hayan confirmado.
elemjay19

55
@crdx Lo más probable es que otras ramas se fusionen con el maestro remoto antes de que combine su rama con su maestro local. Usted tira y trae cambios maestros remotos a su copia local del maestro. Así es como lo entendí.
Tarun

12
git pull --rebase origin masteren su rama de desarrollo es un poco más rápido.
Nathan Lilienthal

24

El mejor enfoque para este tipo de cosas es probablemente git rebase. Le permite extraer cambios del maestro en su rama de desarrollo, pero dejar todo su trabajo de desarrollo "encima" (más adelante en el registro de confirmación) del material del maestro. Cuando se completa su nuevo trabajo, la fusión de nuevo al maestro es muy sencilla.


10
Un buen consejo, suponiendo developque no se comparta con nadie más.
Karl Bielefeldt

1
@KarlBielefeldt Si develop se comparte con otros contribuyentes, ¿cómo actualizaríamos developcuando se introdujeran directamente algunas revisiones master? ¿Deberíamos hacer una fusión, es decir git checkout master && git pull --rebase && git checkout develop && git merge master? Dejé un comentario sobre la respuesta más votada arriba, que también detalla esta preocupación.
modulitos

5

Si no está compartiendo la sucursal de desarrollo con nadie, entonces simplemente la cambiaría cada vez que se actualice master, de esa manera no tendrá compromisos de fusión en toda su historia una vez que fusione el desarrollo en maestro. El flujo de trabajo en este caso sería el siguiente:

> git clone git://<remote_repo_path>/ <local_repo>
> cd <local_repo>
> git checkout -b develop
....do a lot of work on develop
....do all the commits
> git pull origin master
> git rebase master develop

Los pasos anteriores asegurarán que su rama de desarrollo estará siempre al tanto de los últimos cambios de la rama maestra. Una vez que haya terminado con la rama de desarrollo y se haya modificado con los últimos cambios en el maestro, puede fusionarlo nuevamente:

> git checkout -b master
> git merge develop
> git branch -d develop

1

mi regla de oro es:

rebasepara ramas con el mismo nombre , de lo mergecontrario.

ejemplos para los mismos nombres serían master, origin/mastery otherRemote/master.

si developexiste solo en el repositorio local y siempre se basa en una origin/masterconfirmación reciente , debe llamarlo mastery trabajar allí directamente. simplifica tu vida y presenta las cosas como realmente son: estás desarrollándote directamente en la masterrama.

si developse comparte, no debe volver a basarse en él master, solo fusionarse con él --no-ff. está desarrollando en develop. mastery developtienen nombres diferentes, porque queremos que sean cosas diferentes y que se mantengan separadas. no los hagas igual con rebase.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.