¿Cómo cambiar el control remoto que una rama está rastreando?


675

El centralrepositorio tuvo que configurarse en un nuevo servidor, por lo que creé un nuevo control remoto en mi repositorio local y lo presioné.

Pero ahora cuando lo hago git pull, dice que estoy al día. Está mal, me está hablando de la antigua rama remota, no de la nueva, que sé que de hecho tiene nuevos compromisos para buscar.

¿Cómo cambio mi sucursal local para rastrear un control remoto diferente?

Puedo ver esto en el archivo de configuración de git pero no quiero estropear las cosas.

[branch "master"]
    remote = oldserver
    merge = refs/heads/master

1
Modifiqué su título: en realidad está tratando de cambiar el control remoto que está rastreando, pero aún rastrea el mismo nombre de rama en él.
Cascabel


55
Es difícil considerar esto como un duplicado de ¿Cómo hacer que una rama Git existente rastree una rama remota? . Esa pregunta no especifica que la rama ya está rastreando una rama remota. Este sí.

1
Me parece que editar el archivo de configuración es la forma más fácil y segura de hacerlo
Steven Lu

Respuestas:


1082

Usando git v1.8.0 o posterior:

git branch branch_name --set-upstream-to your_new_remote/branch_name

O puede usar el -uinterruptor:

git branch branch_name -u your_new_remote/branch_name

Usando git v1.7.12 o anterior:

git branch --set-upstream branch_name your_new_remote/branch_name


2
Esto era lo que estaba buscando: cambió la rama de seguimiento remoto para la rama dada. ¡Gracias!
joachim

77
Ah, mi mal. Todavía lo haría a través de la configuración, porque puede estar seguro de no cambiar accidentalmente el nombre de la rama, pero todo bien. +1.
Cascabel

De las notas de la versión 1.8.0 : "Fue tentador decir" git branch --set-upstream origin / master ", pero eso le dice a Git que organice la rama local" origin / master "para integrarse con la rama actualmente desprotegida, lo cual es altamente improbable a lo que se refería el usuario. La opción está en desuso; en su lugar, use la nueva opción "--set-upstream-to" (con una opción corta y dulce "-u") ".
Jared Beck

Muy limpio ;_; ¡Podría arreglar el pequeño desastre que creé tan fácilmente! Gracias =))
Aditya MP

56
Si la rama de seguimiento remoto aún no existe pero actualmente se realiza un seguimiento de una rama de seguimiento remoto existente, no se puede cambiar a la nueva rama de seguimiento remoto existente. Primero debe desactivar la rama de seguimiento remoto actual: git branch --unset-upstream- luego funciona como se indica en esta respuesta (o con la siguiente git push -u / --set-upstream).
hakre

88

Para mí la solución fue:

git remote set-url origin https://some_url/some_repo

Entonces:

git push

3
Esta es la forma en que Github dice que lo haga. help.github.com/articles/changing-a-remote-s-url
fsharp

18
En realidad, esto cambia dónde está el control remoto, no cambia qué control remoto está rastreando (técnicamente): todavía está rastreando el "origen", solo actualiza la definición de origen. Para algunos casos de uso, esto podría ser algo malo. Supongamos que bifurca jQuery y crea un nuevo control remoto. "origen" es tu bifurcación, "corriente arriba" es jQuery. Luego, suponga que necesita rastrear temporalmente el repositorio original en lugar de su bifurcación. Si lo usó set-urly olvidó volver a configurarlo, los futuros git pushcomandos fallarían
Stevendesu

42

Con un git actualizado (2.5.5), el comando es el siguiente:

git branch --set-upstream-to=origin/branch

Esto actualizará la rama rastreada remota para su rama local actual


3
Golpear git branch --set-upstream-to=origin/developelevó el error: error: the requested upstream branch 'origin/develop' does not exist. Anteriormente, cambié el nombre de una rama remota para delelop.
belgoros

1
@belgoros git fetch --alltal vez?
Gabriel Devillers

25

Otra opción para tener un gran control sobre lo que está sucediendo es editar sus configuraciones a mano:

git config --edit

o la taquigrafía

git config -e

Luego edite el archivo a voluntad, guárdelo y se aplicarán sus modificaciones.


1
Esto me salvó el día. ¡Gracias!
Martyn Chamberlin el

Mi problema era que había dos orígenes. (origen y origen-algo). Pero el maestro local estaba rastreando "origin-algo". Pero quería que rastreara el "origen". La única forma en que pude cambiar eso fue editando la configuración de git.
Aswin Prasad

19

Si está sano, editar el archivo de configuración es lo suficientemente seguro. Si quieres ser un poco más paranoico, puedes usar el comando de porcelana para modificarlo:

git config branch.master.remote newserver

Por supuesto, si observa la configuración antes y después, verá que hizo exactamente lo que iba a hacer.

Pero en su caso individual, lo que haría es:

git remote rename origin old-origin
git remote rename new-origin origin

Es decir, si el nuevo servidor va a ser el control remoto canónico, ¿por qué no llamarlo origen como si lo hubiera clonado originalmente?


3
De hecho, lo había hecho antes de enfrentar este problema: git fue inteligente y llevó el cambio de nombre remoto al archivo de configuración, por lo que en su ejemplo, mi archivo de configuración decía 'viejo origen'.
joachim

Personalmente, creo que esta forma tiene más sentido conceptual que la forma aceptada, pero supongo que son funcionalmente equivalentes, ¿correcto?
Evan Donovan

1
@Jefromi: A remote renameno haría lo que se le pide, ya que cambia el nombre del control remoto tanto en [remote]configuraciones como en [branch]configuraciones. Entonces, lo que hay que hacer en este caso es editar el archivo de configuración y hacer lo que está diciendo (cambiar el nombre de los controles remotos) solo en las [remote]líneas de configuración.
Sumeet Pareek

7
git fetch origin
git checkout --track -b local_branch_name origin/branch_name

o

git fetch
git checkout -b local_branch_name origin/branch_name

Para mi caso lo necesitaba git fetch. Había creado una nueva sucursal en Bitbucket y quería cambiar a ella. git no sabe acerca de los cambios remotos, así que tuve que hacerlo git fetchantes git checkout feature/new-feature-branch. Espero que esto ayude a alguien más.
TelamonAegisthus

6

Este es el comando más fácil:

git push --set-upstream <new-origin> <branch-to-track>

Por ejemplo, dado el comando git remote -vproduce algo como:

origin  ssh://git@bitbucket.some.corp/~myself/projectr.git (fetch)
origin  ssh://git@bitbucket.some.corp/~myself/projectr.git (push)
team    ssh://git@bitbucket.some.corp/vbs/projectr.git (fetch)
team    ssh://git@bitbucket.some.corp/vbs/projectr.git (push)

Para cambiar a seguir al equipo en su lugar:

git push --set-upstream team master

La rama a seguir es opcional cuando no hay nada ambiguo. Usé tu sugerencia cuando me alejé de Github;) Gracias.
gouessej

4

Puede eliminar su sucursal actual y hacer:

git branch --track local_branch remote_branch

O cambie cambiar el servidor remoto al actual en la configuración


no funcionó para mí, solo el comando de trabajo fue el de @uma: git checkout --track -b local_branch_name origin/branch_name
Saad Benbouzid

2

Según lo que entiendo de la última documentación de git , la sinopsis es:

git branch -u upstream-branch local-branch
git branch --set-upstream-to=upstream-branch local-branch

Este uso parece ser un poco diferente a la respuesta de urschrei, ya que en su sinopsis es:

git branch local-branch -u upstream-branch 
git branch local-branch --set-upstream-to=upstream-branch 

¿Supongo que volvieron a cambiar la documentación?


1

En la última versión de git como 2.7.4 ,

git checkout branch_name # nombre de rama que desea cambiar la rama de seguimiento

git branch --set-upstream-to=upstream/tracking_branch_name #upstream - nombre remoto


1

He encontrado útil la publicación de @critikaster , excepto que tuve que ejecutar estos comandos con GIT 2.21:

$ git remote set-url origin https://some_url/some_repo
$ git push --set-upstream origin master

0

la forma más fácil es simplemente avanzar a la nueva sucursal:

git push -u nombre / rama de origen

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.