Que signifie «Les mises à jour non rapides de Git push ont été rejetées»?

153

J'utilise Git pour gérer mes deux ordinateurs et mon développement. J'essaie de valider les modifications sur GitHub et j'obtiens l'erreur.

Impossible de pousser certains ref à <repo>. Pour vous empêcher de perdre l'historique, les mises à jour non rapides ont été rejetées. Fusionner les modifications à distance avant de pousser à nouveau.

Quelle pourrait en être la cause et comment puis-je résoudre ce problème?

ÉDITER:

Le retrait du repo renvoie les éléments suivants:

* branch master-> master (pas d'avance rapide) Déjà à jour

Pousser me donne toujours l'erreur susmentionnée.

Moshe
la source

Réponses:

136

GitHub a une belle section intitulée " Gérer les erreurs " sans avance rapide " "

Cette erreur peut être un peu accablante au début, n'ayez crainte.
En termes simples, git ne peut pas effectuer le changement sur la télécommande sans perdre les validations, il refuse donc le push .
Cela est généralement causé par un autre utilisateur qui pousse vers la même branche. Vous pouvez remédier à cela en récupérant et en fusionnant la branche distante, ou en utilisant pull pour effectuer les deux à la fois.

Dans d'autres cas, cette erreur est le résultat de modifications destructives effectuées localement à l'aide de commandes telles que git commit --amendou git rebase.
Bien que vous puissiez remplacer la télécommande en ajoutant --forceà la pushcommande, vous ne devriez le faire que si vous êtes absolument certain que c'est ce que vous voulez faire.
Les poussées forcées peuvent causer des problèmes aux autres utilisateurs qui ont récupéré la branche distante et sont considérées comme une mauvaise pratique. En cas de doute, ne forcez pas .


Git ne peut pas apporter de modifications sur la télécommande comme une fusion à avance rapide, ce qu'une référence Visual Git illustre comme:

texte alternatif

Ce n'est pas exactement votre cas, mais cela aide à voir ce qu'est une "avance rapide" (où le HEADd'une branche est simplement déplacé vers un nouveau commit plus récent).


Le " branch master->master (non-fast-forward) Already-up-to-date" est généralement destiné aux succursales locales qui ne suivent pas leur homologue distant.
Voir par exemple cette question SO " git pull dit à jour mais git push rejette l'avance non rapide ".
Ou les deux branches sont connectées, mais en désaccord avec leur histoire respective:
voir " Histoire GIT sans fin - qu'est-ce que je fais de mal ici? "

Cela signifie que votre branche subversion et votre branche git master distante ne sont pas d'accord sur quelque chose.
Certains changements ont été poussés / validés sur l'un qui n'est pas dans l'autre.
Lancez-vous gitk --all, et cela devrait vous donner une idée de ce qui n'a pas fonctionné - cherchez des «fourchettes» dans l'histoire.

VonC
la source
53

Cela signifie qu'il y a eu d'autres commits poussés vers le référentiel distant qui diffèrent de vos commits. Vous pouvez généralement résoudre ce problème avec un

git pull

avant de pousser

En fin de compte, "avance rapide" signifie que les validations peuvent être appliquées directement au sommet de l'arborescence de travail sans nécessiter de fusion.

minichate
la source
2
C'est ce qui a fonctionné pour moi! J'ai oublié que j'avais changé le readme.md sur le site du référentiel!
ryanwinchester
14

Une mise à jour à avance rapide est l'endroit où les seuls changements d'un côté sont après le commit le plus récent de l'autre côté, il n'est donc pas nécessaire de fusionner. Cela signifie que vous devez fusionner vos modifications avant de pouvoir pousser.

bdukes
la source
8

vous voudrez peut-être utiliser la force avec l'opération push dans ce cas

git push origin master --force

uspinar
la source
1
C'est faux. la source totale de github sera supprimée et poussée seulement votre nouvelle source ancienne source est supprimée
logeshpalani98
6

Ne faites jamais de choses git -fà faire pushcar cela peut entraîner des conséquences désastreuses par la suite.

Il vous suffit de faire une git pullde votre succursale locale.

Ex:

git pull origin 'your_local_branch'

puis faites un git push

Abhishek Thomas
la source
0

Vous devez fusionner et résoudre le conflicts locallyavant de pousser vos modifications vers le repo / fork distant.

1) tirer (récupérer et fusionner)

$ git pull remote branch 

2) Poussez les changements

$ git push remote branch 

Néanmoins, vous avez le choix rapide de pushforcer en utilisant l' --forceoption, mais cela doit être évité car cela peut entraîner une perte de modifications ou affecter gravement les autres contributeurs.

Muhammad Soliman
la source