Comment fusionner les modifications à distance sur GitHub?

137

J'obtiens l'erreur suivante, en essayant d'abord le push Github:

[rejected] master -> master (non-fast forward)
error: failed to push some refs to '[email protected]:me/me.git'
To prevent you from losing history, non-fast-forward updates were rejected
Merge the remote changes before pushing again.  See the 'non-fast forward'
section of 'git push --help' for details.

comment puis-je résoudre ce problème et fusionner les modifications à distance?

John
la source

Réponses:

106

Voir la section 'avance non rapide' de ' git push --help ' pour plus de détails.

Vous pouvez effectuer "git pull", résoudre les conflits potentiels et "git push" le résultat. Un "git pull" créera un commit de fusion C entre les commits A et B.

Alternativement, vous pouvez rebaser votre changement entre X et B au-dessus de A, avec "git pull --rebase", et repousser le résultat. Le rebase créera un nouveau commit D qui construit le changement entre X et B au-dessus de A.

Thilo
la source
16
Je continue à rencontrer ça, sauf que si je fais un "git pull", on me dit "Déjà à jour". et si je fais un "git pull --rebase" on me dit que "Current branch master est à jour." Des idées? Merci!
jwl
3
@ larson4 J'ai eu le même problème, mais après avoir fait le git pull, faites un autre commit et ça devrait être bon
Patrick
20
@Patrick @larson J'ai eu un problème similaire causé par le fait que je n'ai pas lu attentivement le message d'erreur. Le rejet concernait une succursale que je n'avais pas vérifiée. La branche où j'étais en fait réussissait. La solution était de git checkout other-branch; git pull; git push; git checkout branch-i-was-working-on.
Noah Spurrier
86

Vous pouvez également forcer une poussée en ajoutant le symbole + avant le nom de votre branche.

git push origin +some_branch
SammyK
la source
1
Merci, celui-ci fonctionne pour moi. Les autres solutions effaceraient complètement l'effet de mongit reset --hard
Oli
1
Merci! J'avais poussé la branche "A" jusqu'à mon application de mise en scène Heroku pour tester certaines fonctionnalités dans un environnement de production. Puis (localement) j'ai fusionné "A" et "B" dans "master" et je voulais pousser "master" dans mon application de mise en scène. Avait toutes sortes de problèmes. Cela a rendu la poussée du «maître» très simple. Merci!
Don Leatham
A travaillé pour moi aussi. Il m'a fallu 4 heures pour trouver le problème. Merci beaucoup. Je lance Netbeans sur une machine locale (Windows 7) et je voulais à chaque poussée sur local, vérifiez sur une machine distante (linux).
Maxim Shoustin
Notez que cette méthode peut ne pas être sûre et qu'elle peut rendre inaccessibles certains commits divergents.
samuil
Cela devrait être la solution acceptée. Les autres solutions ne fonctionnaient pas pour moi
banarun
20

Vous avez probablement des modifications sur github que vous n'avez jamais fusionnées. Essayez git pullde récupérer et de fusionner les modifications, vous devriez alors pouvoir pousser. Désolé si j'ai mal compris votre question.

Jorge Israel Peña
la source
18
Au cas où vous auriez besoin de rejeter les modifications dans le maître distant et de pousser vos propres modifications, essayez d'appuyer avec la touche -f
Hotsyk
13

Si vous "git pull" et qu'il dit "Déjà à jour.", Et obtenez toujours cette erreur, c'est peut-être parce qu'une de vos autres branches n'est pas à jour. Essayez de passer à une autre branche et assurez-vous que celle-ci est également à jour avant de réessayer de "git push":

Basculez vers la branche "foo" et mettez-la à jour:

$ git checkout foo
$ git pull

Vous pouvez voir les branches que vous avez en émettant la commande:

$ git branch
David Calhoun
la source
Pouvez-vous expliquer pourquoi cela fonctionne et est nécessaire? (Cela a résolu mon problème.) Cela me semble tout simplement contre-intuitif. Je ne comprends pas pourquoi git aurait besoin d'une autre branche pour être à jour également pour que je pousse sur la branche master.
Quinxy von Besiex
@QuinxyvonBesiex Je ne suis pas sûr de comprendre moi-même. Cela peut avoir quelque chose à voir avec la structure sous-jacente de Git lui-même, et la façon dont il organise les branches (qui sont fondamentalement les mêmes que les balises pour autant que je sache).
David Calhoun
7

Vous pouvez le forcer à pousser, mais veuillez le faire UNIQUEMENT lorsque vous êtes sûr de ce que vous faites.

La commande est:

git push -f 
JuLy
la source
3

Ce problème peut également se produire lorsque vous avez des balises en conflit. Si votre version locale et votre version distante utilisent le même nom de balise pour différents commits, vous pouvez vous retrouver ici.

Vous pouvez le résoudre en supprimant la balise locale:

$ git tag --delete foo_tag
Zds
la source
2

Lorsque j'ai eu cette erreur, j'ai sauvegardé tout mon dossier de projet. Puis j'ai fait quelque chose comme

$ git config branch.master.remote origin
$ git config branch.master.merge refs/heads/master

... en fonction du nom de votre succursale (si ce n'est pas le maître).

Puis je l'ai fait git pull --rebase. Après cela, j'ai remplacé les fichiers extraits par les fichiers de mon projet sauvegardé. Maintenant, je suis prêt à valider à nouveau mes modifications et à pousser.

IgorGanapolsky
la source
0

1) Forcer un pull pour écraser les changements locaux

Si vous ne vous souciez pas des modifications effectuées localement et que vous souhaitez obtenir le code du référentiel, vous pouvez forcer une extraction. Cela écrasera toutes les modifications locales effectuées sur votre ordinateur, une copie en double de la version dans le référentiel apparaîtra.

Exécutez les commandes suivantes dans votre IDE:

git reset - dur

git pull

Cela détruira instantanément tous vos changements locaux, alors assurez-vous que vous savez ce que vous faites et que vous n'avez pas besoin de vos changements locaux.

2) Garder les deux changements (locaux et du repo)

Si vous souhaitez conserver les deux modifications (modifications effectuées localement et modifications présentes dans le référentiel), vous pouvez ajouter et valider vos modifications. Lorsque vous tirez, il y aura évidemment un conflit de fusion. Ici, vous pouvez utiliser les outils de votre IDE (tels que Difftool et mergetool) pour comparer les deux morceaux de code et déterminer les modifications à conserver et celles à supprimer. C'est la voie médiane; aucune modification ne sera perdue tant que vous ne les supprimerez pas manuellement.

git ajouter $ the_file_under_error

git commit

git pull
Preeti Duhan
la source