Cómo volver a crear una sucursal local con el maestro remoto

934

Tengo un proyecto clonado de una rama maestra del repositorio remoto remote_repo. Creo una nueva rama y me comprometo con esa rama. Otros programadores empujaron remote_repoa la rama maestra.

Ahora necesito volver a basar mi rama RB en remote_repomaster.

¿Como hacer esto? ¿Qué comandos escribir en una terminal?

Damir
fuente
14
Para mí, esta pregunta es ambigua ya que "con" podría significar un rebase en cualquier dirección. Al mirar las respuestas, veo que la intención es volver a basar su rama en el maestro remoto, no al revés. Lo menciono en caso de que alguien siga una respuesta a continuación y obtenga el reverso de lo que quiere.
Glenn Lawrence
8
@GlennLawrence Creo que es mejor editar la pregunta original que agregar un comentario. Esto también es alentado por stackoverflow. Además, el rebase maestro en RB probablemente fallará de todos modos, porque RB depende de la historia del maestro.
daniel kullmann

Respuestas:

1245

Primero busque el nuevo maestro del repositorio ascendente, luego vuelva a basar su rama de trabajo en eso:

git fetch origin            # Updates origin/master
git rebase origin/master    # Rebases current branch onto origin/master

Actualización : consulte la respuesta de Paul Draper para obtener una forma más concisa de hacer lo mismo: las versiones recientes de Git proporcionan una forma más sencilla de hacer el equivalente de los dos comandos anteriores.

Frerich Raabe
fuente
16
esta es la única respuesta que realmente hace lo que se le pidió
kayaker243
55
@ kayaker243 No, es lo mismo que la respuesta de Paul Drapers, pero creo que en forma larga.
erik
77
@erik Tenga en cuenta que Paul Draper escribió su respuesta aproximadamente medio año después del comentario de kayaker243 (y casi dos años después de esta respuesta).
Frerich Raabe
3
Me sale lo siguiente: Your branch and 'origin/b1' have diverged, # and have 3 and 2 different commits each, respectively.Parece que git pullse necesita otro . ¿Es correcto o me falta algo aquí?
Dror
2
@RGC No, git rebase masterno realizará el mismo trabajo que el segundo comando ( git rebase origin/master) desde entonces mastery origin/masterbien puede apuntar a diferentes confirmaciones (especialmente dado que el primer comando fue git fetch origin, que puede modificarse origin/master).
Frerich Raabe
816
git pull --rebase origin master
# where --rebase[=(false|true|merges|preserve|interactive)]
Paul Draper
fuente
19
(Equivalente a la respuesta de Frerich)
Paul Draper
12
¿No es esto un poco diferente a la respuesta de Frerich, ya que esto confirmará los cambios del maestro de origen al maestro local, mientras que la respuesta de Frerich deja al maestro local intacto? (pull vs fetch)
Jimmy Huch
77
No, en la respuesta de Frerich, el rebase modifica al maestro local. Un pull --rebase es lo mismo que una búsqueda seguida de un rebase
adhominem
99
FYI puedes hacer git pull --rebase=interactive origin master
rebases
14
@adhominem: revisé la documentación de git-pull y no puedo ver nada que respalde la afirmación de que el maestro local está modificado. Si estoy en una rama llamada devy ejecuto git pull --rebase origin master, solo devse modificará la rama , no master. La --rebasedocumentación de la bandera indica que intenta rebase the current branch on top of the upstream branch after fetchingy nada acerca de modificar las ramas de seguimiento locales.
Reinstale a Monica 2331977 el
227

Después de confirmar los cambios en su sucursal, finalice la compra mastery tire de ella para obtener los últimos cambios del repositorio:

git checkout master
git pull origin master

Luego revise su sucursal y vuelva a clasificar sus cambios en master:

git checkout RB
git rebase master

... o los dos últimos comandos en una línea:

git rebase master RB

Al intentar retroceder origin/RB, probablemente obtendrá un error; Si eres el único trabajando RB, puedes forzar el empuje:

git push --force origin RB

... o de la siguiente manera si tiene git configurado adecuadamente:

git push -f
CharlesB
fuente
44
al intentar retroceder al origen / RB, probablemente obtendrá un error. Si eres el único que trabaja en RB, puedes usar push --force origin RB. fuente: stackoverflow.com/questions/8939977/…
Joey Baruch
1
Ah ... tengo exactamente esto. mi "RB" está correctamente replanteado, pero obtengo un sinfín de errores cuando intento empujarlo después del rebase. Aparte del empuje --force origin RB - ¿hay una forma "más amable" (no forzada) de hacerlo? Solo trato de entender la percepción de gits aquí, y fallo.
Motti Shneor
2
@ MottiShneor No, no hay una buena manera. Si alguien más empuja a la rama mientras tanto, ¡sus cambios se perderán! Si desea ser amable con el historial de confirmación de git, debe fusionar master en su rama, lo cual es seguro (puede git pushprescindir -f).
daniel kullmann
110

Nota: Si ya tiene un amplio conocimiento sobre rebase, use debajo de un revestimiento para un rebase rápido. Solución: suponiendo que está en su rama de trabajo y que es la única persona que trabaja en ella.

git fetch && git rebase origin/master

Resuelva cualquier conflicto, pruebe su código, confirme y envíe nuevos cambios a la sucursal remota.

                            ~:   For noobs   :~

Los siguientes pasos pueden ayudar a cualquiera que sea nuevo git rebasey quiera hacerlo sin problemas

Paso 1: suponiendo que no hay confirmaciones y cambios que se realizarán en YourBranch en este momento. Estamos visitando YourBranch.

git checkout YourBranch
git pull --rebase

¿Que pasó? Extrae todos los cambios realizados por otros desarrolladores que trabajan en su sucursal y reajusta sus cambios sobre ella.

Paso 2: resuelve cualquier conflicto que se presente.

Paso 3:

git checkout master
git pull --rebase

¿Que pasó? Extrae todos los últimos cambios del maestro remoto y reajusta el maestro local en el maestro remoto. ¡Siempre mantengo el master remoto limpio y listo! Y, prefiera solo trabajar en master o sucursales localmente. Recomiendo hacer esto hasta que tenga una mano en los cambios o confirmaciones de git. Nota: Este paso no es necesario si no está manteniendo el maestro local, en su lugar, puede buscar y volver a crear un maestro remoto directamente en la sucursal local directamente. Como mencioné en un solo paso al comienzo.

Paso 4: resuelve cualquier conflicto que se presente.

Paso 5:

git checkout YourBranch
git rebase master

¿Que pasó? Rebase en master ocurre

Paso 6: resuelva cualquier conflicto, si hay conflictos. Use git rebase --continuepara continuar el rebase después de agregar los conflictos resueltos. En cualquier momento puedes usar git rebase --abortpara abortar el rebase.

Paso 7:

git push --force-with-lease 

¿Que pasó? Empujando cambios a su remoto YourBranch. --force-with-leasese asegurará de que haya otros cambios entrantes para YourBranch de otros desarrolladores durante el cambio de nombre. Esto es súper útil en lugar de forzar el empuje. En caso de que haya cambios entrantes, instálelos para actualizar su YourBranch local antes de enviar los cambios.

¿Por qué necesito impulsar los cambios? ¿Para reescribir el mensaje de confirmación en YourBranch remoto después de un cambio apropiado o si hay algún conflicto resuelto? Luego, debe enviar los cambios que resolvió en el repositorio local al repositorio remoto de YourBranch

Yahoooo ...! Has terminado con éxito el rebase.

También podrías estar buscando hacer:

git checkout master
git merge YourBranch

¿Cuándo y por qué? Combine su sucursal en maestra si lo hace con usted y otros co-desarrolladores. Lo que hace que YourBranch esté actualizado con master cuando quería trabajar en la misma sucursal más tarde.

                            ~:   (๑ơ ₃ ơ)♥ rebase   :~
bh4r4th
fuente
Para qué sirve esto: "Extrae todos los últimos cambios del maestro y vuelve a crear el maestro en el último maestro". ¿Rebase maestro en maestro? ¿No solo necesitas sacar al último maestro?
John Little el
@JohnLittle Gracias por señalar. Me refiero Pulls latest changes from remote master to local master. I always prefer keeping remote master clean and release ready always!. Actualizaré mi descripción.
bh4r4th
21

Paso 1:

git fetch origin

Paso 2:

git rebase origin/master

Paso 3: (Repara si hay conflictos)

git add .

Paso 4:

git rebase --continue

Paso 5:

git push --force
GauthamManivannan
fuente
55
No hay explicación sobre en qué rama comenzar. No es una buena respuesta.
Karl Morrison
12

1.Actualice Master primero ...

git checkout [master branch]
git pull [master branch]

2. Ahora rebase la fuente-rama con la rama maestra

git checkout [source branch]
git rebase [master branch]
git pull [source branch] (remote/source branch)
git push [source branch]

Si la rama fuente aún no existe en el control remoto, entonces:

git push -u origin [source branch]

"et voila ..."

N Djel Okoye
fuente
Me gusta la naturaleza paso a paso de esta respuesta. Ayuda a analizar qué está sucediendo exactamente.
Dave Liu el
6

git fetch origin master:master extrae la última versión de master sin necesidad de comprobarlo.

Entonces todo lo que necesitas es:

git fetch origin master:master && git rebase master 👌

Naz
fuente
¿No git fetchactualiza el maestro sin necesidad de comprobarlo también? Excepto que git fetchno lo hace git mergela derecha las actualizaciones? Entonces, si pagamos master, no tendrá las últimas actualizaciones. Entonces, ¿no es más corto hacerlo en la rama de características, git fetchentonces git rebase origin/master? No podemos hacerlo git rebase masterporque eso intentará rebasear desde el masterespacio de trabajo, tenemos origin/masterque salir de lo no fusionado pero sentado en lo local.
Noitidart