Comment puis-je pousser modifié s'engager à la distance dépôt Git?
Quand j'ai travaillé un peu avec mon code source, j'ai fait mon truc habituel commettre et puis j'ai poussé à un dépôt distant. Mais ensuite, j'ai remarqué que j'ai oublié d'organiser mon importations dans le code source. Je fais donc de la modifier de commande pour remplacer la précédente livraison:
> git commit --amend
Malheureusement, la validation ne peut pas être poussé vers le dépôt. 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 dois-je faire? (Je peux accéder au dépôt distant.)
- Que faire si mon --amend a plus qu'à changer le message de commit? De toute façon à modifier le dernier message de commit seule, si elle a déjà été poussé à distance? Je l'ai fait sur Github et j'ai obtenu le même message au sujet de la non rapide vers l'avant. Puis j'ai appliqué une solution ci-dessous, mais la fusion juste ajouté plus de messages de commit sur le dessus..
- Je pense que c'est une FAQ. Un message de validation est haché avec le commettre, alors chaning ça change de la revid (hash). Si elle n'est pas claire: non, vous ne le peut pas. IIRC pouvez stocker out-of-band info dans les notes (de sorte que vous pouvez annoter existants s'engage sans les modifier). Étiquette spécifique s'engage, utiliser les tags
- Vous allez bientôt (git1.8.5, T4 2013) être en mesure de faire un
git push -force
plus attentivement. - Ici est le style cow-boy. N'apprenez pas tout plus ou ne chasse pas les moyens pour annuler la dernière git modifier. Juste ajouter un peu de code de l'espace réservé, je veux dire, Ajouter quelques commentaires, le Nettoyage un peu de code ou simplement ajouté quelques dash dash dash.... Maintenant faire une réelle s'engager et de le pousser à distance. Fait !
- Si votre -modifier l'a été seulement de changer le message de commit et que vous n'avez pas fait de supplémentaires locale s'engage depuis, vous pouvez réinitialiser votre succursale locale de la télécommande s'engager à ce que vous avez poussé avant de modifier le message de commit.
Vous devez vous connecter pour publier un commentaire.
Je l'ai fait une fois poussé avec
--force
et.git
le référentiel et l'ai grondé par Linus GRAND TEMPS. En général, cela va créer beaucoup de problèmes pour d'autres personnes. Une réponse simple est "Ne pas faire".Je vois les autres a donné la recette pour le faire de toute façon, donc je ne vais pas les répéter ici. Mais voici une astuce pour récupérer à partir de la situation après vous ont poussé hors de la version modifiée de s'engager avec --force (ou +master).
git reflog
de trouver l'ancien commit que vous avez modifié (appelerold
, et nous allons l'appeler le nouveau commit que vous avez créé en modifiantnew
).old
etnew
de l'enregistrement de l'arbre denew
, commegit checkout new && git merge -s ours old
.git merge master
git push . HEAD:master
Les gens qui ont la malchance d'avoir fondé leur travail sur la validation vous effacée en modifiant et en forçant un push voit le résultat de la fusion verrez que vous en faveur d'
new
surold
. Plus tard leur fusions de ne pas voir les conflits entreold
etnew
qui résulte de votre modifiant, de sorte qu'ils n'ont pas à subir.git reflog
pour le trouverVous voyez un Git dispositif de sécurité. Git refuse de mettre à jour la branche à distance avec votre direction, parce que votre succursale de la tête de s'engager n'est pas un descendant direct de l'actuel chef de commit de la branche qui vous poussent à.
Si ce n'était pas le cas, alors deux personnes en le poussant vers la même référentiel, à la même époque ne serait pas savoir qu'il y avait un nouveau commit à venir dans le même temps, et celui qui a poussé dernier perdrait le travail de la précédente poussoir sans eux, la réalisation de ce.
Si vous savez que vous êtes la seule personne qui pousse et vous souhaitez faire une modification de commettre ou de pousser un commit qui serpente le dos de la direction générale, vous pouvez "forcer" Git pour la mise à jour de la branche à distance à l'aide de la
-f
commutateur.Même cela peut ne pas fonctionner comme Git permet à des dépôts distants de refuser non-fastforward pousse à l'extrême fin à l'aide de la variable de configuration
receive.denynonfastforwards
. Si c'est le cas, le rejet de la raison ressemblera à ceci (notez la distance rejeté " partie):Pour contourner ce problème, vous devez modifier soit le dépôt distant de configuration ou comme un sale hack vous pouvez la supprimer et la recréer la direction générale ainsi:
En général, le dernier paramètre à
git push
utilise le format<local_ref>:<remote_ref>
, oùlocal_ref
est le nom de la branche sur le dépôt local etremote_ref
est le nom de la branche sur le dépôt distant. Cette commande paire utilise deux abréviations.:master
a une valeur null local_ref qui signifie pousser un null branche sur le côté distantmaster
, c'est à dire supprimer la branche distante. Un nom de branche sans:
signifie pousser la branche locale avec le nom donné à la branche à distance avec le même nom.master
dans cette situation est court pourmaster:master
.git gc
une fois le reflogs ont expiré vieux objets seront élagués. Personne qui clone le dépôt d'obtenir tous les objets qui ne sont plus accessibles dès que le service a été mis à jour.git
et les autres clients. Comment puis-je voir la version non amendée s'engage avec git log?Rapide coup de gueule: Le fait que personne n'a posté la réponse la plus simple ici est la preuve que les désespérés de l'utilisateur de l'hostilité manifestée par le Git de la CLI.
De toute façon, le "évident" façon de le faire, en supposant que vous n'avez pas essayé de forcer la poussée, est de tirer en premier. Ce tire la modification que vous avez modifié (et donc n'ont plus), de sorte que vous avez à nouveau.
Une fois que vous avez résolu tous les conflits, vous pouvez pousser à nouveau.
Donc:
Si vous obtenez des erreurs en tirer, peut-être que quelque chose est incorrect dans votre dépôt local de configuration (j'ai eu un mal de ref dans le .git/config direction de la section).
Et après
Peut-être vous obtenez un supplément de s'engager avec le sujet en racontant un "Trivial de fusion".
git push -f
ougit reset
est la seule façon d'aller ici.Réponse courte: Ne poussez pas modifié s'engage à un public de pensions.
Réponse longue: quelques commandes Git, comme
git commit --amend
etgit rebase
, en fait réécrire l'histoire graphique. C'est très bien aussi longtemps que vous n'avez pas publié vos modifications, mais une fois que vous faites, vous ne devriez pas être curage autour de l'histoire, parce que si quelqu'un a déjà eu vos modifications, puis, quand ils essaient de tirer de nouveau, elle peut échouer. Au lieu de modifier un commit, vous devriez juste faire un nouveau commit avec les changements.Toutefois, si vous avez vraiment, vraiment envie de pousser une version modifiée de s'engager, vous pouvez le faire comme ceci:
Le premier
+
signe de la force de la pousser à se produire, même s'il n'a pas dans un "fast-forward" s'engager. (Un fast-forward commettre se produit lorsque les modifications sont en train de pousser sont un descendant direct des changements déjà dans le public des pensions.)git push -f
.Ici est très simple et propre façon de pousser vos modifications après que vous avez déjà fait un
commit --amend
:Qui effectue les opérations suivantes:
N'oubliez pas de changer "l'origine" et "maître", si l'application d'une autre branche ou à distance.
git add
avant mon engager à inclure les modifications.git reset --soft "HEAD^"
. Le reste fonctionne très bien.J'ai résolu en supprimant mon local modifiée de s'engager et d'en ajouter de nouveaux changements sur le dessus:
J'ai eu le même problème.
Comme un Git-débutant, je pensais que c'était complet FUBAR.
Solution: un Peu comme @bara suggéré + créé une sauvegarde locale de la branche
C'est peut-être pas un rapide et propre solution, et j'ai perdu mon histoire (1 commit au lieu de 5), mais il a sauvé une journée de travail.
Si vous n'avez pas poussé le code de votre télécommande branche (GitHub/Bitbucket) vous pouvez modifier le message de commit sur la ligne de commande comme ci-dessous.
Si vous travaillez sur une branche spécifique, faites ceci:
Si vous avez déjà poussé le code avec un mauvais message, alors vous devez être prudent lors de la modification du message. j'.e fois que vous modifiez le message de commit et essayer de pousser à nouveau, vous retrouver avec des problèmes. Pour la rendre lisse suivre les étapes suivantes.
Veuillez lire l'intégralité de la réponse avant de le faire
Remarque importante: Lorsque vous utilisez la force de pousser directement, vous pourriez 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 avez besoin pour tirer le code de votre branche avant de faire le force de pousser:
C'est la meilleure pratique lors de la modification du message de validation, si elle a déjà poussé.
--force
, voir la accepté de répondre àSi vous savez que personne n'a tiré votre non-modifié commettre, utilisez le
--force-with-lease
option degit push
.Dans TortoiseGit, vous pouvez faire la même chose sous "Pousser..." options "de la Force: Peut jeter" et en cochant "changements".
Vous obtenez cette erreur, parce que le Git remote a ces commit des fichiers. Vous avez à force de pousser la branche pour que cela fonctionne:
Assurez-vous également que vous tirez sur le code de la télécommande comme quelqu'un d'autre sur votre équipe peut avoir poussé à la même branche.
C'est un des cas où nous avons à force de pousser la validation à distance.
Ici est très simple et propre façon de pousser vos modifications après que vous avez déjà fait un
git add "your files"
etgit commit --amend
:ou:
J'ai eu à résoudre ce problème avec la traction à partir de la télécommande pensions et de traiter les conflits de fusion qui se pose, s'engager et de pousser ensuite. Mais je me sens comme il ya une meilleure façon.
J'ai juste continué à faire ce que Git m'a dit de faire. Donc:
"fusion") et de le pousser à.
Remarque: La version modifiée de commettre était la dernière.
Ici, Comment j'ai résolu de faire une modification dans une précédente livraison:
git stash
Maintenant votre copie de travail est propre à l'état de votre dernier commit.git commit --all --amend
Votre éditeur demandant pour un message de log (par défaut, le vieux message de log). Enregistrez et quittez l'éditeur lorsque vous êtes heureux avec elle.
Les nouveaux changements sont ajoutés à l'ancien commit. Voir pour vous-même avec
git log
etgit diff HEAD^
Ré-appliquer votre planqué changements, si elle est faite:
git stash apply