Comment puis-je pousser un commit fixe dans un référentiel Git distant?

Lorsque je travaillais sur le code source, je faisais mon travail habituel, puis je cliquais sur le référentiel distant. Mais ensuite, j'ai remarqué que j'avais oublié d'organiser l'importation dans le code source. Par conséquent, je fais une commande de changement pour remplacer le commit précédent:

 > git commit --amend 

Malheureusement, la validation ne peut pas être renvoyée au référentiel. Il est rejeté comme suit:

 > git push origin To //my.remote.repo.com/stuff.git/ ! [rejected] master -> master (non-fast forward) error: failed to push some refs to '//my.remote.repo.com/stuff.git/' 

Que devrais-je faire? (Je peux accéder au référentiel distant.)

475
31 окт. Spoike mis le 31 octobre 2008-10-31 13:23 2008 à 13h23 2008-10-31 13:23
@ 13 réponses

En fait, j’ai une fois cliqué sur les dépôts --force et .git et j’ai eu une malédiction de Linus BIG TIME . En général, cela créera beaucoup de problèmes pour les autres. La réponse simple est: "Ne faites pas ceci."

Je vois que d’autres en donnent une recette, je ne les répéterai donc pas ici. Mais voici un indice pour vous remettre de la situation après avoir poussé la fixation corrigée avec --force (ou + master).

  • Recherchez l’ancien commit que vous avez contribué (appelez-le old et nous sélectionnerons la nouvelle commande que vous avez créée en modifiant new ).
  • Créez une fusion entre l' old et le new en écrivant un new arbre, par exemple, git checkout new git merge -s ours old .
  • Combinez cela avec votre maître en utilisant git merge master
  • Mettez à jour votre assistant avec le résultat de git push . HEAD:master git push . HEAD:master
  • Imprimer le résultat.

Ensuite, les personnes qui ont échoué au point de baser leur travail sur la fixation que vous avez détruite, en corrigeant et en forçant la poussée (que vous êtes un très mauvais garçon ), verront le résultat de la fusion et verront que vous utilisez new plus que jamais. Leurs fusions ultérieures ne verront pas les conflits entre l' old et le new , résultant des changements, de sorte qu'ils n'auront pas à souffrir.

371
11 янв. la réponse est donnée par gitster le 11 janvier . 2009-01-11 10:36 '09 à 10:36 2009-01-11 10:36

Vous voyez la fonctionnalité de sécurité Git. Git refuse de mettre à jour une branche distante d'une branche car votre branche d'en-tête n'est pas un descendant direct du correctif actuel de l'en-tête de branche sur lequel vous cliquez.

Si ce n'était pas le cas, alors deux personnes qui poussaient dans le même dépôt à peu près au même moment ne sauraient pas qu'un nouveau commit se produirait au même moment, et celui qui a poussé le dernier aurait perdu son emploi. précédent pousseur sans aucun d'entre eux au courant.

Si vous savez que vous êtes la seule personne à avoir cliqué et que vous souhaitez appuyer sur le correctif correcteur opposé à la branche, vous pouvez "forcer" Git à mettre à jour la branche distante avec le commutateur -f .

 git push -f origin master 

Même cela pourrait ne pas fonctionner, car Git permet aux référentiels distants d’abandonner les clics rapides à l’ receive.denynonfastforwards utilisant la receive.denynonfastforwards configuration receive.denynonfastforwards . Si tel est le cas, la raison du rejet ressemblera à ceci (notez la partie "défaillance à distance"):

border=0
  ! [remote rejected] master -> master (non-fast forward) 

Pour contourner ce problème, vous devez soit modifier la configuration du référentiel distant, soit supprimer, puis recréer la branche, de la manière la plus sale possible, de la manière suivante:

 git push origin :master git push origin master 

En général, le dernier paramètre de git push utilise le format <local_ref>:<remote_ref> , où local_ref est le nom de la branche dans le référentiel local et remote_ref est le nom de la branche dans le référentiel distant. Cette paire de commandes utilise deux abréviations. :master est null local_ref, ce qui signifie l'imposition d'une branche zéro du côté distant du master , c'est-à-dire la suppression d'une branche distante. Nom de branche sans : signifie que la branche locale portant le nom spécifié est redirigée vers la branche distante portant le même nom. master dans cette situation est l'abréviation de master:master .

218
01 нояб. Réponse donnée par Charles Bailey le 1er novembre. 2008-11-01 00:58 '08 à 0h58 am 2008-11-01 00:58

Coup de gueule rapide: le fait que personne n'ait posté une réponse simple démontre l'hostilité désespérée de l'utilisateur, manifestée par Git CLI.

Dans tous les cas, la façon "évidente" de le faire, en supposant que vous n'essayiez pas de forcer un push, est de le retirer en premier. Cela conduira au changement que vous y avez apporté (et, par conséquent, il n’est plus là), de sorte qu’il réapparaisse.

Dès que vous résolvez les conflits, vous pouvez cliquer à nouveau.

Donc:

 git pull 

Si vous obtenez des erreurs dans pull, il se peut que quelque chose ne va pas dans la configuration de votre référentiel local (j'avais une référence invalide dans la section .git / config).

Et après

 git push 

Vous pouvez recevoir une fixation supplémentaire avec le sujet de la "fusion triviale".

184
22 сент. réponse donnée par Tim Band le 22 septembre 2009-09-22 13:46 '09 à 13:46 2009-09-22 13:46

La réponse courte est: n'appuyez pas sur les fixations corrigées sur le rapport public.

Réponse longue: plusieurs commandes Git, telles que git commit --amend et git rebase , réécrivent en réalité le tracé de l'historique. Tant que vous n'avez pas publié vos modifications, cela ne devrait pas vous tromper, car si quelqu'un a déjà reçu vos modifications, il essaie de les extraire à nouveau. Au lieu de les modifier. Dans un commit, vous devriez juste faire un nouveau commit avec des modifications.

Cependant, si vous voulez vraiment appuyer sur un message corrigé, vous pouvez le faire comme ceci:

 $ git push origin +master:master 

Le signe + principal vous obligera à appuyer même si cela ne conduit pas à une fixation de «avance rapide». (Un transfert rapide se produit lorsque les modifications sur lesquelles vous cliquez sont un descendant direct des modifications déjà dans le référentiel public.)

86
31 окт. la réponse est donnée par mipadi le 31 octobre 2008-10-31 17:35 '08 à 17:35 2008-10-31 17:35

Voici un moyen simple et propre d’effectuer vos modifications après avoir commit --amend :

 git reset --soft HEAD^ git stash git push -f origin master git stash pop git commit -a git push origin master 

Qu'est-ce que ce qui suit:

  • Réinitialiser les têtes de branches au parent.
  • Cliquez sur le dernier commit.
  • Forcé en appuyant sur la télécommande. Maintenant, l'ordinateur distant n'a pas le dernier commit.
  • Entrez dans votre portefeuille.
  • Lire propre.
  • Cliquez sur la télécommande.

N'oubliez pas de changer "l'origine" et le "maître", si vous appliquez cela à une autre branche ou à un autre périphérique distant.

20
21 июня '15 в 17:41 2015-06-21 17:41 la réponse est donnée à Faiza le 21 juin '15 à 17:41 2015-06-21 17:41

J'ai résolu ce problème en supprimant le correctif local et en ajoutant de nouvelles modifications à partir du haut:

 # Rewind to commit before conflicting git reset --soft HEAD~1 # Pull the remote version git pull # Add the new commit on top git add ... git commit git push 
16
24 сент. La réponse est donnée bara le 24 septembre 2012-09-24 18:46 '12 à 18h46 2012-09-24 18:46

J'ai eu le même problème.

  • Le dernier correctif déjà appliqué a été ajusté de manière aléatoire.
  • Nombreux changements effectués localement, cinq fois
  • J'ai essayé de cliquer, d'obtenir une erreur, de paniquer, de fusionner l'accès à distance, de récupérer beaucoup de fichiers autres que mes fichiers, de cliquer, d'échouer, etc.

En tant que git -newbie, je pensais que cela avait été réalisé par FUBAR .

La décision. Un peu différemment, comme @bara a suggéré + de créer une branche de sauvegarde locale

 # Rewind to commit just before the pushed-and-amended one. # Replace <hash> with the needed hash. # --soft means: leave all the changes there, so nothing is lost. git reset --soft <hash> # Create new branch, just for a backup, still having all changes in it. # The branch was feature/1234, new one - feature/1234-gone-bad git checkout -b feature/1234-gone-bad # Commit all the changes (all the mess) not to lose it  not to carry around git commit -a -m "feature/1234 backup" # Switch back to the original branch git checkout feature/1234 # Pull the from remote (named 'origin'), thus 'repairing' our main problem git pull origin/feature/1234 # Now you have a clean-and-non-diverged branch and a backup of the local changes. # Check the needed files from the backup branch git checkout feature/1234-gone-bad -- the/path/to/file.php 

Peut-être que ce n’est pas une décision rapide et propre, et j’ai perdu mon histoire (un seul engagement au lieu de cinq), mais il a gardé son emploi du jour.

7
20 февр. La réponse est donnée à davisca le 20 février. 2014-02-20 13:24 14 à 13h24 2014-02-20 13:24

Si vous savez que personne n'a utilisé votre correctif sans modification, utilisez l'option --force-with-lease git push .

Dans TortoiseGit, vous pouvez faire de même dans les paramètres "Push ..." "Force: peut supprimer" et rechercher les "modifications connues".

Forcer (peut rejeter les modifications connues) permet au référentiel distant d’effectuer une transition plus sûre et non rapide. Cela peut entraîner la perte du commit du référentiel distant; utilisez-le avec prudence. Cela peut vous empêcher de perdre des modifications inconnues d'autres personnes sur la télécommande. Il vérifie si la branche du serveur pointe sur la même fixation que la branche de suivi à distance (modifications connues). Si oui, le pouvoir sera appuyé. Sinon, il sera rejeté. Comme git ne possède pas de balises avec suivi à distance, les balises ne peuvent pas être écrasées avec cette option.

3
07 июня '16 в 3:03 2016-06-07 03:03 la réponse est donnée par ShawnFeatherly le 07 juin 2016 à 3:03 2016-06-07 03:03

Voici un moyen simple et propre d’apporter des modifications après avoir terminé. git add "your files" et git commit --amend :

 git push origin master -f 

ou

 git push origin master --force 
2
18 янв. La réponse est donnée par Marwen Bkh le 18 janvier . 2016-01-18 11:29 '16 à 11:29 2016-01-18 11:29

Si vous n'avez pas appuyé sur le code de la branche distante (GitHub / Bitbucket), vous pouvez modifier le message de validation sur la ligne de commande, comme indiqué ci-dessous.

  git commit --amend -m "Your new message" 

Si vous travaillez sur une branche spécifique, procédez comme suit:

 git commit --amend -m "BRANCH-NAME: new message" 

Si vous avez déjà cliqué sur le code avec le mauvais message, vous devez faire preuve de prudence lors de la modification du message. Une fois que vous avez modifié le message de validation et que vous avez essayé de le presser à nouveau, vous avez des problèmes. Pour le rendre lisse, suivez ces étapes.

Veuillez lire l'intégralité de la réponse avant de le faire.

 git commit --amend -m "BRANCH-NAME : your new message" git push -f origin BRANCH-NAME # Not a best practice. Read below why? 

Note importante: Lorsque vous appuyez sur Push, vous pouvez rencontrer des problèmes de code sur lesquels d'autres développeurs travaillent sur la même branche. Par conséquent, pour éviter ces conflits, vous devez extraire le code de votre branche avant d’appuyer sur force :

  git commit --amend -m "BRANCH-NAME : your new message" git pull origin BRANCH-NAME git push -f origin BRANCH-NAME 

Cette pratique est recommandée lorsque vous modifiez un message de validation s'il a déjà été activé.

2
13 янв. La réponse est donnée par Packer le 13 janvier 2015-01-13 10:20 '15 à 10:20 2015-01-13 10:20

Vous obtenez cette erreur car Git remote possède déjà ces fichiers de validation. Vous devez obligatoirement cliquer sur une branche pour que cela fonctionne:

 git push -f origin branch_name 

Veillez également à extraire le code de la télécommande, car un membre de votre équipe pourrait être transféré dans une branche.

 git pull origin branch_name 

C'est l'un des cas où nous devons forcer un correctif à un distant.

1
21 янв. la réponse est donnée par Praveen Dhawan le 21 janvier 2016-01-21 09:35 '16 à 9:35 2016-01-21 09:35

J'ai dû résoudre ce problème en puisant dans un dépôt distant et en résolvant les conflits de fusion survenus, à corriger, puis à cliquer. Mais je pense qu’il existe un meilleur moyen.

1
31 окт. la réponse est donnée à Spoike le 31 octobre. 2008-10-31 14:39 2008 à 14h39 2008-10-31 14:39

J'ai juste continué à faire ce que Git m'a dit. Donc:

  • Impossible de cliquer en raison d'un correctif.
  • J'essaie comme je m'y attendais.
  • Erreur de fusion alors je le répare manuellement.
  • Créez un nouveau commit (marqué "fusion") et cliquez dessus.
  • Il semble que ça marche!

Note La fixation modifiée était la dernière.

1
02 дек. La réponse est donnée à Rolf 02 déc. 2016-12-02 19:29 '16 à 19:29 2016-12-02 19:29

Autres questions sur ou poser une question