Fusionar rama de desarrollo con master

764

Tengo dos ramas, a saber, mastery developmenten un repositorio de GitHub. Estoy haciendo todo mi desarrollo en la rama de desarrollo como se muestra.

git branch development
git add *
git commit -m "My initial commit message"
git push -u origin development

Ahora quiero fusionar todos los cambios en la developmentrama en el master. Mi enfoque actual es:

git checkout master 
git merge development
git push -u origin master 

Avíseme si el procedimiento que estoy siguiendo es correcto.

Pawan
fuente
77
git pull -uestablece el seguimiento ascendente para la rama (o todas las ramas si se presiona más de una). Una vez que se establece, el seguimiento persiste. No hay razón para usarlo continuamente.
David Culp

Respuestas:

1166

En general, me gusta fusionarme masteren el developmentprimero para que, si hay algún conflicto, pueda resolver en la developmentpropia sucursal y mis masterrestos estén limpios.

(on branch development)$ git merge master
(resolve any merge conflicts if there are any)
git checkout master
git merge development (there won't be any conflicts now)

No hay mucha diferencia en los dos enfoques, pero a veces me he dado cuenta de que no quiero fusionar la rama mastertodavía, después de fusionarlos, o que todavía hay más trabajo por hacer antes de que estos puedan fusionarse , así que tiendo a dejarlo masterintacto hasta el final.

EDITAR: De los comentarios

Si desea realizar un seguimiento de quién hizo la fusión y cuándo, puede usar la --no-ffbandera mientras se fusiona para hacerlo. Esto generalmente es útil solo cuando se fusiona developmentcon el master(último paso), porque es posible que deba fusionarse masteren development(primer paso) varias veces en su flujo de trabajo, y crear un nodo de confirmación para estos puede no ser muy útil.

git merge --no-ff development
Sailesh
fuente
71
Hay un pequeño inconveniente en ese enfoque: la combinación real para dominar es probablemente una combinación de avance rápido y, por lo tanto, no crea ningún nodo de confirmación. Esto no es un problema con el código real en la rama, pero hace que sea difícil averiguar más tarde, quién hizo la fusión real para dominar y en qué momento. Se --no-ffnecesita un explícito a la fusión para dominar para arreglar eso.
michas
11
Sí, eso es exactamente para lo que --no-ffsirve. :)
michas
19
Eso es git merge --no-ff developmentsolo para corregir el uso de @ elect.
jewbix.cube
2
@sailesh, ¿puede actualizar su respuesta para incluir el indicador git merge, si está de acuerdo con los comentarios?
Usuario web
2
@Mars, la fusión anulará un archivo si el cambio anterior era anterior a la confirmación. Por ejemplo, deja de A->B->Cser maestro, y A->X->Yes tu rama de desarrollo. Si cambia parte de un archivo en el Xque podría haber tenido conflictos con un cambio A, no será un conflicto, porque Aes un antepasado de X. Con respecto a los cambios perdidos, consulte stackoverflow.com/questions/7147680/… para recuperar cualquier cambio.
Sailesh
103

Personalmente, mi enfoque es similar al tuyo, con algunas ramas más y algunos aplastamientos de confirmaciones cuando vuelven a dominar.

A uno de mis compañeros de trabajo no le gusta tener que cambiar tanto de rama y se queda en la rama de desarrollo con algo similar a lo siguiente, todo ejecutado desde la rama de desarrollo.

git fetch origin master

git merge master

git push origin development:master

La primera línea se asegura de que tenga todos los commits ascendentes que se hayan realizado para dominar desde la última vez que actualizó su repositorio local.

El segundo extrae esos cambios (si los hay) del maestro al desarrollo

El tercero empuja la rama de desarrollo (ahora completamente fusionada con master) hasta origin / master.

Puede que su flujo de trabajo básico esté un poco mal, pero esa es la esencia principal.

David Culp
fuente
¡Gracias! Esto para mí tiene un sentido más intuitivo.
Jamie Nicholl-Shelley
2
Sí, en los más de 6 años desde que escribí esto, yo también lo he adoptado, aunque con la rebaseactualización de la devrama en lugar de merge.
David Culp
32

Explicación desde abajo para los que vinieron aquí sin ningún conocimiento de ramas.

La lógica básica de desarrollo de la rama maestra es: Usted trabaja solo en otras ramas y usa la maestra solo para fusionar otras ramas.

Comienza a crear una nueva sucursal de esta manera:

1) Clone el repositorio en su directorio local (o cree un nuevo repositorio):

$ cd /var/www
$ git clone [email protected]:user_name/repository_name.git

2) Crear una nueva sucursal. Contendrá los últimos archivos de su repositorio de sucursal maestra

$ git branch new_branch

3) Cambia tu rama git actual a new_branch

$ git checkout new_branch

4) Hacer codificación, confirmaciones, como de costumbre ...

$ git add .
$ git commit -m “Initial commit”
$ git push (pushes commits only to “new_branch”)

5) Cuando finalice el trabajo en esta rama, combine con la rama "maestra":

$ git merge master
$ git checkout master (goes to master branch)
$ git merge development (merges files in localhost. Master shouldn’t have any  commits ahead, otherwise there will be a need for pull and merging code by hands!)
$ git push (pushes all “new_branch” commits to both branches - “master” and “new_branch”)

Actualización: recomiendo usar GitKraken para esto para ver el árbol visual de cambios y ver mejor toda la lógica y confirmaciones.

Gediminas
fuente
Me gustó tu enfoque de no trabajar en master. pero hoy cuando jugaba con gitflow, creé una releaserama de nuestra develop. Luego agregó un archivo de nota de lanzamiento y se comprometió. Luego terminó el lanzamiento que se fusiona con ambos master/develop. pero mi rama maestra solo tenía una nota de lanzamiento recién agregada. no se actualizaron otros archivos durante las confirmaciones de desarrollo anteriores.
Amit Shah
Si trabaja en otra rama que no sea master, asegúrese de haber comprometido y enviado los cambios a esa rama. Luego puede ver cómo se ven los archivos en la interfaz gráfica de github.com o bitbucket.com e intente hacer clic en Combinar allí, en el sitio web. Debería actualizar todo, desde su sucursal hasta el maestro. Si el maestro tiene archivos más nuevos, debería ser un conflicto y recibirá el mensaje de error. No estoy seguro de haber respondido lo suficientemente bien, por favor dame un mensaje si no :)
Gediminas
Estoy usando sourcetree como GUI y repositorio github. Lo intenté 2 veces con la prueba de lanzamiento. el maestro nunca se actualizó con la última rama de desarrollo.
Amit Shah
intente utilizar en el sitio web live github.com los archivos de su sucursal en la que está trabajando. ¿Son empujados? En caso afirmativo, intente hacer clic en la misma rama: Combinar y verá lo que sucede. En mi experiencia personal con SourceTree es bastante malo - yo no era capaz de entender completamente lo que está sucediendo en mis ramas demasiado
Gediminas
Gracias @Gediminas por una explicación detallada. Estaba confundido con las palabras clave git antes de leer su respuesta .. :)
Dinesh Suthar
21

Sería genial si puedes usar el flujo de trabajo de Git Flow . Se puede fusionar desarrollar rama en maestro fácilmente.

Lo que quieres hacer es seguir las instrucciones de git-flow mencionadas aquí:

PASOS:

  • configurar el proyecto git-flow
  • crear ramas y fusionar todo para desarrollar
  • ejecuta el comando git flow release start <version_number>
  • luego proporcione un mensaje significativo para el lanzamiento
  • ejecuta el comando git flow release finish <version_number>
  • fusionará todo en maestro y cambiará la rama a maestro .
  • ejecute el comando git pushpara publicar los cambios en el maestro remoto .

Para obtener más información, visite la página: http://danielkummer.github.io/git-flow-cheatsheet/

Harsha
fuente
1
¡La solución si alguien usa git flow!
Csaba Toth
21
1. //pull the latest changes of current development branch if any        
git pull (current development branch)

2. //switch to master branch
git checkout master 

3. //pull all the changes if any
git pull

4. //Now merge development into master    
git merge development

5. //push the master branch
git push origin master
Rizwan Siddiquee
fuente
9

Sí, esto es correcto, pero parece un flujo de trabajo muy básico, donde solo está almacenando los cambios antes de que estén listos para la integración. Debería buscar flujos de trabajo más avanzados que git admita. Puede que te guste el enfoque de rama temática , que le permite trabajar en múltiples funciones en paralelo, o el enfoque de graduación que extiende un poco su flujo de trabajo actual.

Sergiu Dumitriu
fuente
6

Si está en Mac o Ubuntu, vaya a la carpeta de trabajo de la sucursal. En la terminal

supongamos que harisdev es el nombre de la sucursal.

git checkout master

si hay archivos no rastreados o no confirmados, recibirá un error y deberá confirmar o eliminar todos los archivos no rastreados o no confirmados.

git merge harisdev 

git push origin master

Un último comando para eliminar la rama.

$ git branch -d harisdev
Haris Np
fuente
¿Qué es aquí específico para Mac o Ubuntu?
talonx
Lo siento. Ninguna de las otras respuestas mencionó que los comandos se deben dar en la Terminal y el comando para eliminar la rama. En realidad, solo quería agregar el comando para eliminar la rama para que el desarrollador no se meta con la misma rama en el futuro. Estoy usando Mac, así que lo mencioné. Su pregunta es válida y ninguno de estos comandos es específico para Mac o Ubuntu.
Haris Np
Gracias por aclararlo.
talonx
5

Paso 1

Cree y cambie a una nueva rama "dev", donde sus archivos git locales estén sincronizados con el remoto pero la rama "dev" aún no existe.

git branch dev # create
git checkout dev # switch
# No need to git add or git commit, the current
# branch's files will be cloned to the new branch by-default.
git push --set-upstream origin dev # push the "dev" branch to the remote.

Paso 2

Realice los cambios en la rama "dev" (su actual si sigue el paso 1), confirme y empújelos a la rama remota "dev".

git add .
git commit -S -m "my first commit to the dev branch" # remove the -S if you're not "secure", secure = when you already setup crypto private and public keys (i.e "verified" green sign in github)
git push -u origin dev # push the changes to the remote, -u origin dev is optional but good to use.

Paso 3

Combina tu rama "dev" en el "maestro".

git checkout dev # switch to "dev" branch if you're not already.
git merge master # optionally, this command is being used to resolve any conflicts if you pushed any changes to your "master" but "dev" doesn't have that commit.
git checkout master # switch to "master", which is the branch you want to be merged.
git merge --no-ff dev # merge the "dev" branch into the "master" one.
kataras
fuente
4

Así es como lo hago habitualmente. Primero, asegúrese de estar listo para fusionar sus cambios en master.

  1. Compruebe si el desarrollo está actualizado con los últimos cambios desde su servidor remoto con un git fetch
  2. Una vez que se completa la búsqueda git checkout master.
  3. Asegúrese de que la rama maestra tenga las últimas actualizaciones ejecutando git pull
  4. Una vez que se hayan completado los preparativos, puede comenzar la fusión con git merge development
  5. Empuje los cambios con git push -u origin mastery ya está.

Puede encontrar más información sobre la fusión de git en el artículo.

Nesha Zoric
fuente
3

1) En el desarrollo de la sucursal, verifique el estado de git usando el siguiente comando:

git status

No debe haber código no confirmado. Si es así, inserte su código en la rama Desarrollo:

git add *

git commit -m "My initial commit message"

git push origin Development

2) En la rama Desarrollo, ejecute los siguientes dos comandos:

git branch -f master HEAD

git push -f origin master

Empujará su código de sucursal de Desarrollo a la sucursal maestra.

Himanshu Mahajan
fuente
¿Esto empuja todos los compromisos de desarrollo al maestro también, o simplemente agrega un nuevo compromiso único al maestro?
lanza el
1
¿Cómo funciona esto realmente? específicamente "git branch master" cuando estás en el desarrollo parece una locura. ¿Cómo puedes crear una nueva rama llamada master, si ya hay una rama llamada master? los documentos dicen que -f hace esto: restablece <nombre de rama> a <punto de inicio>. ¿Qué significa esto?
John Little
¿No está esta fuerza empujando al maestro local al maestro remoto? Esto parece una mala idea si estás trabajando en equipo.
Nick
-fno es recomendado.
DawnSong el
2

Basado en @Sailesh y @DavidCulp:

(on branch development)
$ git fetch origin master
$ git merge FETCH_HEAD
(resolve any merge conflicts if there are any)
$ git checkout master
$ git merge --no-ff development (there won't be any conflicts now)

El primer comando se asegurará de que todas las confirmaciones ascendentes se realicen en el maestro remoto, con una respuesta de Sailesh que no sucedería.

El segundo realizará una fusión y creará conflictos que luego podrá resolver.

Después de hacerlo, finalmente puede finalizar la compra de master para cambiar a master.

Luego, fusiona la rama de desarrollo con el maestro local. El indicador no-ff creará un nodo de confirmación en maestro para que se pueda rastrear toda la fusión.

Después de eso, puede comprometerse y empujar su fusión.

Este procedimiento asegurará que haya un compromiso de fusión de desarrollo a maestro que las personas puedan ver, luego, si miran la rama de desarrollo, pueden ver los compromisos individuales que ha realizado a esa rama durante su desarrollo.

Opcionalmente, puede modificar su confirmación de fusión antes de presionarla, si desea agregar un resumen de lo que se hizo en la rama de desarrollo.

EDITAR: mi respuesta original sugirió una git merge masterque no hizo nada, es mejor hacerlo git merge FETCH_HEADdespués de buscar el origen / maestro

Cisco
fuente
2

Una vez que 'pagas' la rama de desarrollo, ...

 git add .
 git commit -m "first commit"
 git push origin dev
 git merge master

 git checkout master 
 git merge dev
 git push origin master 
Tiago Medici
fuente
1

Si está utilizando gerrit, los siguientes comandos funcionan perfectamente.

git checkout master
git merge --no-ff development

Puede guardar con el mensaje de confirmación predeterminado. Asegúrese de que se haya generado el ID de cambio. Puede usar el siguiente comando para asegurarse.

git commit --amend

Luego presione con el siguiente comando.

git push origin HEAD:refs/for/refs/heads/master

Puede encontrar un mensaje de error como el siguiente.

! [remote rejected] HEAD -> refs/for/refs/heads/master (you are not allowed to upload merges)

Para resolver esto, el administrador del proyecto gerrit tiene que crear otra referencia en gerrit llamada 'refs / for / refs / heads / master' o 'refs / for / refs / heads / *' (que cubrirá todas las ramas en el futuro). A continuación, otorgue el permiso 'Push Merge Commit' a esta referencia y el permiso 'Enviar' si es necesario para enviar el GCR.

Ahora, intente nuevamente el comando push anterior, y debería funcionar.

Créditos

https://github.com/ReviewAssistant/reviewassistant/wiki/Merging-branches-in-Gerrit

https://stackoverflow.com/a/21199818/3877642

Sankaran Srinivasan
fuente
1

Creo que la solución más fácil sería

git checkout master
git remote update
git merge origin/Develop -X theirs
git commit -m commit -m "New release"
git push --recurse-submodules=check --progress "origin" refs/heads/Master

Esto también conserva el historial de todas las ramas en uso.

Vishal
fuente
-4
1. //push the latest changes of current development branch if any        
git push (current development branch)

2. //switch to master branch
git checkout master 

3. //pull all the changes if any from (current development branch)
git pull origin (current development branch)

4. //Now merge development into master    
git merge development

5. //push the master branch
git push origin master

Error
To https://github.com/rajputankit22/todos-posts.git
 ! [rejected]        master -> master (fetch first)
error: failed to push some refs to 'https://github.com/rajputankit22/todos-posts.git'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

Then Use 
5. //push the master branch forcefully
git push -f origin master
Ankit Kumar Rajpoot
fuente
1
Forzar la presión cuando ve que ese error casi nunca es lo correcto, a menos que esté muy seguro de saber por qué a su rama local le faltan confirmaciones de la rama remota. En general, es mucho mejor volver al paso 3 y pullnuevamente. Además, no está claro qué valor agrega esta respuesta en comparación con las respuestas existentes.
Kyle Strand