Sé cómo hacer una nueva sucursal que rastrea sucursales remotas, pero ¿cómo hago para que una sucursal existente rastree una sucursal remota?
Sé que puedo editar el .git/config
archivo, pero parece que debería haber una manera más fácil.
fuente
Sé cómo hacer una nueva sucursal que rastrea sucursales remotas, pero ¿cómo hago para que una sucursal existente rastree una sucursal remota?
Sé que puedo editar el .git/config
archivo, pero parece que debería haber una manera más fácil.
Dada una rama foo
y un control remoto upstream
:
A partir de Git 1.8.0:
git branch -u upstream/foo
O, si la rama local foo
no es la rama actual:
git branch -u upstream/foo foo
O, si desea escribir comandos más largos, estos son equivalentes a los dos anteriores:
git branch --set-upstream-to=upstream/foo
git branch --set-upstream-to=upstream/foo foo
A partir de Git 1.7.0:
git branch --set-upstream foo upstream/foo
Notas:
foo
remota foo
desde la remota upstream
. git fetch upstream
antemano.Ver también: ¿Por qué necesito hacer `--set-upstream` todo el tiempo?
git branch --set-upstream master origin/master
sería equivalente a lo que se hace automáticamente cuando clonas inicialmente un repositorio.
Puede hacer lo siguiente (suponiendo que esté desprotegido en el maestro y desee pasar a un maestro de sucursal remoto):
Configure el 'control remoto' si aún no lo tiene
git remote add origin ssh://...
Ahora configure master para saber rastrear:
git config branch.master.remote origin
git config branch.master.merge refs/heads/master
Y empujar:
git push origin master
error: the requested upstream branch 'upstream/master' does not exist
.
origin
y no upstream
.
Hago esto como un efecto secundario de presionar con la -u
opción como en
$ git push -u origin branch-name
La opción larga equivalente es --set-upstream
.
El git-branch
comando también comprende --set-upstream
, pero su uso puede ser confuso. La versión 1.8.0 modifica la interfaz.
git branch --set-upstream
está en desuso y puede eliminarse en un futuro relativamente lejano.git branch [-u|--set-upstream-to]
ha sido introducido con un orden más racional de argumentos....
Fue tentador decirlo
git branch --set-upstream origin/master
, pero eso le dice a Git que organice la rama local "origen / maestro" para que se integre con la rama actualmente desprotegida, lo cual es muy poco probable a qué se refería el usuario. La opción está en desuso; use la nueva opción--set-upstream-to
(con una-u
opción corta y dulce ) en su lugar.
Supongamos que tiene una foo
sucursal local y desea que trate a la sucursal con el mismo nombre que en sentido ascendente. Haz que esto suceda con
$ git branch foo
$ git branch --set-upstream-to=origin/foo
o solo
$ git branch --set-upstream-to=origin/foo foo
--set-upstream-to=...
es justo lo que estaba buscando
Puede encontrar la git_remote_branch
herramienta útil. Ofrece comandos simples para crear, publicar, eliminar, rastrear y renombrar sucursales remotas. Una buena característica es que puedes pedirle a un grb
comando que explique qué comandos git ejecutaría.
grb explain create my_branch github
# git_remote_branch version 0.3.0
# List of operations to do to create a new remote branch and track it locally:
git push github master:refs/heads/my_branch
git fetch github
git branch --track my_branch github/my_branch
git checkout my_branch
En realidad, para que la respuesta aceptada funcione:
git remote add upstream <remote-url>
git fetch upstream
git branch -f --track qa upstream/qa
# OR:
git branch --set-upstream qa upstream/qa
Creo que ya en Git 1.5.x podría hacer una sucursal local $BRANCH
rastreara una sucursal remota origin/$BRANCH
, como esta.
Teniendo en cuenta eso $BRANCH
y origin/$BRANCH
existe, y actualmente no ha desprotegido $BRANCH
(cámbielo si lo ha hecho), haga lo siguiente:
git branch -f --track $BRANCH origin/$BRANCH
Esto se recrea $BRANCH
como una rama de seguimiento. Las -f
fuerzas de la creación a pesar de $BRANCH
existir ya. --track
es opcional si los valores predeterminados habituales están establecidos (es decir, el parámetro git-configbranch.autosetupmerge
es verdadero).
Tenga en cuenta que si origin/$BRANCH
aún no existe, puede crearlo empujando su local $BRANCH
al repositorio remoto con:
git push origin $BRANCH
Seguido por el comando anterior para promover la rama local en una rama de seguimiento.
git push origin $BRANCH
era lo que estaba buscando
git branch -f --track $BRANCH origin/$BRANCH
hace el truco.
1- actualiza tus metadatos locales usando: git fetch --todos
2- muestra tus sucursales remotas y locales usando: git branch -a , mira la siguiente captura de pantalla
3- cambia a la rama de destino que deseas vincular con el control remoto: usando
git checkout branchName
ejemplo:
4- Vincula tu sucursal local a una sucursal remota usando:
git branch --set-upstream-to nameOfRemoteBranch
NB: nameOfRemoteBranch : para copiar desde la salida del paso 2 "git branch -r"
Ejemplo de uso:
Asegúrate de ejecutar:
git config push.default tracking
para poder empujar sin problemas
git-config(1)
la página del manual, tracking
es un sinónimo obsoleto de upstream
.
La edición .git/config
es probablemente la forma más fácil y rápida. De todos modos, eso es lo que hacen los comandos Git para manejar ramas remotas.
Si no quiere manipular el archivo a mano (y no es tan difícil de hacer), siempre puede usarlo git config
... pero, de nuevo, eso solo va a editar el .git/config
archivo, de todos modos.
Por supuesto, hay formas de rastrear automáticamente una rama remota cuando se usa git checkout
(pasando la --track
bandera, por ejemplo), pero estos comandos funcionan con ramas nuevas , no existentes.
En muy corto
git branch --set-upstream yourLocalBranchName origin/develop
Esto hará que su yourLocalBranchName
pista sea la rama remota llamada develop
.
git push -u origin branch
(o --set-upstream-to
) en su lugar
--set-upstream
y --track
? No entiendo por qué debería usar uno sobre el otro.
Para 1.6.x, se puede hacer usando la herramienta git_remote_branch :
grb track foo upstream
Eso hará que Git haga un foo
seguimiento upstream/foo
.
Uso el siguiente comando (supongamos que el nombre de su sucursal local es "nombre-sucursal-local" y el nombre de la sucursal remota es "nombre-sucursal-remoto"):
$ git branch --set-upstream-to=origin/branch-name-remote branch-name-local
Si las ramas locales y remotas tienen el mismo nombre, simplemente haga lo siguiente:
$ git branch --set-upstream-to=origin/branch-name branch-name
Aquí, usando github
ygit version 2.1.4
, simplemente haz:
$ git clone git@github.com:user/repo.git
Y los controles remotos vienen por sí mismos, incluso si no están vinculados localmente:
$ git remote show origin
* remote origin
Fetch URL: git@github.com:user/repo.git
Push URL: git@github.com:user/repo.git
HEAD branch: master
Remote branches:
develop tracked <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
master tracked
Local branch configured for 'git pull':
master merges with remote master
Local ref configured for 'git push':
master pushes to master (up to date)
Pero, por supuesto, todavía no hay sucursal local:
$ git branch
* master <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
¿Ver? Ahora, si acaba de finalizar el desarrollo, hará la magia automáticamente:
$ git checkout develop
Branch develop set up to track remote branch develop from origin.
Switched to a new branch 'develop'
¡Tan fácil!
Resumen. Simplemente ejecute estos 2 comandos:
$ git clone git@github.com:user/repo.git
$ git checkout develop
Después de un git pull
:
git checkout --track <remote-branch-name>
O:
git fetch && git checkout <branch-name>
Para crear una nueva rama, podríamos usar el siguiente comando
git checkout --track -b ejemplo origen / ejemploPara que la rama ya creada cree un enlace entre el control remoto y luego desde esa rama, use el siguiente comando
git branch -u origin / remote-branch-name
Esta no es una respuesta directa a esta pregunta, pero quería dejar una nota aquí para cualquiera que pueda tener el mismo problema que yo al intentar configurar una rama ascendente.
Tenga cuidado con push.default .
Con versiones anteriores de git, el valor predeterminado era la coincidencia , lo que causaría un comportamiento muy indeseable si tiene, por ejemplo:
Sucursal local "master" que sigue al origen / master
Rastreo remoto "ascendente" de seguimiento a ascendente / maestro
Si trató de "git push" cuando estaba en la rama "aguas arriba", con push.default match git intentaría fusionar automáticamente la rama local "master" en "upstream / master", causando mucho caos.
Esto da un comportamiento más sensato:
git config - global push.default upstream
De alguna manera relacionada, estaba tratando de agregar una rama de seguimiento remoto a una rama existente, pero no tenía acceso a ese repositorio remoto en el sistema donde quería agregar esa rama de seguimiento remoto (porque con frecuencia exporto una copia de este repo a través de sneakernet a otro sistema que tenga acceso para enviar a ese control remoto). Descubrí que no había forma de forzar la adición de una rama remota en el local que aún no se había obtenido (por lo que local no sabía que la rama existía en el remoto y obtendría el error:) the requested upstream branch 'origin/remotebranchname' does not exist
.
Al final, logré agregar la nueva rama remota, previamente desconocida (sin recuperar) agregando un nuevo archivo de encabezado en .git/refs/remotes/origin/remotebranchname
y luego copiando la referencia (la observación fue más rápida, aburrida como era ;-) desde el sistema con acceso al origen repositorio a la estación de trabajo (con el repositorio local donde estaba agregando la rama remota).
Una vez hecho eso, podría usar git branch --set-upstream-to=origin/remotebranchname
o simplemente por:
cambia a la rama si aún no estás en ella:
[za]$ git checkout branch_name
correr
[za]$ git branch --set-upstream origin branch_name
Branch origin set up to track local branch brnach_name by rebasing.
y listo para:
[za]$ git push origin branch_name
Puede alawys echar un vistazo al archivo de configuración para ver qué está rastreando qué ejecutando:
[za]$ git config -e
También es bueno saber esto, muestra qué ramas se rastrean y cuáles no. :
[za]$ git remote show origin
Para cualquiera que, como yo, solo quiera sincronizar el nombre de su sucursal local con el nombre de la sucursal remota, aquí hay un comando útil:
git branch -u origin/$(git rev-parse --abbrev-ref HEAD)
Para evitar recordar lo que debe hacer cada vez que recibe el mensaje:
Especifique con qué rama desea fusionarse. Ver git-pull (1)
para más detalles.
.....
Puede usar el siguiente script que establece el origen como ascendente para la rama actual en la que se encuentra.
En mi caso, casi nunca configuro otra cosa que no sea origen como el flujo ascendente predeterminado . También casi siempre mantengo el mismo nombre de sucursal para sucursal local y remota. Entonces lo siguiente me queda bien:
#!/bin/bash
# scriptname: git-branch-set-originupstream
current_branch="$(git branch | grep -oP '(?<=^\* )(.*)$')"
upstream="origin/$current_branch"
git branch -u "$upstream"
Esto también funcionaría
git branch --set-upstream-to=/< remote>/< branch> < localbranch>
git push -u origin branch-name
.git pull
a menudo proporcionará mensajes útiles sobre el comando apropiado para establecer la información de rastreogit branch --set-upstream-to origin/<branch>
--set-upstream
produce un error: tambiénfatal: the '--set-upstream' option is no longer supported. Please use '--track' or '--set-upstream-to' instead.
logit branch --set-upstream-to origin/<branch name>
es el comando actual que funciona.