Obtenga cambios de maestro a rama en Git

689

En mi repositorio tengo una rama llamada en la aqque estoy trabajando.

Luego cometí nuevos trabajos y errores master.

¿Cuál es la mejor manera de llevar esos commits a la aqsucursal? ¿Crear otra nueva rama mastery fusionarla con aq?

Slee
fuente
3
En el futuro, también podría comenzar su rama de corrección de errores de un ancestro común de ramas maestras y otras que necesitarán las correcciones, para que pueda fusionarlas en todas esas ramas, sin recoger nada más.
Cascabel
2
@Jefromi, pero eso está fuera de su control si no es la única persona que trabaja en el proyecto. otras personas actualizan el maestro. Demonios, usted mismo puede actualizar el maestro desde una tercera rama, y ​​la situación sería inevitable y necesitaría una solución general.
ahnbizcad
@ahnbizcad Estoy bastante seguro de que tiene el control de dónde comienza su propia sucursal. Si su rama es un ancestro común de aquellos en los que querrá fusionarse, y la gente posteriormente agrega a esas ramas, seguirá siendo un ancestro común.
Cascabel
chicos preguntan, ¿este comando lo hace?git pull origin my_branch_name
Basheer AL-MOMANI

Respuestas:

794

Echa un vistazo a la aqrama y rebase de master.

git checkout aq
git rebase master
Douglas F Shearer
fuente
puede rebase venir de cualquier otra rama? Es decir. git rebase otherbranch? Parece que estaba un poco fuera de lugar en mi pregunta, me bifurqué de una rama y luego hice cambios en la rama original.
Slee
2
Si estoy en lo cierto, vuelva a redactar en la solicitud de extracción para que muestre todos los commits maestros. Si usa el maestro de fusión / origen, todos los commits maestros se mostrarán como 1 commit, lo que facilita la revisión del código.
Usuario de Foo Bar
44
A veces, git mergesería mejor. Si ambas ramas evolucionaron con el tiempo, debe considerar cuál es el mejor para usted.
erick2red
70
Tarde a la fiesta, pero esta es una gran visión general de cuándo hacer un rebase contra unir: atlassian.com/git/tutorials/merging-vs-rebasing/…
ebuat3989
77
Si sus confirmaciones anteriores en la rama aq son públicas, no haga rebase. atlassian.com/git/tutorials/rewriting-history/git-rebase
Hanmant
301

Debería poder hacerlo solo git merge origin/mastercuando esté en su sucursal aq.

git checkout aq
git merge origin/master
Chris Kooken
fuente
55
Si rebase es "mejor" depende completamente de la situación específica.
Bombe
13
¿por qué no llamas simplemente "git merge master" en lugar de "git merge origin / master"?
Michael Küller
145
Úselo rebasesi su sucursal es local y no ha sido presionada origin. Úselo mergesi su rama ya está presionada. rebasereescribirá la historia.
garbagecollector
17
@Toskan puede encontrarse con problemas donde su maestro local no está actualizado con el control remoto. De esta manera, se asegura de que se está fusionando en la copia remota del código.
Chris Kooken
8
@garbagecollector Estoy en contra de rebase (puedo, pero no rebase) No veo ninguna razón para apostar con rebase. Simplemente hace que las cosas sean innecesariamente complejas. Siempre tienes la pregunta "¿Empujé esto al control remoto?" reflexionar y es un dolor explicar a los recién llegados. Algunas personas dicen que evita los compromisos de fusión. Pero quiero tener commits de fusión. No son desorden, documentan cuándo se fusionan las ramas. Entonces, por última vez, ¿podemos finalmente dejar de actuar como si todos nos comprometiéramos a dominar? Si no le gusta tanto las confirmaciones de fusión en el registro, simplemente filtre con --no-merges.
nurettin
92

Primero echa un vistazo a master:

git checkout master

Haz todos los cambios, revisa y confirma y empuja a tu maestro.

Regrese a su rama, 'aq', y combine master en ella:

git checkout aq
git merge master

Su sucursal estará actualizada con master. Un buen y básico ejemplo de fusión es 3.2 Git Branching - Ramificación y fusión básica .

Hrishikesh Mishra
fuente
25

No hay garantía de que las correcciones de errores maestros no estén entre otras confirmaciones, por lo tanto, no puede simplemente fusionarse. Hacer

git checkout aq
git cherry-pick commit1
git cherry-pick commit2
git cherry-pick commit3
...

asumiendo que esas confirmaciones representan las correcciones de errores.

Sin embargo, a partir de ahora, mantenga las correcciones de errores en una rama separada. Podrás simplemente

git merge hotfixes

cuando quieras pasarlos todos a la rama de desarrollo regular.

Adam Dymitruk
fuente
17

O bien cherry-picklos commits relevantes en branch aqo fusionan branch masteren branch aq.

Alan Haggai Alavi
fuente
55
@Slee, te respondiste a ti mismo ... no es la solución para esta situación
mtet88
13

Fusionarlo con aq

git checkout master
git pull
git checkout aq
git merge --no-ff master
git push
alditis
fuente
8

Camino fácil

# 1. Create a new remote branch A base on last master
# 2. Checkout A
# 3. Merge aq to A
Alen Lee
fuente
7

Para mí, ya tenía cambios y quería lo último de la rama base. No pude hacerlo rebase, y me cherry-pickhubiera llevado una eternidad, así que hice lo siguiente:

git fetch origin <base branch name>  
git merge FETCH_HEAD

entonces en este caso:

git fetch origin master  
git merge FETCH_HEAD
Pete B.
fuente
7

Esto ( desde aquí ) funcionó para mí:

git checkout aq
git pull origin master
...
git push

Citando:

git pull origin masterrecupera y combina el contenido de la rama maestra con su rama y crea una confirmación de fusión. Si hay conflictos de fusión, se le notificará en esta etapa y debe resolver los compromisos de fusión antes de continuar . Cuando esté listo para enviar sus confirmaciones locales, incluida su nueva confirmación de fusión, al servidor remoto, ejecute git push.

estellezg
fuente
Es importante tener en cuenta que esta solución es perfecta si se requiere específicamente una fusión , es decir, si la rama maestra no puede ser modificada por alguna razón.
cudacoder
3

Usted tiene un par de opciones. git rebase master aqen la rama que mantendrá los nombres de confirmación, pero NO REEMBOLSAR si se trata de una rama remota. Puede git merge master aqhacerlo si no le importa mantener los nombres de confirmación. Si desea mantener los nombres de confirmación y es una rama remota, git cherry-pick <commit hash>las confirmaciones en su rama.

Dan McNamara
fuente
0

También puede hacerlo ejecutando una sola línea.
git merge aq master

Esto es equivalente a

git checkout aq
git merge master
prafi
fuente
Esto no está haciendo lo que crees que está haciendo. git merge a bfusiona ramas ay ben la rama actual. Pero git merge acuando esté en la sucursal ano hará nada (por eso parece que está haciendo lo que cree que está haciendo). (Ver git-scm.com/docs/git-merge#Documentation/… .)
MikeBeaton
0

EDITAR:

Mi respuesta a continuación documenta una forma de fusión masteren aqdonde si ver los detalles de la fusión que enumera los cambios realizados en aqantes de la fusión, no los cambios realizados en master. Me he dado cuenta de que probablemente eso no sea lo que quieres, ¡incluso si crees que lo es!

Sólo:

git checkout aq
git merge master

está bien.

Sí, esta combinación simple mostrará que los cambios masterse realizaron aqen ese punto, no al revés; pero eso está bien, ¡ya que eso es lo que sucedió! Más tarde, cuando finalmente fusiona su rama master, es cuando una fusión finalmente mostrará todos sus cambios realizados master(que es exactamente lo que desea, y es el compromiso donde la gente esperará encontrar esa información de todos modos).

Lo he verificado y el enfoque a continuación también muestra exactamente los mismos cambios (todos los cambios realizados aqdesde la división original entre aqy master) que el enfoque normal anterior, cuando finalmente fusiona todo de nuevo master. Por lo tanto, creo que su única desventaja real (además de ser demasiado complejo y no estándar ...: - /) es que si revierte los cambios recientes git reset --hard HEAD~<n>y esto va más allá de la fusión, entonces la versión a continuación retrocede. rama 'incorrecta', que debe arreglar a mano (por ejemplo, con git reflog& git reset --hard [sha]).


[Entonces, lo que antes pensaba era que:]

Hay un problema con:

git checkout aq
git merge master

porque los cambios que se muestran en la confirmación de fusión (por ejemplo, si mira ahora o más tarde en Github, Bitbucket o su visor de historial de git local favorito) son los cambios realizados en master, que bien pueden no ser lo que desea.

Por otra parte

git checkout master
git merge aq

muestra los cambios realizados en aq, que probablemente es lo que desea. (¡O, al menos, a menudo es lo que quiero!) ¡Pero la combinación que muestra los cambios correctos está en la rama incorrecta!

¡¿Como hacer frente?!

El proceso completo, que termina con una confirmación de fusión que muestra los cambios realizados en aq (según la segunda fusión anterior), pero con la fusión que afecta a la rama aq, es:

git checkout master
git merge aq
git checkout aq
git merge master
git checkout master
git reset --hard HEAD~1
git checkout aq

Esto: combina aq en master, avanza rápidamente esa misma combinación en aq, lo deshace en master y lo vuelve a poner en aq nuevamente.

Siento que me estoy perdiendo algo, esto parece ser algo que obviamente querrías y algo que es difícil de hacer.

Además, rebase NO es equivalente. Pierde las marcas de tiempo y la identidad de las confirmaciones realizadas en aq, que tampoco es lo que quiero.

MikeBeaton
fuente
0

Escenario:

  • Creé una rama de master say branch-1 y la llevé a mi local.
  • Mi amigo creó una rama de master say branch-2.
  • Él cometió algunos cambios de código para master.
  • Ahora quiero llevar esos cambios de la rama maestra a mi rama local.

Solución

git stash // to save all existing changes in local branch
git checkout master // Switch to master branch from branch-1
git pull // take changes from the master
git checkout branch-1 // switchback to your own branch
git rebase master // merge all the changes and move you git head  forward
git stash apply // reapply all you saved changes 

Puede encontrar conflictos en su archivo después de ejecutar "git stash apply". Necesita arreglarlo manualmente y ahora está listo para presionar.

Shreyansh Pandey
fuente