git: les mises à jour ont été rejetées car la télécommande contient du travail que vous n'avez pas localement


114

Je travaille dans une équipe avec quelques développeurs utilisant git sur BitBucket. Nous travaillons tous sur une devbranche, sans pousser masterjusqu'à une sortie.

Un des développeurs a commis un code incorrect qui a écrasé le mien par accident, et maintenant j'essaye de renvoyer le code correct au dépôt. Je lis cette erreur depuis quelques jours maintenant, je ne peux plus pousser vers le repo car j'obtiens l'erreur suivante:

 ! [rejected]        master -> dev (fetch first)
error: failed to push some refs to 'https://myusername@bitbucket.org/repo_user/repo_name.git'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

Je suis les instructions et pull, mais je reçois ensuite un conflit de fusion. Après avoir entré un message pour le conflit de fusion, mon code local est maintenant le code incorrect que l'autre développeur a téléchargé par accident (comme prévu par le pull). Je remplace donc le code incorrect par la sauvegarde que j'ai copiée avant de m'engager, et lorsque j'essaye de pousser à nouveau, j'obtiens la même erreur.

C'est vraiment frustrant, je veux vraiment aider mon équipe et contribuer, mais je ne peux pas à cause de cette erreur. Quelqu'un sait-il comment résoudre ce problème? J'apprécierais beaucoup toute aide.

Voici les commandes que j'exécute pour commettre, si cela aide quelqu'un:

git pull remotename master:dev
git add --all
git commit -m "some message"
git pull remotename master:dev
git push remotename master:dev

J'aurais pensé que si j'avais gardé cet ordre, je ne recevrais pas de conflits de fusion. Je suppose que j'avais tort. Merci encore

Mise à jour: je dois ajouter que j'ai cherché pendant quelques heures sur Google et stackoverflow, et suivi différentes instructions, mais je ne peux toujours pas pushaller à la devbranche.

Réponses:


42

git pull <remote> master:devva récupérer la remote/masterbranche et la fusionner dans votre local/devbranche.

git pull <remote> devrécupérera la remote/devbranche et la fusionnera dans votre branche actuelle.

Je pense que vous avez dit que la validation en conflit était activée remote/dev, c'est donc la branche que vous aviez probablement l'intention de récupérer et de fusionner.

Dans ce cas, vous ne fusionniez pas réellement le conflit dans votre branche locale, ce qui est un peu étrange puisque vous avez dit que vous aviez vu le code incorrect dans votre copie de travail. Vous voudrez peut-être vérifier ce qui se passe remote/master.


1
Wow ... je n'ai jamais su ça. Mais cela a beaucoup de sens maintenant. La branche principale était également incorrecte, donc votre réponse clarifie toute ma question. Je suis encore un peu nouveau dans git. Merci beaucoup de m'avoir dit la différence entre ces deux!
delos

6
La meilleure option pour moi était git pull --rebase.
derekmx271

154

Utilisez cette commande dans le terminal

git push -f origin master


49
L'utilisation de l'indicateur de poussée forcée (-f) est très dangereuse et ne devrait jamais faire partie de votre flux de travail régulier
Spaideri

5
Évalué car il me manque un avertissement dans cette réponse.
Melebius

2
Ooh! Cela force le référentiel à se réécrire.
Azarsa

3
J'ai eu la même erreur avec github et je l'ai corrigée avec cette commande, @theeastcoastwest pourquoi dites-vous que c'est dangereux? quelle est votre raison "
simon

3
@simon c'est dangereux car il ignore le travail qui est dans remote et force vos modifications sur le repo. Donc, si vous ne voulez pas gâcher le travail de votre équipe, NE forcez PAS à pousser.
Gásten le

42

Cela se produit lorsque nous essayons de pousser vers un référentiel distant mais que nous avons créé un nouveau fichier sur distant qui n'a pas encore été extrait, disons Readme. Dans ce cas, comme le dit l'erreur

git rejette la mise à jour

car nous n'avons pas mis à jour la télécommande dans notre environnement local. Alors tirez d'abord de la télécommande

git pull

Il mettra à jour votre référentiel local et ajoutera un nouveau Readmefichier. Ensuite, transmettez les modifications mises à jour à la télécommande

git push origin master

Je faisais git pull origin developdans ma branche de développement locale, mais maintenant, le faire git pullfonctionne bien pour moi, je ne sais pas pourquoi.
Alex

parce que par défaut, si votre branche locale est synchronisée avec la branche distante et que vous êtes extrait dans cette branche, vous n'avez pas besoin de spécifier une branche git pullsuffit
Himanshu

11

Cela se produit généralement lorsque le dépôt contient des éléments qui ne sont pas là localement. Donc, pour pousser nos changements, dans ce cas, nous devons intégrer les changements à distance, puis pousser.

Alors créez une attraction à distance

git pull origin master

Puis poussez les modifications sur cette télécommande

git push origin master

10

Force à pousser

git push -f origin master


2
Cela devrait probablement être accompagné d'un avertissement.
Chris le

7

Je l'ai réparé, je ne sais pas exactement ce que j'ai fait. J'ai simplement essayé de pousser et de tirer en utilisant:

git pull <remote> dev au lieu de git pull <remote> master:dev

J'espère que cela aidera quelqu'un s'il a le même problème.


6

Vous devez saisir:

$ git pull
$ git fetch 
$ git merge

Si vous utilisez un git push origin master --force, vous aurez un gros problème.


5
Pourquoi avez-vous besoin d'utiliser git fetchet à git mergenouveau manuellement après avoir exécuté git pullqui les contient ?
Melebius

6

Vous pouvez essayer ceci: git pull origin master --rebase


2
Salut Eduardo! Cela a fonctionné pour moi. Mais pouvez-vous expliquer pourquoi cela fonctionne? Que fait exactement cette commande?
Akshaya Natarajan le

4

En fait, github est beaucoup plus simple que nous ne le pensons et cela se produit absolument chaque fois que nous essayons de pousser même après avoir explicitement inséré des fichiers dans notre référentiel git, donc, pour résoudre le problème, essayez simplement ...

: git pull

puis..

: git push

Remarque: si vous êtes accidentellement coincé dans l'éditeur vim après avoir extrait votre référentiel, ne vous inquiétez pas, fermez simplement l'éditeur vim et essayez de pousser :)


4

J'ai fait les étapes ci-dessous. enfin ça marche bien.

Pas

1) git init

2) git status (pour vérifier l'état)

3) git add. (ajoutez tout le fichier de modification (.))

4) git commit -m "<pass your comment>"

5) git remote ajouter l'origine "<pass your project clone url>"

6) git pull --allow-unrelated-histories "<pass your project clone url>"master

7) git push -u "<pass your project clone url>"master


2

J'ai eu cette erreur et c'était parce qu'il y avait une mise à jour sur le serveur mais SourceTree n'affichait aucune mise à jour disponible (peut-être parce que j'étais hors ligne lors de sa dernière vérification). J'ai donc fait un rafraîchissement dans l'arborescence des sources et maintenant il montre 2 éléments à pousser au lieu de 1 élément.

Assurez-vous donc d'appuyer sur Actualiser ou Tirez si vous obtenez cette erreur, puis réessayez.


1

git pull --rebase origin master

git push origin master


git push -f origin master

Avertissement git push -f origin master

  • pousse avec force sur le référentiel existant et supprime également les référentiels précédents, donc si vous n'avez pas besoin de versions précédentes, cela pourrait être utile


1

La meilleure option pour moi et cela fonctionne et simple

git pull --rebase

puis

git push

bonne chance


1

Voici comment j'ai résolu ce problème:

  1. git pull origin master
  2. git push origin master

Cela se produit généralement lorsque votre branche distante n'est pas mise à jour. Et après cela, si vous obtenez une erreur comme "Veuillez entrer un message de validation" Reportez-vous à ceci (Pour moi, la réponse de xiaohu Wang a fonctionné :))


0

J'ai d'abord eu un projet SSDT VS. Je voulais pousser le projet tel que je l'avais sur Github. Je voulais que ce push soit la version initiale de mon dépôt commençant la branche principale. La suggestion de Donal de git push -f origin master était le moyen le plus simple (que j'ai vu) d'accomplir cela. Comme je n'avais pas à me soucier de réécrire quoi que ce soit, cela semblait logique.


0

J'ai eu le même problème. Il est arrivé que j'ai créé le fichier .Readme sur le référentiel sans le tirer au préalable.

Vous voudrez peut-être supprimer le fichier .Readme ou le tirer avant de pousser.


Je ne suis pas sûr que cette réponse à une question vieille de 5 ans apporte une valeur supplémentaire, et elle ne fournit pas de solution au problème spécifique du PO. Puisque vous êtes un nouveau contributeur, veuillez consulter un guide sur la façon de répondre aux questions: stackoverflow.com/help/how-to-answer
Sotiris Koukios-Panopoulos

0

vous pouvez utiliser

git pull --rebase <your_reponame> <your_branch>

cela vous aidera au cas où vous auriez des modifications non encore enregistrées sur votre dépôt local. surtoutREADME.md

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.