904 votes

Les mises à jour ont été rejetées car l'extrémité de votre branche actuelle est en retard par rapport à son homologue distant

Notre flux de travail est le suivant. Nous avons une branche appelée dev que je peux atteindre à origin/dev. Lorsque nous apportons des modifications, nous créons une branche à partir de dev :

git checkout -b FixForBug origin/dev

Maintenant j'ai une branche appelée FixForBug qui suit (je pense que c'est le bon mot) origin/dev. Ainsi, si je fais un git pull, il apportera de nouvelles modifications de origin/dev ce qui est super. Maintenant, lorsque j'ai terminé ma correction, je pousse vers une branche distante portant le même nom.

Tout d'abord, je récupère toutes les modifications de origin/dev et je fais un rebase :

git pull --rebase

Ensuite, je pousse les modifications vers une branche distante portant le même nom :

git push origin FixForBug

Maintenant, il y a une branche sur le serveur distant et je peux créer une demande de fusion pour que la modification soit approuvée et fusionnée de nouveau dans la branche dev. Je ne pousse jamais quoi que ce soit vers origin/dev moi-même. Je pense que c'est un flux de travail assez courant.

La première fois que je fais un git push, ça fonctionne bien et crée la branche distante. Cependant, si je pousse une deuxième fois (disons pendant l'examen du code, quelqu'un signale un problème), je reçois l'erreur suivante :

error: failed to push some refs to 'https://github.mydomain.info/Product/product.git'
hint: Updates were rejected because the tip of your current branch is behind its remote counterpart. Integrate the remote changes (e.g. hint: 'git pull ...') before pushing again.
See the 'Note about fast-forwards' in 'git push --help' for details.

Cependant, si je fais un git status, il dit que je suis en avance de 1 commit sur origin/dev (ce qui a du sens) et si je suis le conseil et que je lance git pull, il dit que tout est à jour. Je pense que c'est parce que je pousse vers une branche différente de ma branche amont. Je peux résoudre ce problème en exécutant :

git push -f origin FixForBug

Dans ce cas, il poussera les modifications vers la branche distante, en disant (mise à jour forcée) et tout semble bon sur la branche distante.

Mes questions :

Pourquoi est-ce que -f est requis dans ce scénario ? Habituellement, lorsque vous forcez quelque chose, c'est parce que vous faisiez quelque chose de mal ou du moins contre les pratiques standard. Est-ce que je peux le faire, ou est-ce que cela va perturber quelque chose dans la branche distante ou créer des problèmes pour celui qui devra finalement fusionner mes modifications dans dev ?

5 votes

Il semble que le message que vous recevez indique que la branche distante FixForBug est en avance sur votre branche locale FixForBug. Vous devriez récupérer les changements de cette branche distante et les fusionner dans votre branche locale avant de pousser.

15 votes

@mhatch - Donc en gros exécute git pull origin FixForBug avant que je pousse là-bas? D'accord, cela a du sens. N'hésitez pas à ajouter en tant que réponse!

0 votes

Pour pousser herku si vous obtenez cette erreur, faites ceci. stackoverflow.com/a/21088381/12201407

961voto

Keif Kraken Points 1164

Le -f est en fait nécessaire en raison du rebase. Chaque fois que vous effectuez un rebase, vous devriez faire un force push car la branche distante ne peut pas être fast-forwarded vers votre commit. Vous voudriez toujours vous assurer de faire un pull avant de pousser, mais si vous n'aimez pas faire de force push vers master ou dev pour la même raison, vous pouvez créer une nouvelle branche vers laquelle pousser, puis fusionner ou créer une PR.

11 votes

Merci pour cette réponse très utile! :)

14 votes

Pouvez-vous clarifier le point "Vous voudriez toujours vous assurer de faire un pull avant de pousser"? Il est clair pourquoi "push -f" après un rebasage de la branche locale est requis. Dans ce cas, le rebasage de la branche locale ne sera-t-il pas annulé en effectuant un pull par rapport au remote avant de pousser?

3 votes

Je pensais la même chose, si je tire les fichiers que j'ai rebasés alors je ferais un rebase pour rien. Encore merci pour le force push, j'avais du mal à comprendre cela.

556voto

Talha Rafique Points 11

"L'extrémité de votre branche actuelle est en retard sur son homologue distant" signifie qu'il y a eu des changements sur la branche distante que vous n'avez pas localement. Et Git vous dit d'importer les nouveaux changements depuis REMOTE et de les fusionner avec votre code, puis de pousser vers la distant.

Vous pouvez utiliser cette commande pour forcer les changements sur le serveur avec le dépôt local ().

git push -f origin master

Avec la balise -f, vous allez remplacer le code de la branche distante par votre code.

0 votes

Génial. ça marche pour moi. tu as sauvé ma journée

2 votes

Il vaut mieux activer "force push" au cas où votre branche est protégée.

0 votes

Cela a fonctionné pour moi. Merci.

131voto

mhatch Points 2537

Pour vous assurer que votre succursale locale FixForBug n'est pas en avance sur la succursale distante FixForBug, tirez et fusionnez les changements avant de pousser.

git pull origin FixForBug
git push origin FixForBug

35 votes

L'OP a déclaré qu'il avait déjà fait un git pull et essayé de pousser. Votre réponse ne s'applique pas à la question de l'OP.

4 votes

Il vaut toujours mieux éviter de forcer la poussée. Merci de partager ceci!

77voto

Golam Sorwar Points 91

Définissez le nom de la branche actuelle, comme master :

git pull --rebase origin master git push origin master

Ou le nom de la branche develop

git pull --rebase origin develop git push origin develop

48voto

Greg Hewgill Points 356191

Si vous voulez éviter d'avoir à utiliser -f, vous pouvez simplement utiliser

git pull

au lieu de

git pull --rebase

Le non-rebase va récupérer les modifications de origin/dev et les fusionner dans votre branche FixForBug. Ensuite, vous pourrez exécuter

git push origin FixForBug

sans utiliser -f.

7 votes

Rebase fait partie de notre flux de travail ici. Je vais me faire hurler dessus si je ne le fais pas.

2 votes

@MikeChristensen: D'accord, alors suivez bien sûr la procédure documentée. D'après ce que vous décrivez, vous aurez besoin d'utiliser -f car vous remplacez des commit(s) sur le dépôt distant par d'autres qui ont un historique différent (rebasé). Si vous utilisiez un produit tel que Gerrit, il prend en charge ce type de workflow de révision de code rebasage sans avoir à utiliser -f lors de la poussée. Nous utilisons Gerrit de cette manière au travail et ça fonctionne très bien.

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