Quand j'ai un peu travaillé avec mon code source, j'ai fait ma validation habituelle, puis j'ai poussé vers un référentiel distant. Mais j'ai remarqué que j'avais oublié d'organiser mes importations dans le code source. Je fais donc la commande amend pour remplacer le commit précédent:
> git commit --amend
Malheureusement, la validation ne peut pas être repoussée dans le référentiel. Il est rejeté comme ceci:
> 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.)
git
git-commit
amend
Spoike
la source
la source
git push -force
plus attentivement .Réponses:
En fait, j'ai poussé une fois avec
--force
et.git
référentiel et ai été grondé par Linus BIG TIME . En général, cela créera beaucoup de problèmes pour d'autres personnes. Une réponse simple est "Ne le faites pas".Je vois que d'autres ont donné la recette pour le faire de toute façon, donc je ne les répéterai pas ici. Mais voici une astuce pour récupérer de la situation après avoir poussé le commit modifié avec --force (ou + master).
git reflog
pour trouver l'ancien commit que vous avez modifié (appelez-leold
, et nous appellerons le nouveau commit que vous avez créé en modifiantnew
).old
etnew
, en enregistrant l'arbre denew
, commegit checkout new && git merge -s ours old
.git merge master
git push . HEAD:master
Ensuite , les gens qui étaient assez malheureux pour avoir fondé leur travail sur la commettras vous oblitérée en modifiant et en forçant une poussée verra la fusion résultante verra que vous favorisez
new
plusold
. Leurs fusions ultérieures ne verront pas les conflits entreold
etnew
qui ont résulté de votre modification, donc ils n'ont pas à souffrir.la source
git reflog
pour le trouverVous voyez une fonctionnalité de sécurité Git. Git refuse de mettre à jour la branche distante avec votre branche, car le commit de tête de votre branche n'est pas un descendant direct du commit de tête actuel de la branche vers laquelle vous poussez.
Si ce n'était pas le cas, alors deux personnes poussant vers le même référentiel à peu près en même temps ne sauraient pas qu'un nouveau commit arrivait en même temps et celui qui poussait le dernier perdrait le travail du pousseur précédent sans aucun des deux les réalisant cela.
Si vous savez que vous êtes la seule personne à pousser et que vous souhaitez pousser un commit modifié ou pousser un commit qui remonte la branche, vous pouvez 'forcer' Git à mettre à jour la branche distante à l'aide du
-f
commutateur.Même cela peut ne pas fonctionner car Git permet aux référentiels distants de refuser les poussées non rapides à l'extrémité distante en utilisant la variable de configuration
receive.denynonfastforwards
. Si tel est le cas, la raison du rejet ressemblera à ceci (notez la partie «rejetée à distance»):Pour contourner ce problème, vous devez soit modifier la configuration du référentiel distant, soit en tant que hack sale, vous pouvez supprimer et recréer la branche ainsi:
En général, le dernier paramètre à
git push
utiliser le format<local_ref>:<remote_ref>
, oùlocal_ref
est le nom de la branche sur le référentiel local etremote_ref
le nom de la branche sur le référentiel distant. Cette paire de commandes utilise deux raccourcis.:master
a un local_ref nul qui signifie pousser une branche nulle vers le côté distantmaster
, c'est-à-dire supprimer la branche distante. Un nom de branche sans aucun:
moyen pousse la branche locale portant le nom donné vers la branche distante du même nom.master
dans cette situation est court pourmaster:master
.la source
git gc
fois que les reflogs ont expiré, les anciens objets seront élagués. Personne qui clone le référentiel n'aura d'objet qui ne sera plus accessible dès que la branche aura été mise à jour.Déclamation rapide: Le fait que personne n'ait publié la réponse simple ici démontre l'hostilité désespérée des utilisateurs manifestée par la CLI Git.
Quoi qu'il en soit, la façon "évidente" de faire cela, en supposant que vous n'avez pas essayé de forcer la poussée, est de tirer en premier. Cela tire le changement que vous avez modifié (et donc plus) pour que vous l'ayez à nouveau.
Une fois que vous avez résolu tous les conflits, vous pouvez recommencer.
Donc:
Si vous obtenez des erreurs lors de l'extraction, peut-être que quelque chose ne va pas dans la configuration de votre référentiel local (j'avais une mauvaise référence dans la section de la branche .git / config).
Et après
Peut-être obtiendrez-vous un commit supplémentaire avec le sujet racontant une "fusion triviale".
la source
git push -f
ougit reset
est le seul moyen d'aller ici.Réponse courte: ne pas pousser les commits modifiés vers un dépôt public.
Réponse longue: quelques commandes Git, comme
git commit --amend
etgit rebase
, réécrivent en fait le graphique d'historique. C'est bien tant que vous n'avez pas publié vos modifications, mais une fois que vous l'avez fait, vous ne devriez vraiment pas fouiner avec l'historique, car si quelqu'un a déjà obtenu vos modifications, alors quand il essaie de tirer à nouveau, il peut échouer . Au lieu de modifier une validation, vous devez simplement effectuer une nouvelle validation avec les modifications.Cependant, si vous voulez vraiment, vraiment pousser un commit modifié, vous pouvez le faire comme ceci:
Le
+
signe de tête forcera la poussée à se produire, même si elle n'entraîne pas de validation "d'avance rapide". (Une validation rapide se produit lorsque les modifications que vous appuyez sont un descendant direct des modifications déjà présentes dans le référentiel public.)la source
git push -f
.Voici un moyen très simple et propre de pousser vos modifications après avoir déjà effectué un
commit --amend
:Ce qui fait ce qui suit:
N'oubliez pas de changer «origine» et «maître» si vous appliquez cela à une autre succursale ou à une autre télécommande.
la source
git add
avant mon commit pour inclure les changements.git reset --soft "HEAD^"
. Le reste fonctionne bien.Je l'ai résolu en supprimant mon commit modifié local et en ajoutant les nouvelles modifications en haut:
la source
J'ai eu le même problème.
En tant que débutant Git, je pensais que c'était FUBAR complet .
Solution: un peu comme @bara a suggéré + créé une branche de sauvegarde locale
Ce n'est peut-être pas une solution rapide et propre, et j'ai perdu mon historique (1 commit au lieu de 5), mais cela a sauvé une journée de travail.
la source
Si vous n'avez pas poussé le code vers votre branche distante (GitHub / Bitbucket), vous pouvez modifier le message de validation sur la ligne de commande comme ci-dessous.
Si vous travaillez sur une branche spécifique, procédez comme suit:
Si vous avez déjà poussé le code avec un mauvais message, vous devez être prudent lorsque vous modifiez le message. Par exemple, après avoir modifié le message de validation et essayé de le pousser à nouveau, vous vous retrouvez avec des problèmes. Pour le rendre lisse, suivez les étapes suivantes.
Veuillez lire l'intégralité de la réponse avant de le faire
Remarque importante: lorsque vous utilisez directement la poussée forcée, vous pouvez vous retrouver avec des problèmes de code que d'autres développeurs travaillent sur la même branche. Donc, pour éviter ces conflits, vous devez extraire le code de votre branche avant d'effectuer une poussée forcée :
Il s'agit de la meilleure pratique lors de la modification du message de validation, s'il a déjà été poussé.
la source
--force
le problème, voir la réponse acceptéeSi vous savez que personne n'a retiré votre commit non modifié, utilisez l'
--force-with-lease
option degit push
.Dans TortoiseGit, vous pouvez faire la même chose sous "Push ..." options "Force: May discard" et vérification des "changements connus".
la source
Vous obtenez cette erreur car la télécommande Git a déjà ces fichiers de validation. Vous devez forcer la poussée de la branche pour que cela fonctionne:
Assurez-vous également que vous extrayez le code à distance, car quelqu'un d'autre de votre équipe aurait pu pousser vers la même branche.
C'est l'un des cas où nous devons forcer le push sur commit à distance.
la source
Voici un moyen très simple et propre de pousser vos modifications après avoir déjà fait un
git add "your files"
etgit commit --amend
:ou:
la source
Si vous utilisez Visual Studio Code, vous pouvez essayer cette extension pour vous faciliter la tâche.
https://marketplace.visualstudio.com/items?itemName=cimdalli.git-commit-amend-push-force
Comme vous pouvez le comprendre par son nom, il exécute les commandes consécutivement
git commit --amend
git push --force
la source
J'ai dû résoudre ce problème en tirant du référentiel distant et gérer les conflits de fusion qui se sont produits, commettre puis pousser. Mais j'ai l'impression qu'il y a une meilleure façon.
la source
J'ai continué à faire ce que Git m'a dit de faire. Donc:
Remarque: le commit modifié était le dernier.
la source
Ce qui suit a fonctionné pour moi lors du changement d'Auteur et de Committer d'un commit.
git push -f origin master
Git était assez intelligent pour comprendre qu'il s'agissait de commits de deltas identiques qui ne différaient que dans la section méta-informations.
Les chefs locaux et distants ont indiqué les commits en question.
la source
Ici, comment j'ai corrigé une modification dans un commit précédent:
git stash
votre copie de travail est maintenant propre à l'état de votre dernier commit.git commit --all --amend
Votre éditeur vous demandera un message de journal (par défaut, l'ancien message de journal). Enregistrez et quittez l'éditeur lorsque vous en êtes satisfait.
Les nouvelles modifications sont ajoutées à l'ancien commit. Voyez par vous-même avec
git log
etgit diff HEAD^
Réappliquez vos modifications cachées, le cas échéant:
git stash apply
la source