git: Tu rama está adelante por X commits

379

¿Cómo se produce esto realmente?

Estoy trabajando en un repositorio solo en este momento, así que este es mi flujo de trabajo:

  1. Cambiar archivos
  2. Cometer
  3. Repita 1-2 hasta que esté satisfecho
  4. Empujar para dominar

Luego, cuando hago un git statusmensaje, me dice que mi rama está adelante por X commits (presumiblemente la misma cantidad de commits que he realizado). ¿Es porque cuando empuja el código en realidad no actualiza sus archivos almacenados localmente en caché (en las carpetas .git)? git pullparece "arreglar" este extraño mensaje, pero todavía tengo curiosidad por saber por qué sucede, ¿tal vez estoy usando git mal?


incluyendo qué rama está impresa en el mensaje

Mi sucursal local está por delante del maestro

donde empujas / jalas la rama actual

Estoy presionando a GitHub y tirando a cualquier computadora en la que esté trabajando en ese momento, mi copia local siempre está completamente actualizada, ya que soy la única que trabaja en ella.

en realidad no verifica el repositorio remoto

Eso es lo que pensé, pensé que me aseguraría de que mi comprensión fuera correcta.

¿Le estás pasando algunos argumentos adicionales?

No son las que puedo ver, ¿tal vez hay alguna configuración divertida en mi extremo?

$ git status
# On branch master
# Your branch is ahead of 'origin/master' by 1 commit.
#
nothing to commit (working directory clean)
SeanJA
fuente
¿Cómo estás haciendo pushy cuáles son tus configuraciones de configuración remota y de sucursal?
CB Bailey
2
en realidad no verifica el repositorio remoto, debe hacer un git para obtener la información más reciente sobre el repositorio remoto después de realizar el envío, esto actualizará la rama local "remota" que utiliza para rastrear.
Sekhat
2
@Sekhat: aunque git statusno verifica el repositorio remoto, lo git pullhace. Si tiene una rama de seguimiento para un repositorio al que ingresa, git pushactualizará su rama de seguimiento local para reflejar el nuevo estado de la rama remota si su inserción es exitosa. Es por eso que pregunté sobre la configuración del autor de la pregunta porque si no está sucediendo correctamente, probablemente haya un error de configuración.
CB Bailey
git status? ¿De Verdad? mi git statusnunca me dice qué tan adelante está mi rama ... ¿le estás pasando algunos argumentos adicionales?
hasen
44
@hasen j: git statusno va al repositorio remoto para verificar si la rama remota se ha actualizado. Le indica qué tan lejos está su sucursal local en comparación con su sucursal de seguimiento remoto almacenada localmente . El problema es que un normal git push(además de buscar y extraer) debería actualizar la rama de seguimiento remoto y para el que pregunta no parece estar funcionando. Para ver por qué necesitamos ver tanto la forma exacta de git pusheso como la configuración del repositorio local, pero como el autor de la pregunta ya ha aceptado una respuesta, no puedo ver que esto suceda ahora.
CB Bailey

Respuestas:

508

Si recibe este mensaje después de hacer un git pull remote branch, intente seguirlo con un git fetch. (Opcionalmente, ejecute git fetch -ppara podar ramas eliminadas del repositorio)

Fetch parece actualizar la representación local de la rama remota, lo que no necesariamente sucede cuando haces una git pull remote branch.

Rico
fuente
1
Bravo. Ese fue realmente el problema. Comencé creando un repositorio en el código de google. Luego cloné este repositorio en mi computadora portátil y trabajo allí y empujo los cambios, laptop => code.google. Solía ​​recibir este mensaje en mi servidor donde había creado un clon de repositorio de código code.google y solía extraer los cambios. Creo que se requiere fetch para actualizar la base de datos local.
rjha94
2
Tuvimos el mismo problema aquí porque otra rama (A) señaló el mismo commitid de master. Tirando A y luego tirando maestro resultó en esta misma situación. Cuando git extrajo A, el commitid se actualizó al último, por lo que pull master no tiene nada que extraer, por lo que git no actualizó el master commitid último y advirtió que estaba "por delante del master".
Uberto
8
Gracias, aunque noté una cosa extraña. "git fetch origin master" no ayuda, pero "git fetch origin" sí. Estoy en la rama maestra, así que no estoy seguro de cómo "git fetch origin" haría algo diferente en el contexto.
Parag
2
@Parag, consulte stackoverflow.com/questions/26350876/… para obtener una explicación de las diferencias entre esos dos comandos, y cómo quizás modificar el archivo de configuración para cambiar el comportamiento para que git fetch remote branch también actualice la referencia de la rama de seguimiento remoto, por lo que git_status no informa 'adelante por'.
Anatortoise House
2
@Parag, también stackoverflow.com/questions/7365415/… answer, analiza los detalles de ORIG_HEAD y FETCH_HEAD que no están sincronizados, provocando la advertencia de estado y las posibles correcciones del archivo de configuración.
Anatortoise House
138

Utilizar

git pull --rebase

La opción --rebase significa que git moverá su confirmación local a un lado, se sincronizará con la remota y luego intentará aplicar sus confirmaciones desde el nuevo estado.

Marian Zburlea
fuente
3
¡Una muy buena manera de evitar fusiones inútiles y tener un árbol más limpio en origen!
Odio
1
$ git pull --rebase Current branch xyz is up to date. $ git status On branch xyz Your branch is ahead of 'origin/xyz' by 6 commits. (use "git push" to publish your local commits) nothing to commit, working tree clean
Probé
44
Esta respuesta es incorrecta: si la usa sin comprender la situación, puede estar causando problemas en el futuro (¡historial reescrito!). Si comprende la situación, esta no será la solución. Por favor, piense antes de escribir al usar git, ¡y nunca vuelva a escribir el historial sin pensar!
cmaster - reinstalar a monica el
81

Use estos 3 comandos simples

Paso 1 :git checkout <branch_name>

Paso 2 :git pull -s recursive -X theirs

Paso 3 :git reset --hard origin/<branch_name>

Más detalles: https://stackoverflow.com/a/39698570/2439715

Disfrutar.

Abhishek Goel
fuente
3
Esta es la única respuesta que realmente solucionó el problema para mí. Los comandos anteriores extrañamente lo derribaron de 12 a 7 confirmaciones y esto finalmente los eliminó
Ieuan,
1
Estoy de acuerdo en que esto es lo único que funcionó para mí. Estoy convencido de que GIT tiene un trastorno de personalidad múltiple a veces.
Ksed
11
Al igual que @leuan, nada más que git reset --hard origin/masteraclarado para mí.
Dave Land
Lo mismo aquí, estos son los únicos pasos que me funcionaron
Shard_MW
51

Creo que está leyendo mal el mensaje: su rama no está adelantada master, lo está master . Es por delante de origin/master, que es una rama de seguimiento remoto que registra el estado del repositorio remoto desde su última push, pullo fetch. Te está diciendo exactamente lo que hiciste; te adelantaste al control remoto y te recuerda empujar.

Josh Lee
fuente
22
Esto es en realidad después de que empujé. Tuve que tirar (¿o posiblemente buscar?) Para que no tuviera ese mensaje.
SeanJA
26

Alguien dijo que podrías estar leyendo mal tu mensaje, no lo estás. Este problema realmente tiene que ver con su <project>/.git/configarchivo. En ella habrá una sección similar a esta:

[remote "origin"]
    url = <url>
    fetch = +refs/heads/*:refs/remotes/origin/*

Si elimina la línea de búsqueda del archivo .git / config de su proyecto, detendrá "Su rama está por delante de 'origin / master' por Ncommits". molestia de ocurrir.

O eso espero. :)

Código falso mono Rashid
fuente
Lo comprobaré la próxima vez que vea el ahead by x commitsmensaje. No he visto el mensaje en mucho tiempo.
SeanJA
No he visto el mensaje en mucho tiempo. Creo que es porque comencé a crear el repositorio de git localmente, luego lo
empujé
Intenté esto, pero hizo que eGit en Eclipse comenzara a aparecer con un "error interno" cuando intenté confirmar. Sin embargo, Git parecía funcionar bien.
user4815162342
18
¿Qué hace esa línea? ¿Y qué me estoy perdiendo al eliminarlo? (aparte de la molestia)
John Mee
1
Esto funcionó, pero es más como suprimir el error. Agregue la línea de nuevo y comenzará a recibir advertencia nuevamente.
Krishna Pandey
15

Tuve este problema en mi servidor de escenario donde solo hago pulls. Y el restablecimiento completo me ayudó a limpiar HEAD de la misma manera que el control remoto.

git reset --hard origin/master

Entonces ahora tengo otra vez:

On branch master
Your branch is up-to-date with 'origin/master'.
Anatolii Pazhyn
fuente
¡Primero lo intenté sin la bandera dura y funcionó!
kroiz
12

Esto funciono para mi

git reset --hard origin/master

La salida debe verse como

On branch dev HEAD is now at ae1xc41z Last commit message

Али Палитаев
fuente
11

En mi caso fue porque cambié a maestro usando

 git checkout -B master

Solo para sacar la nueva versión de la misma en lugar de

 git checkout master

El primer comando restablece la cabeza del maestro a mis últimas confirmaciones

solía

git reset --hard origin/master

Para arreglar eso

AxCoder
fuente
9

Revisé todas las soluciones en esta página y, afortunadamente, @ anatolii-pazhyn comentó porque su solución fue la que funcionó. Desafortunadamente, no tengo suficiente reputación para votarlo, pero recomiendo probar su solución primero:

git reset --hard origin/master

Lo que me dio:

HEAD is now at 900000b Comment from my last git commit here

Yo también recomiendo:

git rev-list origin..HEAD
# to see if the local repository is ahead, push needed

git rev-list HEAD..origin
# to see if the local repository is behind, pull needed

También puedes usar:

git rev-list --count --left-right origin/master...HEAD
# if you have numbers for both, then the two repositories have diverged

La mejor de las suertes

Ryan Erwin
fuente
4

Tuve este mismo problema en una máquina con Windows. Cuando ejecutaba un git pull origin mastercomando, recibía la advertencia "delante de 'origin / master' by X commits". Descubrí que si en su lugar ejecuté git pull originy NO especifiqué la rama, ya no recibiría la advertencia.

El padre del código
fuente
Creo que esto efectivamente lo hace git fetchdetrás de escena.
Brian Peterson el
"git fetch" no resolvió mi problema, esto sí. Obtuve una lista de las ramas recién agregadas y este mensaje "Usted solicitó extraer del 'upstream' remoto, pero no especificó una rama. Debido a que este no es el control remoto predeterminado configurado para su rama actual, debe especificar una rama en el comando línea." y el siguiente comando "git status" no mostró la advertencia.
Krishna Pandey
2

Simplemente le recuerda las diferencias entre la rama actual y la rama que hace la pista actual. Proporcione más información, incluyendo qué rama se imprime en el mensaje y dónde empuja / tira la rama actual.

wRAR
fuente
2

Aunque esta pregunta es un poco vieja ... Estaba en una situación similar y mi respuesta aquí me ayudó a solucionar un problema similar que tuve

Primero intenta con push -f o la opción de forzar

Si eso no funcionó, es posible que (como en mi caso) los repositorios remotos (o más bien las referencias a repositorios remotos que aparecen en git remote -v ) no se actualicen.

El resultado de lo anterior como su inserción sincronizó su sucursal / local con su sucursal / remota, sin embargo, la memoria caché en su repositorio local todavía muestra la confirmación previa (de la sucursal local ... siempre que solo se haya enviado una confirmación) como HEAD.

Para confirmar el clon anterior, el repositorio en una ubicación diferente e intente comparar HEAD local / branch y HEAD remoto / branch. Si ambos son iguales, entonces probablemente estés enfrentando el problema que hice.

Solución:

$ git remote -v
github  [email protected]:schacon/hw.git (fetch)
github  [email protected]:schacon/hw.git (push)
$ git remote add origin git://github.com/pjhyett/hw.git
$ git remote -v
github  [email protected]:schacon/hw.git (fetch)
github  [email protected]:schacon/hw.git (push)
origin  git://github.com/pjhyett/hw.git (fetch)
origin  git://github.com/pjhyett/hw.git (push)
$ git remote rm origin
$ git remote -v
github  [email protected]:schacon/hw.git (fetch)
github  [email protected]:schacon/hw.git (push)

Ahora haga push -flo siguiente

git push -f github master ### Tenga en cuenta que su comando ya no tiene origin!

Hacer un git pullahora git pull github master

en git statusrecibir

# On branch master

nothing to commit (working directory clean)

Espero que esto sea útil para alguien, ya que la cantidad de vistas es tan alta que la búsqueda de este error casi siempre muestra este hilo en la parte superior

Consulte también gitref para más detalles.

Vikram
fuente
2

En realidad, esto sucedía cuando estaba haciendo un cambio / pago con TortiseGIT.

Mi problema fue que había creado la sucursal basada en otra sucursal local. Creó una entrada de "fusión" /.git/configque se parecía a esto:

[branch "web"]
    merge = refs/heads/develop
    remote = gitserver

Donde cada vez que cambiaba a la rama "web", me decía que tenía más de 100 confirmaciones antes del desarrollo. Bueno, ya no me comprometía a desarrollarme, así que eso era cierto. Pude simplemente eliminar esta entrada y parece estar funcionando como se esperaba. Se realiza un seguimiento adecuado con la referencia remota en lugar de quejarse de estar detrás de la rama de desarrollo.

Como dijo Vikram, este hilo de desbordamiento de pila es el principal resultado en Google cuando busca este problema, así que pensé en compartir mi situación y solución.

Dustin Graham
fuente
2

Me gustaría reiterar lo mismo mencionado por @Marian Zburlia arriba. Funcionó para mí y sugeriría lo mismo a los demás.

git pull origin develop

debe ser seguido por $ git pull --rebase.

Esto eliminará los comentarios que surjan $ git statusdespués del último tirón.

Partho Chatterjee
fuente
2

git fetch resolverá esto por ti

Si mi comprensión es correcta, su local (en caché) origin/masterestá desactualizado. Este comando actualizará el estado del repositorio desde el servidor.

Racicot Guillaume
fuente
1
Agregue una descripción
Mathews Sunny, el
2

Luego, cuando hago un estado de git, me dice que mi rama está adelante por X commits (presumiblemente la misma cantidad de commits que he realizado ).

Mi experiencia es en un entorno de equipo con muchas sucursales. Trabajamos en nuestras propias ramas de características (en clones locales) y fue una de las que git statusmostró que tenía 11 confirmaciones por delante. Mi suposición de trabajo, como el autor de la pregunta, era que +11 era de mis propios compromisos .

Resultó que había introducido cambios de la developrama común en mi rama de características muchas semanas antes, ¡pero lo olvidé! Cuando volví a visitar mi sucursal local de características hoy e hice un git pull origin developnúmero, saltó a +41 confirmaciones por delante. Se había realizado mucho trabajo developy, por lo tanto, mi rama de características local estaba aún más adelantada que la rama de características enorigin repositorio.

Entonces, si recibe este mensaje, piense en cualquier extracción / fusión que pueda haber hecho desde otras sucursales (propias o de otras) a las que tenga acceso. El mensaje solo indica que necesita git pushesos pullcambios ed de nuevo al originrepositorio ('rama de seguimiento') de su repositorio local para sincronizar las cosas.

FPGA-guy
fuente
1

Las respuestas que sugieren git pullo git fetchson correctas.
El mensaje se genera cuando git statusve una diferencia entre .git/FETCH_HEADy .git/refs/remotes/<repository>/<branch>(por ejemplo .git/refs/remotes/origin/master).

El último archivo registra el HEAD desde la última búsqueda (para el repositorio / rama). Hacer git fetchactualiza ambos archivos al HEAD actual de la sucursal.
Por supuesto, si no hay nada que buscar (porque el repositorio local ya está actualizado), entonces .git/FETCH_HEADno cambia.

NoBrassRing
fuente
Este no parece ser el caso para mí: .git/FETCH_HEADcontiene 9f7336c873ccffc772168bf49807e23ff74014d3 branch 'master' of URLy .git/refs/remotes/origin/mastercontiene 9f7336c873ccffc772168bf49807e23ff74014d3, sin embargo, aún recibo el mensaje y git pullni lo git fetchresuelvo ni lo resuelvo
Davide
0

Si recibe este mensaje después de realizar una confirmación para destrabar el archivo en la rama, intente hacer algún cambio en cualquier archivo y realice la confirmación. Aparentemente, no puede realizar una confirmación única que incluye solo el seguimiento del archivo seguido anteriormente. Finalmente, esta publicación me ayudó a resolver todo el problema https://help.github.com/articles/removing-files-from-a-repository-s-history/ . Solo tuve que eliminar el archivo del historial del repositorio.

nurb
fuente