Git: fusionar una rama remota localmente

204

He sacado todas las ramas remotas a través de git fetch --all. Puedo ver la rama a través de la cual me gustaría fusionar git branch -acomo remotes / origin / branchname. El problema es que no es accesible. ¿No puedo fusionarme o pagar?

micahblu
fuente

Respuestas:

321

Puede hacer referencia a esas ramas de seguimiento remoto ~ (enumeradas con git branch -r) con el nombre de su control remoto.

Debe buscar la rama remota:

git fetch origin aRemoteBranch

Si desea fusionar una de esas sucursales remotas en su sucursal local:

git checkout master
git merge origin/aRemoteBranch

Nota 1: Para un repositorio grande con un historial largo, querrás agregar la --depth=1opción cuando la uses git fetch.

Nota 2: estos comandos también funcionan con otros repositorios remotos para que pueda configurar un originy un upstreamsi está trabajando en una bifurcación.


Escenario opuesto: si desea fusionar una de sus sucursales locales en una sucursal remota (en lugar de una sucursal remota en una sucursal local, como se muestra arriba), primero debe crear una nueva sucursal local encima de dicha sucursal remota:

git checkout -b myBranch origin/aBranch
git merge anotherLocalBranch

La idea aquí es fusionar "una de su sucursal local" (aquí anotherLocalBranch) con una sucursal remota ( origin/aBranch).
Para eso, crea primero " myBranch" como representación de esa rama remota: esa es la git checkout -b myBranch origin/aBranchparte.
Y luego puedes fusionarte anotherLocalBranch(a myBranch).

VonC
fuente
aLocalBranch? ¿Es eso un error tipográfico? ¿Supongo que querías volver a escribir "myBranch"?
Knocte
1
@knocte No: "Si desea fusionar una de sus sucursales locales en una de esas sucursales remotas": estoy fusionando " aLocalBranch" a " myBranch", con " myBranch" representando una sucursal remota origin/aBranch.
VonC
Lamento molestarlo @VonC, en su comentario anterior dice aLocalBranchque no es un error tipográfico, pero aprobó la última edición (¡2 años después!) Que corrige este "error tipográfico probable". Quería consultar con usted antes de deshacer la edición.
rath
1
@rath Tienes razón: parece que podría haber revisado esa edición un poco apresuradamente, bordeando el descuido. Edité la respuesta para aclarar el segundo caso de fusión: ¿puede decirme si esto está más claro ahora?
VonC
91

Cada vez que hago una fusión, entro en la rama en la que quiero fusionarme (por ejemplo, " git checkout branch-i-am-working-in") y luego hago lo siguiente:

git merge origin/branch-i-want-to-merge-from

Michael Dautermann
fuente
2
Supongo que tienes que hacer un git fetch origin/branch-i-want-to-merge-fromprimero, ¿verdad?
Hinrich
9
git fetch origin developseguido degit merge origin/develop
Olivier
2
@ Olivier Tienes razón, esta es la forma correcta de hacerlo. git merge solo no lo hará.
Sam
1
gracias por la inteligente convención de nombres que me ayudó a entender
tony2tones
1
@Akira no es git add .-> git commit -m <message>-> git push -u origin <branch>?
Cloud Cho
24

Obtenga la rama remota desde el origen primero.

git fetch origin remote_branch_name

Fusionar la sucursal remota con la sucursal local

git merge origin/remote_branch_name
Lanil Marasinghe
fuente
1
Esto funcionó para mí cuando la respuesta aceptada informó No es algo que podamos fusionar. En mi caso, me estaba fusionando desde la bifurcación de mi repositorio de otro usuario en GitHub.
SJT
¿Requiere el primer comando buscar? ¿Lee 'git merge origin / remote_branch_name' desde la rama remota, no local? Entonces no debería importarme, ¿se actualiza la sucursal local o no?
Michael Freidgeim
20

Tal vez desee rastrear la sucursal remota con una sucursal local:

  1. Crea una nueva sucursal local: git branch new-local-branch
  2. Establezca esta rama recién creada para rastrear la rama remota: git branch --set-upstream-to=origin/remote-branch new-local-branch
  3. Entra en esta rama: git checkout new-local-branch
  4. Extraiga todo el contenido de la rama remota en la rama local: git pull
e18r
fuente
3

Si ya buscó su rama remota y lo hace git branch -a,
obtendrá algo como:

* 8.0
  xxx
  remotes/origin/xxx
  remotes/origin/8.0
  remotes/origin/HEAD -> origin/8.0
  remotes/rep_mirror/8.0

Después de eso, puede usar rep_mirror/8.0para designar localmente su sucursal remota.

El truco es que remotes/rep_mirror/8.0no funciona pero rep_mirror/8.0sí.

Entonces, un comando como git merge -m "my msg" rep_mirror/8.0hacer la fusión.

(nota: este es un comentario a la respuesta @VonC. Lo puse como otra respuesta porque los bloques de código no se ajustan al formato del comentario)

herve-guerin
fuente