git: Votre branche est en avance par X s'engage

379

Comment cela se produit-il réellement?

Je travaille dans un repo par moi-même en ce moment, voici donc mon flux de travail:

  1. Changer les fichiers
  2. Commettre
  3. Répétez 1-2 jusqu'à ce que vous soyez satisfait
  4. Poussez pour maîtriser

Ensuite, quand je fais un, git statusil me dit que ma branche est en avance par X commits (probablement le même nombre de commits que j'ai fait). Est-ce parce que lorsque vous poussez le code, il ne met pas à jour vos fichiers mis en cache localement (dans les dossiers .git)? git pullsemble «corriger» ce message étrange, mais je suis toujours curieux de savoir pourquoi cela se produit, peut-être que j'utilise mal git?


y compris quelle branche est imprimée dans le message

Ma branche locale est en avance sur le maître

où poussez-vous / tirez la branche actuelle

Je pousse vers GitHub et tire sur n'importe quel ordinateur sur lequel je travaille à ce moment-là, ma copie locale est toujours à jour car je suis la seule à y travailler.

il ne vérifie pas réellement le dépôt à distance

C'est ce que je pensais, j'ai pensé que je m'assurerais que ma compréhension était correcte.

lui passez-vous des arguments supplémentaires?

Pas ceux que je peux voir, peut-être y a-t-il une configuration amusante de mon côté?

$ git status
# On branch master
# Your branch is ahead of 'origin/master' by 1 commit.
#
nothing to commit (working directory clean)
SeanJA
la source
Comment procédez-vous pushet quels sont vos paramètres de configuration distants et de branche?
CB Bailey
2
il ne vérifie pas réellement le référentiel distant, vous devez faire un git fetch pour récupérer les dernières informations sur le repo distant après avoir effectué le push, cela mettra à jour la branche "distante" locale qu'il utilise pour effectuer le suivi.
Sekhat
2
@Sekhat: Bien git statusque ne vérifie pas le référentiel distant, le git pullfait. Si vous disposez d'une branche de suivi pour un référentiel vers lequel vous effectuez une poussée, git pushmettra à jour votre branche de suivi locale pour refléter le nouvel état de la branche distante si votre transmission réussit. C'est pourquoi j'ai posé des questions sur la configuration du demandeur, car si cela ne se passe pas correctement, il y a probablement une erreur de configuration.
CB Bailey
git status? vraiment? mon git statusne me dit jamais jusqu'où ma branche est en avance .. lui passez-vous des arguments supplémentaires?
hasen
4
@hasen j: git statusne va pas dans le référentiel distant pour vérifier si la branche distante a été mise à jour. Il vous indique la longueur d'avance de votre branche locale par rapport à votre branche de suivi à distance stockée localement . Le problème est qu'un normal git push(ainsi que l'extraction et la traction) devrait mettre à jour la branche de suivi à distance et pour le demandeur, cela ne semble pas fonctionner. Pour voir pourquoi nous devons voir à la fois la forme exacte de git pushcelle-ci et la configuration du référentiel local, mais comme le demandeur a déjà accepté une réponse, je ne vois pas cela se produire maintenant.
CB Bailey

Réponses:

508

Si vous obtenez ce message après avoir fait un git pull remote branch, essayez de le suivre avec un git fetch. (Facultativement, exécutez git fetch -ppour élaguer les branches supprimées du référentiel)

Fetch semble mettre à jour la représentation locale de la branche distante, ce qui ne se produit pas nécessairement lorsque vous effectuez un git pull remote branch.

Riches
la source
1
Bravo. C'était vraiment le problème. J'ai commencé par créer un référentiel sur le code google. Ensuite, j'ai cloné ce référentiel sur mon ordinateur portable et j'y travaille et je pousse les modifications, laptop => code.google. J'avais l'habitude d'obtenir ce message sur mon serveur où j'avais créé un clone de référentiel de code code.google et j'avais l'habitude de tirer les modifications. Je pense que la récupération est nécessaire pour mettre à jour la base de données locale.
rjha94
2
Nous avons eu le même problème ici car une autre branche (A) pointait vers le même commitid de master. Le fait de tirer A puis de tirer maître a entraîné cette même situation. Lorsque git a tiré A, le commitid a été mis à jour pour durer, donc en tirant master il n'a rien à tirer réellement, donc git n'a pas mis à jour le dernier commitid maître et a averti d'être "en avance sur master".
Uberto
8
Merci, même si j'ai remarqué une chose étrange. "git fetch origin master" n'aide pas, mais "git fetch origin" le fait. Je suis sur la branche master, donc je ne sais pas comment "git fetch origin" ferait quelque chose de différent dans le contexte.
Parag
2
@Parag voir stackoverflow.com/questions/26350876/… pour une explication des différences entre ces deux commandes, et comment peut-être modifier le fichier de configuration pour changer le comportement afin que git fetch remote branch mette également à jour la référence de la branche de suivi à distance, donc git_status ne signale pas «en avance».
Anatortoise House du
2
@Parag, également stackoverflow.com/questions/7365415/…, la réponse traite des détails de la désynchronisation de ORIG_HEAD et FETCH_HEAD, provoquant l'avertissement d'état et d'éventuelles corrections du fichier de configuration.
Anatortoise House du
138

Utilisation

git pull --rebase

L'option --rebase signifie que git déplacera votre commit local de côté, se synchronisera avec la télécommande et essaiera ensuite d'appliquer vos commits du nouvel état.

Marian Zburlea
la source
3
Un très bon moyen d'éviter les fusions inutiles et d'avoir un arbre plus propre à l'origine!
Hatef
1
J'ai essayé cette commande, mais j'ai toujours le même problème ...$ 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
bbh
4
Cette réponse est fausse: si vous l'utilisez sans comprendre la situation, vous risquez de créer des ennuis pour les temps à venir (histoire réécrite!). Si vous comprenez la situation, ce ne sera pas la solution. Veuillez réfléchir avant de taper lors de l'utilisation git, et ne réécrivez jamais sans réfléchir !
cmaster - réintègre monica
81

Utilisez ces 3 commandes simples

Étape 1 :git checkout <branch_name>

Étape 2 :git pull -s recursive -X theirs

Étape 3 :git reset --hard origin/<branch_name>

Plus de détails: https://stackoverflow.com/a/39698570/2439715

Prendre plaisir.

Abhishek Goel
la source
3
C'est la seule réponse qui a réellement résolu le problème pour moi. Les commandes ci-dessus l'ont étrangement fait tomber de 12 à 7 commits et cela a finalement supprimé ceux-ci
Ieuan
1
Je suis d'accord pour dire que c'est la seule chose qui a fonctionné pour moi. Je suis convaincu que GIT a parfois des troubles de la personnalité multiples.
ksed
11
Comme @leuan, rien ne l'a git reset --hard origin/masterclarifié pour moi.
Dave Land
Même chose ici, ce sont les seules étapes qui ont fonctionné pour moi
Shard_MW
51

Je pense que vous avez mal interprété le message - votre branche n'est pas en avance master, elle l' est master . Il est avant origin/master, qui est une branche de suivi à distance qui enregistre l'état du dépôt distant de votre dernier push, pullou fetch. Cela vous dit exactement ce que vous avez fait; vous avez pris de l'avance sur la télécommande et cela vous rappelle de pousser.

Josh Lee
la source
22
C'est en fait après avoir poussé. J'ai dû tirer (ou éventuellement aller chercher?) Pour qu'il ne reçoive pas ce message.
SeanJA
26

Quelqu'un a dit que vous lisiez peut-être mal votre message, vous ne l'êtes pas. Ce problème est en fait lié à votre <project>/.git/configfichier. Il y aura une section similaire à ceci:

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

Si vous supprimez la ligne d'extraction du fichier .git / config de votre projet, vous arrêterez le message "Votre branche est en avance sur 'origine / maître' par les Nvalidations." ennui de se produire.

Ou du moins j'espère. :)

Fake Code Monkey Rashid
la source
Je vérifierai cela la prochaine fois que je verrai le ahead by x commitsmessage. Je n'ai pas vu le message depuis un moment.
SeanJA
Je n'ai pas vu le message depuis un moment. Je pense que c'est parce que j'ai commencé à créer le dépôt git localement, puis à le pousser vers un dépôt distant au lieu de l'inverse ...
SeanJA
J'ai essayé, mais eGit dans Eclipse a commencé à apparaître avec une "erreur interne" lorsque j'ai essayé de valider. Git lui-même semblait bien fonctionner, cependant.
user4815162342
18
Que fait cette ligne? et qu'est-ce que je manque en le supprimant? (à part le désagrément)
John Mee
1
Cela a fonctionné, mais c'est plus comme supprimer l'erreur. Ajoutez la ligne en arrière et vous recommencerez à recevoir un avertissement.
Krishna Pandey
15

J'ai eu ce problème sur mon serveur de scène où je ne tire que. Et la réinitialisation matérielle m'a aidé à nettoyer HEAD de la même manière que la télécommande.

git reset --hard origin/master

Alors maintenant, j'ai encore:

On branch master
Your branch is up-to-date with 'origin/master'.
Anatolii Pazhyn
la source
J'ai d'abord essayé sans le drapeau --hard et cela a fonctionné!
kroiz
12

Cela a fonctionné pour moi

git reset --hard origin/master

La sortie doit ressembler à

On branch dev HEAD is now at ae1xc41z Last commit message

Али Палитаев
la source
11

Dans mon cas, c'est parce que je suis passé au master en utilisant

 git checkout -B master

Juste pour en tirer la nouvelle version au lieu de

 git checkout master

La première commande réinitialise le chef du maître à mes derniers commits

j'ai utilisé

git reset --hard origin/master

Pour résoudre ce problème

AxCoder
la source
9

J'ai parcouru toutes les solutions sur cette page, et heureusement @ anatolii-pazhyn a commenté parce que sa solution était celle qui fonctionnait. Malheureusement, je n'ai pas assez de réputation pour le voter, mais je recommande d'essayer d'abord sa solution:

git reset --hard origin/master

Ce qui m'a donné:

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

Je recommande également:

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

Vous pouvez aussi utiliser:

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

Bonne chance

Ryan Erwin
la source
4

J'ai eu ce même problème sur une machine Windows. Lorsque j'exécutais une git pull origin mastercommande, j'obtenais l'avertissement "en avance sur 'origine / maître' par X commits". J'ai trouvé que si je courais à la place git pull originet ne spécifiais PAS la branche, je ne recevrais plus l'avertissement.

Le Père du Code
la source
Je pense que cela se produit effectivement en git fetchcoulisses.
Brian Peterson
"git fetch" n'a pas résolu mon problème, c'est le cas. J'ai reçu la liste des branches nouvellement ajoutées et ce message "Vous avez demandé de tirer de la télécommande" en amont ", mais vous n'avez pas spécifié de branche. Parce que ce n'est pas la télécommande configurée par défaut pour votre branche actuelle, vous devez spécifier une branche sur la commande ligne." et la prochaine commande "git status" n'a pas montré l'avertissement.
Krishna Pandey
2

Il vous rappelle simplement les différences entre la branche actuelle et la branche qui fait la piste actuelle. Veuillez fournir plus d'informations, y compris la branche imprimée dans le message et où pousser / tirer la branche actuelle.

wRAR
la source
2

Bien que cette question soit un peu vieille ... J'étais dans une situation similaire et ma réponse ici m'a aidé à résoudre un problème similaire que j'avais

Essayez d'abord avec push -fou forcez l'option

Si cela ne fonctionne pas, il est possible que (comme dans mon cas) les référentiels distants (ou plutôt les références aux référentiels distants qui s'affichent git remote -v) ne soient pas mis à jour.

Le résultat de ce qui précède étant que votre push a synchronisé votre branche / locale avec votre branche / distante, le cache de votre référentiel local affiche toujours la validation précédente (de la branche / locale ... à condition qu'une seule validation ait été poussée) en tant que HEAD.

Pour confirmer le clonage ci-dessus, le référentiel à un emplacement différent et essayez de comparer le HEAD local / de branche et le HEAD distant / de branche. S'ils sont tous les deux identiques, vous êtes probablement confronté au problème que j'ai rencontré.

Solution:

$ 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)

Maintenant, procédez push -fcomme suit

git push -f github master ### Notez que votre commande n'en a originplus!

Faites un git pullmaintenant git pull github master

à la git statusréception

# On branch master

nothing to commit (working directory clean)

J'espère que cela est utile pour quelqu'un car le nombre de vues est si élevé que la recherche de cette erreur répertorie presque toujours ce fil en haut

Voir également gitref pour plus de détails

Vikram
la source
2

En fait, cela s'est produit lorsque je faisais un changement / paiement avec TortiseGIT.

Mon problème était que j'avais créé la branche basée sur une autre branche locale. Il a créé une entrée de «fusion» /.git/configqui ressemblait à ceci:

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

Lorsque, chaque fois que je passais à la branche "Web", cela me disait que j'avais plus de 100 engagements avant de développer. Eh bien, je ne m'engageais plus à me développer, c'était vrai. J'ai pu simplement supprimer cette entrée et elle semble fonctionner comme prévu. Il suit correctement la référence distante au lieu de se plaindre d'être derrière la branche de développement.

Comme Vikram l'a dit, ce fil Stack Overflow est le meilleur résultat de Google lors de la recherche de ce problème, j'ai donc pensé partager ma situation et ma solution.

Dustin Graham
la source
2

Je voudrais réitérer la même chose que celle mentionnée par @Marian Zburlia ci-dessus. Cela a fonctionné pour moi et suggérerait la même chose aux autres.

git pull origin develop

devrait être suivi de $ git pull --rebase.

Cela supprimera les commentaires à venir $ git statusaprès la dernière traction.

Partho Chatterjee
la source
2

git fetch va résoudre cela pour vous

Si ma compréhension est correcte, votre local (mis en cache) origin/masterest obsolète. Cette commande mettra à jour l'état du référentiel à partir du serveur.

Guillaume Racicot
la source
1
Veuillez ajouter une description
Mathews Sunny
2

Ensuite, quand je fais un statut git, cela me dit que ma branche est en avance par X commits (probablement le même nombre de commits que j'ai fait ).

Mon expérience est dans un environnement d'équipe avec de nombreuses branches. Nous travaillons dans nos propres branches de fonctionnalités (dans les clones locaux) et c'est l'une de celles qui a git statusmontré que j'avais 11 engagements à venir. Mon hypothèse de travail, comme l'auteur de la question, était que +11 provenait de mes propres commits .

Il s'est avéré que j'avais apporté des modifications de la developbranche commune à ma branche de fonctionnalités plusieurs semaines plus tôt - mais j'ai oublié! Lorsque j'ai revu ma branche de fonctionnalités locales aujourd'hui et que j'ai fait un git pull origin developchiffre, je suis passé à +41 commits. Beaucoup de travail avait été fait dans developet donc ma branche de fonctionnalité locale était encore plus en avance sur la branche de fonctionnalité sur leorigin référentiel.

Donc, si vous obtenez ce message, repensez à tous les pulls / fusions que vous auriez pu faire à partir d'autres branches (de votre choix ou d'autres) auxquelles vous avez accès. Le message indique simplement que vous avez besoin de git pushces pullmodificationsorigin référentiel (`` branche de suivi '') de votre référentiel local pour synchroniser les choses.

FPGA-guy
la source
1

Les réponses qui suggèrent git pullou git fetchsont correctes.
Le message est généré quand git statusvoit une différence entre .git/FETCH_HEADet.git/refs/remotes/<repository>/<branch> (par exemple.git/refs/remotes/origin/master ).

Ce dernier fichier enregistre le HEAD de la dernière extraction (pour le référentiel / la branche). Faire git fetchmet à jour les deux fichiers à la tête actuelle de la branche.
Bien sûr, s'il n'y a rien à récupérer (car le référentiel local est déjà à jour), .git/FETCH_HEADcela ne change pas.

NoBrassRing
la source
Cela ne semble pas être le cas pour moi: .git/FETCH_HEADcontient 9f7336c873ccffc772168bf49807e23ff74014d3 branch 'master' of URLet .git/refs/remotes/origin/mastercontient 9f7336c873ccffc772168bf49807e23ff74014d3, pourtant je reçois toujours le message et ni git pullne le git fetchrésout
Davide
0

Si vous obtenez ce message après avoir effectué une validation afin de ne pas suivre le fichier dans la branche, essayez d'apporter des modifications dans n'importe quel fichier et effectuez une validation. Apparemment, vous ne pouvez pas faire de commit unique qui ne comprend que le suivi du fichier précédemment suivi. Enfin, ce message m'a aidé à résoudre tout le problème https://help.github.com/articles/removing-files-from-a-repository-s-history/ . Je viens de supprimer le fichier de l'historique du référentiel.

nurb
la source