Cómo combinar maestro remoto a sucursal local

238

Tengo una rama local de un proyecto ("configUpdate") que he bifurcado del proyecto de otra persona y he realizado una gran cantidad de cambios y me gustaría fusionar los cambios que han realizado en mi rama local.

He intentado

git pull --rebase origin configUpdate

pero no ha captado los últimos cambios, ¿cómo puedo fusionar los dos? (también para puntos de bonificación, ¿qué hice con el pull --rebasecomando?)

Martyn
fuente
Posible duplicado de Git: fusionar una rama remota localmente
Michael Freidgeim

Respuestas:

354

Desde su rama de características (por ejemplo configUpdate) ejecute:

git fetch
git rebase origin/master

O la forma más corta:

git pull --rebase

Por qué esto funciona:

  • git merge branchnametoma nuevas confirmaciones de la rama branchnamey las agrega a la rama actual. Si es necesario, agrega automáticamente una confirmación "Fusionar" en la parte superior.

  • git rebase branchnametoma nuevas confirmaciones de la rama branchnamey las inserta "debajo" de sus cambios. Más precisamente, modifica el historial de la rama actual de modo que se base en la punta de branchname, con cualquier cambio que haya realizado además de eso.

  • git pulles básicamente lo mismo que git fetch; git merge origin/master.

  • git pull --rebasees básicamente lo mismo que git fetch; git rebase origin/master.

Entonces, ¿por qué quieres usar en git pull --rebaselugar de git pull? Aquí hay un ejemplo simple:

  • Empiezas a trabajar en una nueva característica.

  • Para cuando esté listo para impulsar sus cambios, otros desarrolladores han impulsado varias confirmaciones.

  • Si usted git pull(que usa la combinación), sus cambios serán enterrados por las nuevas confirmaciones, además de una confirmación de fusión creada automáticamente.

  • Si en su git pull --rebaselugar, git adelantará su maestro a los de arriba, luego aplicará sus cambios en la parte superior.

Joey Adams
fuente
Hice esto en la rama correcta pero aún puedo ver diferencias entre mis archivos locales y la rama maestra remota del proyecto original (¡aunque dice que todo está actualizado!) ¿Tal vez he configurado el proyecto incorrectamente? ¿Alguna forma de verificar?
Martyn
1
@ Martin: Las diferencias deberían ser sus cambios locales. Haga otra bifurcación de la rama remota y verifique si esa tiene el contenido de archivo correcto.
ZeissS
44
Sé que esta es una respuesta antigua, pero tenga en cuenta que puede preferir hacer una FUSIÓN en lugar de una rebase. No desea hacer un cambio de base si más tarde tendrá que fusionarse con un repositorio remoto que ya tiene algunos de sus cambios.
Domino
1
¿Qué tal (suponiendo que esté actualmente en la rama configUpdate) ... git pull es básicamente lo mismo que git fetch; git merge origin / master. <- NO ES VERDADERO
Chris
@ Chris: ¿En qué sentido no es cierto? La suposición de origen / maestro como la corriente arriba? ¿O ha cambiado git pull?
Joey Adams
81

Descubrí que era:

$ git fetch upstream
$ git merge upstream/master
Martyn
fuente
66
Entonces, si aún no lo resolvió, pull --rebaseno funcionó porque originestaba apuntando a su tenedor. Hubiera funcionado si lo hicieras git pull --rebase upstream/master.
Karl Bielefeldt
3
Prueba: git merge origin / master
Chris
Me faltaba una búsqueda, esta respuesta me lo resolvió.
nurettin
39

Cambie a su sucursal local

> git checkout configUpdate

Fusiona master remoto con tu sucursal

> git rebase master configUpdate

En caso de que tenga algún conflicto, corríjalo y para cada archivo en conflicto ejecute el comando

> git add [path_to_file / conflictted_file] (por ejemplo, git add app / assets / javascripts / test.js)

Continuar rebase

> git rebase - continuar

Serge Seletskyy
fuente
no tengas miedo de usar rebase en lugar de fusionar, pasa un tiempo investigando la diferencia si sientes la brecha en estas preguntas
Serge Seletskyy
13

git rebase no parecía funcionar para mí. Después de git rebase, cuando trato de enviar cambios a mi sucursal local, recibí un error ("pista: las actualizaciones fueron rechazadas porque la punta de su sucursal actual está detrás de su contraparte remota. Integre los cambios remotos (por ejemplo, 'git pull. .. ') antes de presionar nuevamente. ") incluso después de git pull. Lo que finalmente funcionó para mí fue git merge.

git checkout <local_branch>
git merge <master> 

Si eres un principiante como yo, aquí hay un buen artículo sobre git merge vs git rebase. https://www.atlassian.com/git/tutorials/merging-vs-rebasing

AJC
fuente