Git fetch rama remota


2261

Mi colega y yo estamos trabajando en el mismo repositorio. Lo hemos ramificado en dos ramas, cada una técnicamente para diferentes proyectos, pero tienen similitudes, por lo que a veces querremos comprometernos con el * masterdesde el branch.

Sin embargo, tengo el branch. ¿Cómo puede mi colega sacar esa rama específicamente?

Una parte git clonedel repositorio no parece crear las ramas localmente para él, aunque puedo verlas en vivo sin problemas después de un empujón en mi extremo.

Además, cuando originalmente hice la rama, lo hice -b checkout. ¿Eso hace mucha diferencia?

$ git branch -r
origin/HEAD -> origin/master
origin/daves_branch
origin/discover
origin/master

$ git fetch origin discover
$ git checkout discover

Estos son los comandos que ejecuté. Pero definitivamente no está funcionando.

Quiero poder revisar esa rama y luego presionar y confirmar solo los cambios de las ramas de varios colaboradores o estaciones de trabajo .


99

33
Usé:, git fetch --allluego para ver todas las ramas:, git branchluego compruebo la rama:git checkout nameofnewbranch
Jeff Mattson



66
git fetch origin discover:discover && git checkout discover
Gayan Weerakutti

Respuestas:


3062

Necesita crear una rama local que rastree una rama remota. El siguiente comando creará una rama local llamada daves_branch , rastreando la rama remota origen / daves_branch . Cuando presiona sus cambios, la rama remota se actualizará.

Para las versiones más recientes de Git:

git checkout --track origin/daves_branch

--trackes la abreviatura de git checkout -b [branch] [remotename]/[branch]donde [remotename] es origen en este caso y [rama] es dos veces lo mismo, daves_branch en este caso.

Para Git 1.5.6.5 necesitabas esto:

git checkout --track -b daves_branch origin/daves_branch

Para Git 1.7.2.3 y superior, esto es suficiente (podría haber comenzado antes, pero esta es la confirmación más temprana que pude encontrar rápidamente):

git checkout daves_branch

Tenga en cuenta que con las versiones recientes de Git, este comando no creará una rama local y lo pondrá en un estado 'HEAD separado'. Si desea una sucursal local, use la --trackopción

Los detalles completos están aquí: 3.5 Git Branching - Ramas remotas, ramas de seguimiento


134
"git fetch" para asegurarse de que su repositorio esté actualizado con referencias remotas y "git checkout --track origin / discover" debería ser suficiente. Luego puede comprometerse con esa rama y un "git push" para sincronizar el control remoto con sus cambios.
ralphtheninja

33
Intenté esto y obtuve "fatal: git checkout: la actualización de rutas es incompatible con el cambio de ramas. ¿Tenía la intención de pagar 'upstream / desarrollo' que no se puede resolver como commit?". ¿Estoy haciendo algo mal?
Neil Barnwell

42
Parece que git 1.5.6.5 necesita esto: git checkout --track -b origin / daves_branch
Charlie

35
Esto me hizo un desastre, creó una rama local llamada origin / <branch> que ahora es ambigua para la rama remota origin / <branch> y no sé cómo deshacerme de la loca rama local.
Alan Moore

24
Debe agregar el nombre de la sucursal local explícitamente, de lo contrario, git crea una nueva sucursal local con la ruta completa de la sucursal, como @AlanMoore y @ derekmx271 declararon anteriormente:git checkout -b --track daves_branch origin/daves_branch
Mike Scott

961

He usado fetchseguido de checkout...

git fetch <remote> <rbranch>:<lbranch>
git checkout <lbranch>

... ¿dónde <rbranch>está la sucursal remota o la referencia de origen y <lbranch>es la sucursal local o la referencia de destino que aún no existe que desea rastrear y que probablemente desee nombrar igual que la sucursal remota o la referencia de origen. Esto se explica en las opciones en la explicación de .<refspec>

Git es tan inteligente que completa automáticamente el primer comando si tabulo después de las primeras letras de la rama remota. Es decir, ni siquiera tengo que nombrar la sucursal local, Git copia automáticamente el nombre de la sucursal remota por mí. Gracias Git!

Además, como muestra la respuesta en esta publicación similar de Desbordamiento de pila , si no nombra la sucursal local fetch, aún puede crearla cuando la extraiga utilizando la -bbandera. Es decir, git fetch <remote> <branch> seguido de git checkout -b <branch> <remote>/<branch>hace exactamente lo mismo que mi respuesta inicial. Y, evidentemente, si su repositorio tiene solo un control remoto, puede hacerlo git checkout <branch>después fetchy creará una sucursal local para usted. Por ejemplo, acaba de clonar un repositorio y desea consultar ramas adicionales desde el control remoto.

Creo que parte de la documentación fetchpuede haber sido copiada literalmente pull. En particular la sección <refspec>de opciones es el mismo. Sin embargo, no creo que eso fetchsuceda nunca merge, de modo que si deja vacío el lado de destino del colon, fetch no debería hacer nada .

NOTA: git fetch <remote> <refspec>es la abreviatura de lo git fetch <remote> <refspec>:que, por lo tanto, no haría nada, pero git fetch <remote> <tag>es lo mismo git fetch <remote> <tag>:<tag>que debería copiar el control remoto <tag>localmente.

Supongo que esto solo es útil si desea copiar una sucursal remota localmente, pero no necesariamente verificarla de inmediato. De lo contrario, ahora usaría la respuesta aceptada , que se explica en detalle en la primera sección de la descripción del pago y luego en la sección de opciones bajo la explicación de --track, ya que es una línea. Bueno ... una especie de frase, porque aún tendrías que correr git fetch <remote>primero.

FYI: El orden de <refspecs>(fuente: destino) explica el extraño método pre Git 1.7 para eliminar ramas remotas . Es decir, no introduzca nada en la referencia de destino.


8
Usted asume que el autocompletado de Git está configurado. code-worrier.com/blog/autocomplete-git
antonagestam

2
Esto funcionó para mí para obtener el código remoto en una sucursal local. Sin embargo, no consiguió que mi sucursal local rastreara la sucursal remota.
Aknosis

1
Por alguna razón, git fetch remote branchno agregué un encabezado de rama para mí, aunque todas las referencias se obtuvieron, así que cuando intenté seguir los pasos en la respuesta aceptada, recibí el error pathspec did not match any file(s) known to git., pero el rbranch:lbranchenfoque funcionó. Curiosamente, también obtuvo todas las etiquetas que comenzaron con el mismo prefijo, como si fuera un comodín ( rbranch*).
haridsv

3
Nit: git no hace el autocompletado, es el shell bash que lo está haciendo.
legalizar

1
FWIW, creo que la diferencia entre esta respuesta y la respuesta aceptada es que esta te dice que hagas el fetchcomando. Sin embargo, la respuesta aceptada tiene sentido porque OP observa que ya hizo la búsqueda. Ese es al menos el problema con el que me encontré.
tenor528

373

Si está intentando "pagar" una nueva rama remota (que existe solo en el remoto, pero no localmente), esto es lo que necesitará:

git fetch origin
git checkout --track origin/<remote_branch_name>

Esto supone que desea buscar desde el origen . Si no, reemplace el origen por su nombre remoto .


1
Funcionó para mí, no había obtenido la rama remota correcta, por lo que la respuesta aceptada seguía fallando para mí con un mensaje confuso. +1
Nathan Hinchey

Por lo general, uso git fetch, pero la cuestión es cuál es la diferencia entre git fetch y git fetch.
Ping Woo

@PingWoo Suponiendo que la rama que desea buscar reside en origen remoto, ambos git fetchy git fetch remoteharán lo mismo. Si necesita buscar desde un control remoto que no sea origin, puede hacerlo usando git fetch <other_remote_name>. Esta situación es muy poco común, solo se menciona aquí para completar.
paneer_tikka

1
Casi me golpeaba la cabeza contra la PC probando todas estas soluciones. Resulta que tenía un error tipográfico en el nombre de mi sucursal, tonto jeje.
Dev Yego

126

Para verificar myBranch que existe de forma remota y no localmente, esto funcionó para mí:

git fetch --all
git checkout myBranch

Recibí este mensaje:

Branch myBranch set up to track remote branch myBranch from origin
Switched to a new branch 'myBranch'

1
En otras palabras, no tienes que escribir -t?
Andrew Samuelsen

44
Creo que hay un error en esta respuesta. Originalmente hice el comando sin -ty obtuve You are in 'detached HEAD' state. You can look around, make experimental changes and commit them, and you can discard any commits you make in this state without impacting any branches by performing another checkout.porque no había una rama local del mismo nombre. Tuve que volver a correr -tpara arreglar.
stanri

1
Esto funcionó bien para mí: mi colega había agregado una nueva sucursal remota que quería agregar a mi repositorio local. Seguí buscando pero no vi que la nueva rama apareciera localmente. No me di cuenta de que podía correr checkoutpara crearlo. ¡Gracias!
skwidbreth

2
depende de las versiones de git. La última versión, como se dijo aquí, solo necesita git checkout <nombre de la sucursal en origen>. Tenga cuidado con el mismo nombre
local

--allnunca es una buena idea, porque descargará todos los archivos en cada rama. Tomará más tiempo y espacio. Es mejor ser específico con el nombre de la sucursal y hacer como este
Miel

53

Use git branch -a(ramas locales y remotas) o git branch -r(solo ramas remotas) para ver todos los controles remotos y sus ramas. Luego puede hacer un git checkout -t remotes/repo/brancha al control remoto y crear una sucursal local.

También hay un comando git-ls-remote para ver todas las referencias y etiquetas para ese control remoto.


git checkout remotes/repo/branchhace que git checkout busque una ruta específica, no un repositorio remoto.
Erin

1
Sí, ¿es posible pagar una sucursal en el repositorio remoto? Obviamente (o tal vez no era tan obvio), los controles remotos se obtienen primero para que los tenga localmente. El libro de git tiene una buena sección sobre ellos: git-scm.com/book/en/Git-Branching-Remote-Branches
Daniel Lee

43

El título y la pregunta son confusos:

  • Git fetch rama remota
  • ¿Cómo puede mi colega sacar esa rama específicamente?

Si la pregunta es, ¿cómo puedo obtener una sucursal remota para trabajar o cómo puedo hacer un checkout de Git en una sucursal remota? , una solución más simple es:

Con Git (> = 1.6.6) puede usar:

git checkout <branch_name>

Si <branch_name>no se encuentra local , pero existe una rama de seguimiento en exactamente un control remoto con un nombre coincidente, trátelo como equivalente a:

git checkout -b <branch_name> --track <remote>/<branch_name>

Ver documentación para el pago de Git

Para tu amigo:

$ git checkout discover
Branch discover set up to track remote branch discover
Switched to a new branch 'discover'

Gracias guillaume! Acabo de usar este comando y escribí una publicación al respecto para representar mi caso exacto: leniel.net/2014/05/…
Leniel Maccaferri

<! - git checkout <remote-branch-name> -> funciona como se esperaba, ¡Gracias Guillaume!
Sachidananda Naik

36

La forma más fácil de hacerlo, al menos para mí:

git fetch origin <branchName> # Will fetch the branch locally
git checkout <branchName> # To move to that branch

1
No trae otras ramas
Benjamin Harel

77
@BenjaminHarel la pregunta dice "buscar una rama remota" no todas las ramas. para eso siga esto puede ser útil para usted stackoverflow.com/questions/10312521/…
James Rochabrun

2
Después de usar este fetchcomando, la rama requerida estará disponible en la máquina local. git checkout -b 'your_branch' origin/'remote branch'Se requiere para pagar esta rama.
Abhijeet

30

Utilizar:

git checkout -b serverfix origin/serverfix

Esta es una operación bastante común que Git proporciona la --trackabreviatura:

git checkout --track origin/serverfix

De hecho, esto es tan común que incluso hay un atajo para ese atajo. Si el nombre de la rama que está tratando de pagar (a) no existe y (b) coincide exactamente con un nombre en un solo control remoto, Git creará una rama de seguimiento para usted:

git checkout serverfix

Para configurar una sucursal local con un nombre diferente al de la sucursal remota, puede usar fácilmente la primera versión con un nombre de sucursal local diferente:

git checkout -b sf origin/serverfix

Ahora, su sucursal local sfse retirará automáticamente origin/serverfix.

Fuente: Pro Git, 2da edición , escrita por Scott Chacon y Ben Straub (corte para facilitar la lectura)


Esas abreviaturas eran una lección
Z. Khullah


18

Para buscar una rama que existe en remoto, la forma más simple es:

git fetch origin branchName
git checkout branchName

Puede ver si ya existe en el control remoto con:

git branch -r

Esto buscará la rama remota a su local y rastreará automáticamente la remota.


2
¿Cómo esta pregunta no tiene más votos a favor? Podría estar equivocado, pero esto parecía hacer el truco, buscó una rama que no tenía en un local remoto ...
Nicholas Petersen

15

Lo que me ayudó fue

1) Para ver todas las sucursales remotas disponibles (por ejemplo, 'nombre-sucursal remota')

git branch -r

2) Crear una sucursal local usando el nombre de la sucursal remota

git fetch && git checkout 'remote-branch-name'

1
¿Qué sucede cuando ejecuta el comando git pushsin ningún otro argumento? ¿La rama local nombrada remote-branch-namese asocia automáticamente con (seguimiento a) la rama remota nombrada origin/remote-branch-name? ¿O necesitas corrergit push -u origin remote-branch-name
PatS el

1
esto causará el estado de HEAD separado
Akin Hwan

15

También puede buscar y pagar la rama remota de una vez:

git fetch && git checkout the-branch-name


13

escribí

git checkout <branch_name>

y consiguió

Branch <branch_name> set up to track remote branch <branch_name> from origin.
Switched to a new branch '<branch_name>'

de la documentación de pago de git: si no se encuentra <branch_name> pero existe una rama de seguimiento en exactamente un control remoto con un nombre coincidente, trate como equivalente a:git checkout -b <branch_name> --track <remote>/<branch_name>
Guillaume Vincent

11

A veces se le pide que no juegue con la rama maestra y trabaje solo con la rama remota (como se me pidió). Entonces, todo lo que necesita es la rama remota.

Entonces, para clonar solo la rama remota (sin el maestro), haga esto

git clone url --branch remote_branch_name

donde, remote_branch_name es el nombre de la rama remota

Por ejemplo,

git clone git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git --branch v3.15

Esto asegurará que clones la rama remota en tu rama local con el nombre de la rama remota.

Ahora, si confirma su código y lo empuja, el código se enviará solo a esa rama.


Relacionado: ¿Cómo clono una sola rama en Git? - "git 1.7.10 (abril de 2012) en realidad te permite clonar solo una rama:"
Peter Mortensen

11

[Respuesta rápida]

Hay muchas alternativas, y mis favoritas son:

- Alternativa 1:

git fetch --all
git checkout YourBranch

Usando esta alternativa usando una rama que existe remotamente, pero no en su local.

- Alternativa 2:

git checkout -b 'YourBranch' origin/'YourRemote'

Probablemente, esta es la forma más simple.


9

Digamos que su control remoto es git@xyz.git y desea su rama random_branch. El proceso debe ser el siguiente:

  1. Primero revise la lista de sus controles remotos por

    git remote -v

  2. Si no tiene el control remoto git@xyz.git en la salida del comando anterior, lo agregará por

    git remote add xyz git@xyz.git

  3. Ahora puede obtener el contenido de ese control remoto al

    git fetch xyz

  4. Ahora revisa la rama de ese control remoto por

    git checkout -b my_copy_random_branch xyz/random_branch

  5. Verifique la lista de sucursales por

    git branch -a

La rama local my_copy_random_branch estaría rastreando la rama random_branch de su control remoto.



7

git fetch && git checkout <your friend's branch name> debería hacer el truco


7

Quiero darle un comando de línea única para buscar todas las ramas remotas en su local y cambiar a su rama local recién creada deseada:

git fetch && git checkout discover

Después de ejecutar el comando anterior, recibirá el siguiente mensaje:

Switched to a new branch 'discover'
Branch discover set up to track remote branch discover from origin.

La primera línea dice que cambió a una nueva rama : ¿por qué nueva? Ya está allí en remoto!

Pero en realidad también debes crearlo localmente. La rama se toma del índice remoto y se crea localmente para usted.

Aquí discoverhay una nueva rama que se creó a partir de la rama remota de su repositoriodiscover .

Pero la segunda línea da más información que la primera que nos dice que:

Nuestra sucursal está configurada para rastrear sucursales remotas con el mismo nombre.

Aunque git fetch recupera todas las ramas a local. Pero si corre git branchtras él, verá solo una masterbifurcación en local. ¿Por qué ?

Porque para cada sucursal que tiene en remoto, también debe crearla localmente, para rastrearla como git checkout <branchname> como lo hemos hecho en el ejemplo anterior.

Después de ejecutar el git checkoutcomando puede ejecutar git branch, y ahora puede ver tanto la rama:

  1. master y 2. descubra en su listado local.


5

Simplemente intente:

git pull origin your_branch_name

2
Rizo, git pull origin branch_name debería ser la mejor solución. Eres la única persona que publicó esto como una solución y funcionó para mí. Esto funciona porque actualizará su rama con la rama maestra. Simple y sin complicaciones.
Ian Poston Framer

3
El problema con esto es que intentará fusionar esa rama remota con su rama ACTUAL, que no es la remota (ya que eso es nuevo para su repositorio local)
Z. Khullah

Esto se fusionará con su rama actual.
Eem Jee

4

Si tiene un repositorio que se clonó, --depth 1entonces muchos de los comandos que se enumeraron no funcionarán. Por ejemplo, mira aquí

% git clone --depth 1 https://github.com/repo/code
Cloning into 'code'...
cd code
remote: Counting objects: 1778, done.
remote: Compressing objects: 100% (1105/1105), done.
remote: Total 1778 (delta 87), reused 1390 (delta 58), pack-reused 0
Receiving objects: 100% (1778/1778), 5.54 MiB | 4.33 MiB/s, done.
Resolving deltas: 100% (87/87), done.
Checking connectivity... done.
Checking out files: 100% (1215/1215), done.
% cd code
% git checkout other_branch
error: pathspec 'other_branch' did not match any file(s) known to git.
% git fetch origin other_branch
remote: Counting objects: 47289, done.
remote: Compressing objects: 100% (15906/15906), done.
remote: Total 47289 (delta 30151), reused 46699 (delta 29570), pack-reused 0
Receiving objects: 100% (47289/47289), 31.03 MiB | 5.70 MiB/s, done.
Resolving deltas: 100% (30151/30151), completed with 362 local objects.
From https://github.com/repo/code
 * branch            other_branch-> FETCH_HEAD
% git checkout other_branch
error: pathspec 'other_branch' did not match any file(s) known to git.
%

En este caso, reclinaría el repositorio, pero quizás existan otras técnicas, por ejemplo, git shallow clone (clone --depth) pierde ramas remotas


3

Si ya conoce su rama remota así ...

git remote
=> One
=> Two

y conoce el nombre de la sucursal que desea pagar, por ejemplo, br1.2.3.4 , luego

git fetch One
=> returns all meta data of remote, that is, the branch name in question.

Todo lo que queda es pagar la sucursal

git checkout br.1.2.3.4

Luego, haga nuevas ramas fuera de él.


3

Los pasos son los siguientes;

  1. git fetch origino git fetch --all, esto buscará todas las ramas remotas a su local y luego esta es la segunda opción con la que puede proceder.

  2. git checkout --track origin/<The_remote_branch you want to switch over>

Luego trabaje en esta rama y puede verificar si está en esa rama o no escribiendo

git branch

Muestra la rama en la que te encuentras actualmente.



2

Verifique su .git/configarchivo, particularmente qué seguimiento está presente en la búsqueda de ese control remoto.

[remote "randomRemote"]
    url = git@github.com:someUser/someRepo.git
    fetch = +refs/heads/*:refs/remotes/randomRemote/*

Si tiene heads/*apuntando a randomRemote/*, cuando corresgit fetch randomRemote , buscará todas las ramas.

Entonces puedes pagar esa rama.

De otra manera,

  1. Debe agregar ramas remotas al seguimiento con esto. Comprueba tu .git/configdespués de ejecutar esto. Tu entenderás.

    git remote set-branches --add randomRemote randomBranch
    
  2. Ejecutar git fetch randomRemote. Esto buscará la rama remota.

  3. Ahora puedes correr git checkout randomBranch.


1

Utiliza 'git pull' para mantener tus ramas separadas. Usaré el repositorio real y los nombres de las ramas para ayudar, ya que 'lbranch' y 'rbranch' son difíciles de descifrar.

Vamos a usar:

  • myteam.unfuddle.com = el servidor Git remoto
  • tlc = Desenrollar la cuenta del proyecto donde existe el repositorio
  • daves_branch = nombre de sucursal remota

    Usted, o cualquier colega, puede ejecutar esto para extraer solo su rama, sin importar cuántas ramas haya:

    git init
    git pull git@myteam.unfuddle.com:myteam/tlc daves_branch:refs/remotes/origin/daves_branch
    

  • 0

    Un comando simple git checkout remote_branch_namelo ayudará a crear una rama local que tenga todos los cambios en la rama remota.


    -2
    git checkout -b branch_name
    git pull remote_name branch_name
    

    3
    Si bien este fragmento puede responder la pregunta, es mejor incluir alguna explicación sobre lo que hace y cómo difiere de la gran cantidad de respuestas que ya se encuentran aquí.
    DaveyDaveDave

    2
    Personalmente no me gusta esta opción. Porque en caso de que esté creando una nueva rama desde Master y luego extraiga datos de una rama remota, esa rama remota puede o no estar en la misma página que la maestra y puede invitar algunas actualizaciones de código innecesarias
    zeetit

    Alguna explicación estaría en orden.
    Peter Mortensen
    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.