86 votes

Git dit que la branche locale est derrière la branche distante, mais ce n'est pas le cas.

Scénario :

  1. Je crée une nouvelle branche

  2. le pirater

  3. le commettre

  4. le pousser

  5. le pirater encore un peu

  6. commettre à nouveau

  7. essayer de pousser à nouveau

Git répond :

Les mises à jour ont été rejetées parce que l'extrémité de votre branche actuelle est derrière son homologue distant. etc.

Je suis le seul à pirater cette branche - personne d'autre n'y touche. La branche distante est en fait derrière l'agence locale. Je ne devrais pas avoir à tirer du tout.

(Et si je tire, Git signale les conflits entre les deux, et m'oblige à fusionner la branche dans la sienne).

Pourquoi cela se produit-il (probablement) ? Et comment puis-je le diagnostiquer/le réparer ?

Pour être clair, je ne bifurque nulle part, et personne d'autre y travaille :

Remote: Commit A -------- Commit B  

Local:  Commit A -------- Commit B -------- Commit C  

C est une continuation directe de B, sans bifurcation. Mais git pense que C est une branche de A :

Remote: Commit A -------- Commit B  

                  ------- Commit C  
                /  
Local:  Commit A -------- Commit B  

Ce n'est pas le cas ; c'est une continuation directe de B.

1 votes

La sortie de git remote -v et git show remote origin (en supposant que l'origine est la télécommande avec laquelle vous avez des problèmes) peut être utile.

198voto

Chronial Points 15402

Vous avez probablement fait une réécriture de l'histoire ? Votre branche locale a divergé de celle du serveur. Exécutez cette commande pour mieux comprendre ce qui s'est passé :

gitk HEAD @{u}

Je vous recommande vivement d'essayer de comprendre d'où vient cette erreur. Pour la corriger, il suffit d'exécuter :

git push -f

Le site -f en fait une "poussée forcée" et écrase la branche sur le serveur. C'est très dangereux lorsque l'on travaille en équipe. Mais puisque vous êtes seul et que vous êtes sûr que votre état local est correct. cela devrait aller. Vous risquez de perdre l'historique des engagements si ce n'est pas le cas.

13 votes

C'était ça. À l'étape 2, j'ai fait un "Amend Last Commit", puis j'ai poussé, puis j'ai piraté un peu plus, puis j'ai essayé de pousser à nouveau. J'ai mal compris la façon dont Amend fonctionne. Merci !

4 votes

Cela semble très utile, mais quelqu'un pourrait-il expliquer la syntaxe "HEAD @{u}" ?

5 votes

Les deux HEAD et le @{u} se réfèrent à des commits. Ils indiquent à gitk, quelles branches afficher. HEAD fait référence à la branche actuellement extraite, @{u} est le diminutif de HEAD@{u} qui représente la branche amont de la branche actuellement extraite. Ainsi, par exemple master qui est généralement origin/master .

11voto

Anshu Points 7149

Puisque vous obtenez cette erreur :

Updates were rejected because the tip of your current branch is behind its remote counterpart.

Utilisez git pull pour tirer les dernières modifications du dépôt distant vers votre dépôt local. Dans ce cas, le retrait des modifications nécessitera une fusion car vous avez apporté des modifications à votre dépôt local.

Voici un exemple. Supposons que votre dernier pull de l'origine/branche était au Commit B. Vous avez terminé et commis un travail (Commit C). Au même moment, quelqu'un d'autre a terminé son travail et l'a poussé vers origin/branch (Commit D). Il y aura besoin d'une fusion entre ces deux branches.

local branch:                         --- Commit C 
                                    /
                                   /
                                  /
origin/branch: Commit A ------ Commit B ---- Commit D

Comme vous êtes celui qui veut pousser, git vous oblige à effectuer la fusion. Pour ce faire, vous devez d'abord extraire les modifications de origin/branch.

local branch:                         --- Commit C -- Commit E
                                    /               /           
                                   /               /             
                                  /               /               
origin/branch: Commit A ------ Commit B ---- Commit D 

Après avoir terminé la fusion, vous serez maintenant autorisé à faire avancer rapidement l'origine/branche vers le Commit E en poussant vos changements.

Git exige que vous gériez les fusions vous-même car une fusion peut entraîner des conflits.

6voto

theRana Points 143

La solution est très simple et a fonctionné pour moi.

Essayez ceci :

git pull --rebase <url>

puis

git push -u origin master

4voto

Daniel Points 162

Cela m'est arrivé lorsque j'ai essayé de pousser la branche de développement (j'utilise git flow). Quelqu'un avait poussé des mises à jour vers master. Pour le corriger, je l'ai fait :

git co master
git pull

Ce qui a provoqué ces changements. Alors,

git co develop
git pull

Ce qui n'a rien fait. Je pense que la branche de développement a déjà poussé malgré le message d'erreur. Tout est à jour maintenant et aucune erreur.

0voto

Aquarius Power Points 242

Pour le diagnostiquer, il faut suivre cette réponse .

Mais pour le réparer, en sachant que vous êtes le seul à le changer, faites-le :
1 - sauvegarder votre projet (je n'ai fait que les fichiers sur git, dossier ./src)
2 - git pull
3 - restaurer votre sauvegarde sur les nombreux fichiers "ratés" (avec des indicateurs de fusion)

J'ai essayé git pull -s recursive -X ours mais ça n'a pas fonctionné comme je le voulais, ça pourrait être une option, mais il faut d'abord faire une sauvegarde !!!

Assurez-vous que les différences/changements (au gui git) sont inexistants. C'est mon cas, il n'y a rien à fusionner du tout, mais github continue de dire que je devrais fusionner...

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X