Me pediste que tirara sin decirme con qué rama quieres fusionar

125

TL; DR: Tengo una rama "rastreada" que no puedo extraer.

Así que aquí estoy en "cubo-4":

$ git branch -v
  bucket-1       410f7b5 * gh-53 * gh-48 * "Share App"
  bucket-2       7ed70a2 * upgrade to SOLR 3.3.0
  bucket-3       400ffe4 * emergency fix prod issue
* bucket-4       64c2414 Merge branch 'bucket-3' into bucket-4
  master         8dc4854 [ahead 1] * gh-73

Me gustaría obtener cambios desde mi control remoto:

$ git pull

You asked me to pull without telling me which branch you
want to merge with, and 'branch.bucket-4.merge' in
your configuration file does not tell me, either. Please
specify which branch you want to use on the command line and
try again (e.g. 'git pull <repository> <refspec>').
See git-pull(1) for details.

If you often merge with the same branch, you may want to
use something like the following in your configuration file:

    [branch "bucket-4"]
    remote = <nickname>
    merge = <remote-ref>

    [remote "<nickname>"]
    url = <url>
    fetch = <refspec>

See git-config(1) for details.

Hmm, extraño, pensé que ya había agregado "cubo-4" como una rama de seguimiento. Veamos:

$ git remote show origin
* remote origin
  Fetch URL: [email protected]:abcd/main.git
  Push  URL: [email protected]:abcd/main.git
  HEAD branch (remote HEAD is ambiguous, may be one of the following):
    bucket-3
    master
  Remote branches:
    bucket-1       tracked
    bucket-2       tracked
    bucket-3       tracked
    bucket-4       tracked
    master         tracked
  Local branches configured for 'git pull':
    bucket-1       merges with remote bucket-1
    bucket-2       merges with remote bucket-2
    bucket-3       merges with remote bucket-3
    master         merges with remote master
  Local refs configured for 'git push':
    bucket-1       pushes to bucket-1       (up to date)
    bucket-2       pushes to bucket-2       (up to date)
    bucket-3       pushes to bucket-3       (up to date)
    bucket-4       pushes to bucket-4       (local out of date)
    master         pushes to master         (fast-forwardable)

De hecho, el cubo 4 está marcado como "rastreado", pero de alguna manera está configurado para empujar, pero no para jalar.

Al mirar mi .git/configarchivo, veo que tengo entradas "remotas" y "fusionadas" para la mayoría de mis sucursales, pero no para bucket-4. ¿Cómo se considera "rastreado" sin esto?

[remote "origin"]
    url = [email protected]:abcd/main.git
    fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
    remote = origin
    merge = refs/heads/master
[branch "rel-2011-07-07"]
    remote = origin
    merge = refs/heads/rel-2011-07-07
[branch "bucket-1"]
    remote = origin
    merge = refs/heads/bucket-1
[branch "bucket-2"]
    remote = origin
    merge = refs/heads/bucket-2
[branch]
    autosetupmerge = true
[branch "bucket-3"]
    remote = origin
    merge = refs/heads/bucket-3

Veo que la solución probable aquí es agregar remote/mergeentradas para bucket-4 en mi archivo de configuración. Pero, ¿cómo se considera "rastreado" sin esto? bucket-4 se creó localmente, luego se envió al servidor desde este repositorio, por lo que sospecho que de alguna manera no configuré el seguimiento correctamente para esta rama.

¿Hay alguna configuración que pueda agregar para que todas las sucursales locales rastreen sus controles remotos correctamente en el futuro?

George Armhold
fuente
2
Esta pregunta me señaló en la dirección correcta, solo tenía que agregar una entrada en mi archivo .git / config para la rama que estaba tratando de extraer y luego funcionó bien.
Sr. Bungle
Sí, yo también, y la forma de hacerlo es como Mark Longair describe a continuación con git branch --set-upstream bucket-4 origin / bucket-4
Jonathon Horsman

Respuestas:

191

Dice bucket-4 pushes to bucket-4solo porque el valor predeterminado al empujar una rama es empujarla a una con un nombre coincidente en el control remoto. (Tenga en cuenta que esto sigue siendo el valor predeterminado, incluso si la rama local está rastreando una rama de seguimiento remoto y la rama de seguimiento remoto corresponde a una rama con un nombre diferente en el repositorio remoto).

La forma más sencilla de configurar la asociación entre su bucket-4y bucket-4en origines asegurarse de que la próxima vez que presione, haga lo siguiente:

git push -u origin bucket-4

Alternativamente, puedes hacer:

git branch --set-upstream-to origin/bucket-4

Para responder un par de preguntas directamente:

¿Cómo se considera "rastreado" sin esto?

En este caso no lo es, no está rastreando la rama de seguimiento remoto en ningún sentido si no hay branch.bucket-4.mergeo branch.bucket-4.remoteen su configuración de git. El resultado de git remote show originsolo le muestra dónde se empujaría la rama de forma predeterminada.

¿Hay alguna configuración que pueda agregar para que todas las sucursales locales rastreen sus controles remotos correctamente en el futuro?

No creo que exista. Cuando creaste bucket-4localmente, como supongo que sucedió, la rama de seguimiento remoto no existía, por lo que no se puede configurar en ese punto; sería un comportamiento predeterminado muy confuso. Solo necesita recordar agregar -ua su primera git pushrama en su repositorio ascendente.

Espero que sea de alguna ayuda.

Mark Longair
fuente
77
git branch --set-upstreamfuncionó perfectamente para mí antes de hacer el pull
ohaal
git branch --set-upstream bucket-4 origin / bucket-4 funcionó para mí :-)
Aliza
¿Qué pasa si no quieres empujar? Tengo este mismo problema, pero no quiero sacar del repositorio que este problema ocurre. Acabo de cambiar los orígenes remotos y quiero extraer el último HEAD para la rama que aparentemente ya no se rastrea (a pesar de que se rastreó antes de cambiar el origen remoto). Al final eliminé el clon problemático y volví a clonar desde el nuevo origen.
geodésico
1
En realidad, al intentar git --set-upstream <branch> origin/<branch>obtener un error, ya que la bandera está en desuso. Se recomienda su uso git branch --track origin/<branch>o --set-upstream-tocomo sugiere la segunda respuesta. Supongo que la respuesta podría actualizarse, @MarkLongair?
AymDev
Gracias por la sugerencia, @AymDev: he hecho ese cambio.
Mark Longair
6

git branch --set-upstream <branch> origin/<branch> fue obsoleto al menos a partir de 1.8.2.3 (mi versión).

Usar en su git branch --set-upstream-to=origin/<branch> <branch>lugar.

d_roge
fuente
2
¿Querías que esto fuera un comentario sobre la respuesta de Mark ? Además, en realidad quedó en desuso en la versión 1.8.0 de Git .