2011-03-09 14 views
7

Justo cuando pensaba que tenía el truco del git checkout -b newbranch-commit/commit/commit-commit-git checkout master-git merge newbranch - git rebase -i master - git push flujo de trabajo en git, algo explotó, y no veo ninguna razón para ello.git sucursal maestra local detuvo el seguimiento de controles remotos/origen/maestro, no puede presionar

Aquí está el flujo de trabajo general, que ha trabajado para mí en el pasado:

# make sure I'm up to date on master: 
$ git checkout master 
$ git pull # k, no conflicts 
# start my new feature 
$ git checkout -b FEATURE9 # master @ 2f93e34 

Switched to a new branch 'FEATURE9' 

... trabajo, comprometerse, trabajo, compromiso, trabajo, comprometerse ...

$ git commit -a 
$ git checkout master 
$ git merge FEATURE9 
$ git rebase -i master # squash some of the FEATURE9 ugliness 

Ok hasta el momento; Ahora lo que espero para ver - y normalmente ver - es la siguiente:

$ git status 

# On branch master 
# Your branch is ahead of 'origin/master' by 1 commit. 
# 
nothing to commit (working directory clean) 

Pero en cambio, solamente veo "nada que cometen (directorio limpio de trabajo)", no "su rama está por delante de 'origin/master' por 1 cometer", y git pull muestra esta rareza:.

$ git pull 
From .          # unexpected 
* branch   master  -> FETCH_HEAD # unexpected 
Already up-to-date.       # expected 

y git branch -a -v muestra esto:

$ git branch -a -v 

    FEATURE9     3eaf059 started feature 9 
* master     3eaf059 started feature 9 
    remotes/origin/HEAD  -> origin/master 
    remotes/origin/master 2f93e34 some boring previous commit # should=3eaf059 

git branch muestra claramente que actualmente estoy * master y git log muestra claramente que master (local) está en 3eaf059, mientras que remotes/origin/HEAD -> remotes/origin/master está atascado en la bifurcación.

Idealmente me gustaría saber la semántica de cómo podría haber entrado en esto, pero me gustaría conformarme con una forma de obtener mi copia de trabajo rastreando el maestro remoto de nuevo & para que los dos vuelvan a sincronizarse sin perder el historial. ¡Gracias!

(Nota: Me volvieron a clonar el repositorio en un nuevo directorio y volver a aplicar manualmente los cambios, y todo funcionaba bien, pero no quiero que eso sea la solución estándar.)

Addendum: El título dice "no se puede presionar", pero no hay ningún mensaje de error. Acabo de recibir la respuesta "ya actualizada" aunque git branch -a -v muestra que el maestro local está adelantado/remotos/origen/maestro. Aquí está la salida de git pull y Git remoto -v, respectivamente:

$ git pull 
From . 
* branch   master  -> FETCH_HEAD 
Already up-to-date. 

$ git remote -v 
origin [email protected]:proj.git (fetch) 
origin [email protected]:proj.git (push) 

Addendum 2: Parece como si mi maestro local está configurado para empuje a la distancia, pero no a sacar de eso. Después de hacer for remote in 'git branch -r | grep -v master '; do git checkout --track $remote ; done, esto es lo que tengo. Parece que solo necesito obtener el maestro tirando desde controles remotos/origen/maestro nuevamente, ¿no?

$ git remote show origin 
* remote origin 
    Fetch URL: [email protected]:proj.git 
    Push URL: [email protected]:proj.git 
    HEAD branch: master 
    Remote branches: 
    experiment_f tracked 
    master tracked 
    Local branches configured for 'git pull': 
    experiment_f merges with remote experiment_f 
    Local refs configured for 'git push': 
    experiment_f pushes to experiment_f (up to date) 
    master pushes to master (local out of date) 
+1

¿Podría agregar la salida de 'git remote -v' a su pregunta. –

+0

Además, el título de la pregunta se refiere a problemas con 'push', pero no tienes información sobre mensajes de error con' push'. –

+1

Debe tener cuidado con las ramas de rebase que rastrean remotos (es decir, su rama 'master') porque eso reescribirá el historial y es posible que se confunda a usted mismo o a su repositorio remoto. Si desea comprimir confirmaciones, puede aplastarlas en la rama de características * antes de * fusionarlas con el maestro hasta que esté más cómodo con lo que hace. – nickgrim

Respuesta

5

cuando se hace una git pull ¿Realmente quieres hacer una git push?

Por alguna razón, git pull está "tirando" de su directorio actual, sospecho que quiere extraer desde remotes/origin/HEAD.

¿Qué resultados produce git push origin?

[Adición de Paul]: Esto me llevó a la respuesta correcta, así que estoy de acuerdo. Los pasos adicionales que se tardó en averiguar lo que estaba pasando eran:

# see details of the current config: 
$ git config -l 
branch.master.remote=. # uh oh, this should point to origin 
# to see what it should be ,make a clean clone of the same project 
# in a different directory, checkout the master branch and run the 
# same command. That showed "branch.master.remote=origin", so... 

# then to fix: 
$ git config branch.master.remote origin 

Después de eso, el maestro local estaba rastreando mandos a distancia/origin/master de nuevo. ¡Gracias a Peter Farmer por la pista que me trajo aquí!

+0

Mi objetivo era unirme a los cambios remotos antes de presionar, para verificar la compilación. El control remoto se adelantó a mí, pero tu sugerencia de 'origen de git push' me hizo probar' origen de origen de git', que dio como resultado "Pediste extraer del origen 'remoto', pero no especificó una rama. Porque esto es no es el predeterminado remoto configurado para su rama actual, debe especificar una rama en la línea de comando. " 'git pull origin master' trajo algunas cosas hacia abajo, y' git push origin 'me dio "b1f6453..3b2d904 master -> master". ¿Alguna idea de cómo obtener pull/push para rastrear el control remoto correctamente? –

1

Haciendo un poco de investigación a raíz de Pedro y los comentarios de Nick condujo a:

# botched local clone: 
$ git config -l 
branch.master.remote=. 
branch.master.merge=refs/heads/master 
[...] 

# new/clean local clone: 
$ git config -l 
branch.master.remote=origin 
branch.master.merge=refs/heads/master 
[...] 

que espero poder publicar esto como una respuesta sin aceptarlo (si no voy a tener que eliminar & ponerlo en un comentario o la pregunta original). Haciendo ...

$ git config branch.master.remote origin 

... consiguió branch.master.remote-=origin de nuevo, pero no explica cómo llegó "sin seguimiento" en el primer lugar.

Si alguien puede explicar limpiamente:

a) cómo mi local de "fallido" repo podría haber metido en un estado tan determinado el flujo de trabajo en mi pregunta, y

b) la secuencia correcta de acciones para vuelva a estar sincronizado de forma segura (dado que el control remoto podría haber avanzado mientras tanto), me gustaría marcarlo como la respuesta aceptada, ya que creo que sería más útil para otros en esta situación.

+0

Tuve esto, pero no intenté fusionar otra cosa que no fueran las sucursales locales. Sería bueno saber qué causa este cambio. – awm

Cuestiones relacionadas