¿Cómo puedo empujar fácilmente una rama local de Git a un control remoto con un nombre diferente?

175

Me he estado preguntando si hay una manera fácil de empujar y extraer una rama local con una rama remota con un nombre diferente sin especificar siempre ambos nombres.

Por ejemplo:

$ git clone myrepo.git
$ git checkout -b newb
$ ...
$ git commit -m "Some change"
$ git push origin newb:remote_branch_name

Ahora, si alguien actualiza remote_branch_name, puedo:

$ git pull

Y todo está fusionado / adelantado. Sin embargo, si hago cambios en mi "newb" local, no puedo:

$ git push

En cambio, tengo que:

% git push origin newb:remote_branch_name

Parece un poco tonto. Si se git-pullusa git-config branch.newb.mergepara determinar de dónde sacar, ¿por qué no podría git-pushtener una opción de configuración similar? ¿Hay un buen atajo para esto o debería continuar el camino largo?

jmacdonagh
fuente

Respuestas:

93

Por supuesto. Sólo hay que establecer sus push.defaultque upstreampara impulsar a sus ramas aguas arriba (que es el mismo que pullse tire de, definido por branch.newb.merge), en lugar de empujar a las ramas congruentes, de nombre (que es la configuración predeterminada para push.default, matching).

git config push.default upstream

Tenga en cuenta que esto solía llamarse trackingno upstreamantes de Git 1.7.4.2, por lo que si está utilizando una versión anterior de Git, úsela tracking. La push.defaultopción se agregó en Git 1.6.4, por lo que si tiene una versión anterior a esa, no tendrá esta opción en absoluto y tendrá que especificar explícitamente la rama a la que presionar.

Brian Campbell
fuente
¡Eso fue todo! Esto se aplica a todas las ramas que están rastreando, pero está bien. ¡Gracias!
jmacdonagh
Me interesaría saber si hay una abreviatura para el nombre de la sucursal que he revisado. Es posible que solo quiera saber git push buildserver .:test_thisdónde .estará el nombre de la sucursal local que no necesariamente conozco. Podría buscarlo, claro, pero si hubiera una mano corta, como el punto, para eso, sería genial.
Frederick Nord
2
@FrederickNord HEADes la taquigrafía que estás buscando. HEADes lo que apunta a la rama actualmente desprotegida, o directamente a una confirmación particular si tiene una cabeza separada.
Brian Campbell
¡Gracias! Esto solucionó el Updates were rejected because a pushed branch tip is behind its remoteerror para mí. Mi repositorio local estaba actualizado, pero los nombres eran simplemente diferentes.
canhazbits
171

Cuando realice el empuje inicial, agregue el parámetro -u :

git push -u origin my_branch:remote_branch

Los empujones posteriores irán a donde quieras.

EDITAR:

Según el comentario, eso solo establece pull.

git branch --set-upstream

Deberías hacerlo.

Adam Dymitruk
fuente
77
-usolo establece el flujo ascendente, que según la pregunta, ya está configurado. Se necesita conjunto push.defaulta upstremfin de obtener pusha respetar el entorno aguas arriba, ya que por defecto sólo se pullhace.
Brian Campbell
2
Esto no parece funcionar, al menos no en versiones nunca de git
Thomas Watson
git branch --set-upstream solo realiza la configuración de extracción "pushRemote" después de esto.
Wheredidthatnamecomefrom
No creo que git branch --set-upstreamsea ​​necesario. Nota: mi git --versiones 2.17.1.
Gabriel Staples
15

El comando de Adam ahora está en desuso. Puedes usar:

git branch --set-upstream-to origin/my_remote_branch my_local_branch

para establecer la rama aguas arriba de my_local_branchto origin/my_remote_branch.

Jobin
fuente
66
¿Puede proporcionar un enlace que respalde la información que comparte acerca de que -u esté en desuso? Los documentos para la última versión sobre push en git-scm.com parecen sugerir que es actual. Gracias de antemano: podría ser muy útil para los lectores hacer un seguimiento para obtener más información.
Kay V
De acuerdo con @KayV, especialmente en que recibí este mensaje al intentar crear una nueva sucursal remota con un nombre diferente a mi sucursal local: 'Si planea expulsar una nueva sucursal local que rastreará a su contraparte remota, es posible que desee usar "git push -u" para configurar la configuración ascendente a medida que presiona '.
FBB
0

Aquí está el proceso que me ha funcionado.

git clone original-repo-url
git remote rename origin upstream
git remote add origin new-repo-url

Ahora su nuevo repositorio será 'origen' y el repositorio original está 'corriente arriba'. Confirme ejecutando git remote -v. (Nota al margen: Upstream se utiliza para recuperar el repositorio original, para mantener su copia local sincronizada con el proyecto al que desea contribuir, y el origen se utiliza para extraer y empujar, ya que puede contribuir a su propio repositorio).

git push origin master

Ahora el nuevo maestro de tu repositorio remoto (en Github) estará sincronizado con el maestro original, pero no tendrá ninguna de las ramas de funciones.

git rebase upstream/branch-name
git push origin master

Rebase es una fusión inteligente. Luego presione para masterizar nuevamente y verá la rama de la función seleccionada como master en el nuevo repositorio.

Opcional:

git remote rm upstream
git remote add upstream new-repo-url
urubuz
fuente
0

Me he encontrado con el mismo problema desde hace bastante tiempo. Finalmente tengo un conjunto de declaraciones, así que no tengo que hacerlo git push origin local:remotetodo el tiempo. Seguí estos:

git branch --set-upstream-to origin/remote_branch_name
git config push.default upstream
git push

Después de configurar el flujo ascendente a una rama remota con un nombre diferente (primera línea) y luego hacer que el flujo ascendente sea el predeterminado (segunda línea), la tercera línea ahora obedecerá estas reglas y avanzará al conjunto ascendente.

messmania
fuente