J'ai installé un dépôt "principal" à distance non dénudé et l'ai cloné sur mon ordinateur. J'ai apporté des modifications locales, mis à jour mon référentiel local et repoussé les modifications dans mon référentiel distant. Les choses allaient bien jusque-là.
Maintenant, je devais changer quelque chose dans le référentiel distant. Ensuite, j'ai changé quelque chose dans mon dépôt local. J'ai réalisé que la modification du référentiel distant n'était pas nécessaire. J'ai donc essayé git push
de passer de mon référentiel local à mon référentiel distant, mais j'ai eu une erreur comme:
Pour vous empêcher de perdre l'historique, les mises à jour non à avance rapide ont été rejetées. Fusionnez les modifications à distance avant de pousser à nouveau. Consultez la section «Remarque sur les avances rapides»
git push --help
pour plus de détails.
Je pensais que probablement
git push --force
forcerait ma copie locale à pousser les modifications sur la télécommande et à la rendre identique. Cela force la mise à jour , mais lorsque je reviens au référentiel distant et que je fais un commit, je remarque que les fichiers contiennent des modifications obsolètes (celles que le référentiel distant principal avait précédemment).
Comme je l'ai mentionné dans les commentaires à l'une des réponses :
[J'ai] essayé de forcer, mais en revenant au serveur maître pour enregistrer les modifications, j'obtiens une mise en scène obsolète. Ainsi, lorsque je valide les référentiels ne sont pas les mêmes. Et quand j'essaye d'utiliser à nouveau git push, j'obtiens la même erreur.
Comment puis-je résoudre ce problème?
git push -force
plus attentivement .git push --force
c'est en effet un autre moyen valable pour forcer la poussée, et poussera les branches aussi biengit push origin master --force
qu'avec la valeur par défaut de Gitpush.default config settings
, bien que les branches spécifiquement poussées diffèrent entre les versions de Git antérieures à 2.0 et après 2.0.git push --force
fonctionne bien ces jours-ci, FWIW ...git push --force-with-lease
fonctionne encore mieux :), il refusera de mettre à jour une branche sauf si c'est l'état que vous attendez. (voir developer.atlassian.com/blog/2015/04/force-with-lease )Réponses:
Faites juste:
ou si vous avez un dépôt spécifique:
Cela supprimera vos engagements précédents et poussera votre engagement actuel.
Ce n'est peut-être pas approprié, mais si quelqu'un tombe sur cette page, il pense qu'il pourrait vouloir une solution simple ...
Drapeau court
Notez également que
-f
c'est court pour--force
, doncfonctionnera également.
la source
git push origin +master
place, ce qui vous permet de pousser plusieurs refspec sans les forcer toutes.git push --force
, vous pourriez finir par gâcher votre branche principale (en fonction de votre comportement par défaut). Ce qui pourrait être nul .. un peu ..: Dgit push --force
consiste essentiellement à forcer le push de la branche actuellement extraite vers sa partie de compteur distant, donc si vous avez extrait la branche principale, elle est identique àgit push origin master --force
. Ce sera différent si vous utilisez lematching
paramètre pourpush.default
, qui est la valeur par défaut pour les versions de Git antérieures à 2.0.matching
pousse toutes les succursales locales vers des succursales distantes qui ont le même nom, donc forcer alors ne pourrait certainement pas être ce que vous voulez faire ...git push origin master --force
est.merge -s ours
travail pour moiEt si
push --force
cela ne fonctionne pas, vous pouvez le fairepush --delete
. Regardez la 2 e ligne sur cette instance:Mais méfiez-vous...
Ne jamais revenir sur une histoire publique de git!
En d'autres termes:
force
un référentiel public.pull
.reset
ou l'rewrite
histoire dans un repo que quelqu'un aurait déjà retiré.Bien sûr, il existe des exceptions exceptionnellement rares, même à cette règle, mais dans la plupart des cas, il n'est pas nécessaire de le faire et cela générera des problèmes pour tout le monde.
Faites un retour à la place.
Et soyez toujours prudent avec ce que vous proposez à un dépôt public . Revenant:
En effet, les deux HEAD d'origine (du retour et de la mauvaise réinitialisation ) contiendront les mêmes fichiers.
modifier pour ajouter des informations mises à jour et plus d'arguments autour
push --force
Envisagez de pousser la force avec le bail au lieu de pousser, mais préférez toujours revenir
Un autre problème
push --force
peut se produire lorsque quelqu'un pousse quoi que ce soit avant de le faire, mais après que vous l'ayez déjà récupéré. Si vous appuyez sur forcer votre version rebasée maintenant, vous remplacerez le travail des autres .git push --force-with-lease
introduit dans le git 1.8.5 ( grâce au commentaire @VonC sur la question) tente de résoudre ce problème spécifique. Fondamentalement, cela apportera une erreur et ne poussera pas si la télécommande a été modifiée depuis votre dernière extraction.C'est bien si vous êtes vraiment sûr qu'un
push --force
est nécessaire, mais que vous voulez toujours éviter plus de problèmes. J'irais jusqu'à dire que ce devrait être lepush --force
comportement par défaut . Mais c'est encore loin d'être une excuse pour forcer apush
. Les personnes qui ont récupéré avant votre rebase auront toujours beaucoup de problèmes, qui pourraient être facilement évités si vous aviez rétabli à la place.Et puisque nous parlons d'
git --push
instances ...Pourquoi voudrait-on forcer la poussée?
@linquize a apporté un bon exemple de force de poussée sur les commentaires: données sensibles . Vous avez mal divulgué des données qui ne devraient pas être transmises. Si vous êtes assez rapide, vous pouvez le "réparer"
*
en forçant une poussée sur le dessus.*
Les données seront toujours sur la télécommande, sauf si vous effectuez également un ramasse - miettes ou le nettoyez d'une manière ou d' une autre . Il y a aussi le potentiel évident qu'il soit diffusé par d'autres qui l'ont déjà récupéré , mais vous avez l'idée.la source
git push origin master --delete # do a very very bad bad thing git push origin master # regular push
En fait, cela a parfaitement résolu mon problème (sur un dépôt avec seulement moi et mon ami). c'est peut-être mal pour les dépôts publics, mais pour un dépôt privé, c'est un épargnant de vie.Tout d'abord, je ne ferais aucun changement directement dans le repo "principal". Si vous voulez vraiment avoir un dépôt "principal", alors vous ne devez que pousser dessus, ne jamais le changer directement.
En ce qui concerne l'erreur que vous obtenez, avez-vous essayé
git pull
depuis votre référentiel local, puisgit push
vers le référentiel principal? Ce que vous faites actuellement (si j'ai bien compris), c'est de forcer le push puis de perdre vos modifications dans le repo "principal". Vous devez d'abord fusionner les modifications localement.la source
git push -f
, mais si vous modifiez à nouveau votre référentiel principal, vous devez revenir à votre référentiel local etgit pull
, afin qu'il se synchronise avec les dernières modifications. Ensuite, vous pouvez faire votre travail et pousser à nouveau. Si vous suivez ce workflow "push-pull", vous n'obtiendrez pas le genre d'erreur dont vous vous plaigniez.Si je suis sur ma branche locale A, et que je veux forcer la poussée de la branche locale B vers la branche d'origine, CI peut utiliser la syntaxe suivante:
la source
git push --force origin B:C
. Dans mon cas, il semble quegit push --force origin C
cela ne fera que passer du maître local à la branche C distante, quelle que soit la branche sur laquelle je suis actuellement.git version 2.3.8 (Apple Git-58)
utilisez cette commande suivante:
la source
-f
drapeau ...Je recommanderais vraiment de:
pousser uniquement vers le référentiel principal
assurez-vous que le référentiel principal est un référentiel nu , afin de ne jamais avoir de problème avec l'arbre de travail du référentiel principal qui n'est pas synchronisé avec sa
.git
base. Voir " Comment envoyer un référentiel git local vers un autre ordinateur? "Si vous devez apporter des modifications dans le référentiel principal (nu), le cloner (sur le serveur principal), effectuez votre modification et repoussez-le
En d'autres termes, gardez un référentiel nu accessible à la fois à partir du serveur principal et de l'ordinateur local, afin d'avoir un seul référentiel en amont depuis / vers lequel tirer / tirer.
la source
C'était notre solution pour remplacer master sur un référentiel gitHub d'entreprise tout en conservant l'historique.
push -f
la maîtrise des référentiels d'entreprise est souvent désactivée pour conserver l'historique des succursales. Cette solution a fonctionné pour nous.pousser votre branche
desiredOrigin
et créer un PRla source
J'avais la même question mais je l'ai finalement trouvée. Ce que vous devez probablement faire est d'exécuter les deux commandes git suivantes (en remplaçant le hachage par le numéro de révision de la validation git):
la source