Forcer "git push" pour écraser les files distants

Je veux pousser mes files locaux, et les avoir sur un repo distant, sans avoir à gérer les conflits de fusion. Je veux juste que ma version locale ait la priorité sur la version distante.

Comment puis-je faire cela avec Git?

Solutions Collecting From Web of "Forcer "git push" pour écraser les files distants"

Vous devriez pouvoir forcer votre révision locale vers le repo distant en utilisant

 git push -f <remote> <branch> 

(par exemple git push -f origin master ). Si vous quittez <remote> et <branch> , vous forcez à pousser toutes les twigs locales qui ont défini --set-upstream .

Juste être prévenu, si d'autres personnes partagent ce référentiel, leur historique de révision sera en conflit avec le nouveau. Et s'ils ont des engagements locaux après le changement, ils deviendront invalides.

Mise à jour : Je pensais append une note de côté. Si vous créez des modifications que d'autres vont réviser, il n'est pas rare de créer une twig avec ces modifications et de les modifier régulièrement pour les maintenir à jour avec la twig de développement principale. Laissez les autres développeurs savoir que cela arrivera périodiquement pour qu'ils sachent à quoi s'attendre.

Mise à jour 2 : En raison du nombre croissant de téléspectateurs, j'aimerais append quelques informations supplémentaires sur ce qu'il faut faire lorsque votre upstream subit une poussée de force.

Dites que j'ai cloné votre repo et ajouté quelques commits comme ça:

             D ---- E sujet
            /
 A ---- B ---- C développement

Mais plus tard, la twig de development est frappée avec un rebase , ce qui me fera recevoir une erreur comme ça quand je lance git pull :

 Déballage des objects: 100% (3/3), terminé.
 De <repo-location>
  * développement de la succursale -> FETCH_HEAD
 Fusion automatique <files>
 CONFLICT (contenu): Fusionner le conflit dans <locations>
 La fusion automatique a échoué.  résoudre les conflits et ensuite valider le résultat.

Ici, je pouvais résoudre les conflits et commit , mais cela me laisserait avec un historique de commit vraiment moche:

        C ---- D ---- E ---- F sujet
       / /
 A ---- B -------------- C 'développement

Il peut sembler tentant d'utiliser git pull --force mais soyez prudent car cela vous laissera des commits bloqués:

             D ---- E sujet

 A ---- B ---- C 'développement

Donc, probablement, la meilleure option est de faire un git pull --rebase . Cela m'obligera à résoudre tous les conflits comme avant, mais pour chaque étape au lieu de commettre je vais utiliser git rebase --continue . En fin de count l'histoire de commit sera beaucoup mieux:

             D '--- E' sujet
            /
 A ---- B ---- C 'développement

Mise à jour 3: Vous pouvez également utiliser l'option --force-with-lease comme une force "plus sûre", comme mentionné par Cupcake dans sa réponse :

Forcer le push avec un "bail" permet à la force d'échouer s'il y a de nouveaux commits sur la télécommand auxquels vous ne vous attendiez pas (techniquement, si vous ne les avez pas encore récupérés dans votre twig de suivi à distance), ce qui est utile vous ne voulez pas écraser accidentellement les commits de quelqu'un que vous ne saviez même pas encore, et vous voulez juste écraser les vôtres:

 git push <remote> <branch> --force-with-lease 

Vous pouvez apprendre plus de détails sur la façon d'utiliser --force-with-lease en lisant l'un des éléments suivants:

  • git push documentation
  • Git: Comment ignorer l'avance rapide et rétablir l'origine [twig] à commettre plus tôt?

Vous voulez forcer la poussée

Ce que vous voulez essentiellement faire est de forcer votre twig locale, afin d'écraser la twig distante.

Si vous souhaitez une explication plus détaillée de chacune des commands suivantes, consultez la section sur les détails ci-dessous. Vous avez essentiellement 4 options différentes pour pousser la force avec Git:

 git push <remote> <branch> -f git push origin master -f # Example git push <remote> -f git push origin -f # Example git push -f git push <remote> <branch> --force-with-lease 

Si vous voulez une explication plus détaillée de chaque command, alors voir ma section de longues réponses ci-dessous.

Attention: le push de force va écraser la twig distante avec l'état de la twig que vous êtes en train de pousser. Assurez-vous que c'est ce que vous voulez vraiment faire avant de l'utiliser, sinon vous risquez d'écraser les commits que vous voulez conserver.

Force à pousser les détails

Spécification de la télécommand et de la succursale

Vous pouvez spécifier complètement des twigs spécifiques et une télécommand. L'indicateur -f est la version courte de --force

 git push <remote> <branch> --force git push <remote> <branch> -f 

Omettre la twig

Lorsque la twig à pousser est omise, Git la comprendra en fonction de vos parameters de configuration. Dans les versions de Git après la version 2.0, un nouveau repository aura des parameters par défaut pour pousser la twig actuellement retirée:

 git push <remote> --force 

Bien avant 2.0, les nouveaux repos auront des parameters par défaut pour pousser plusieurs twigs locales. Les parameters en question sont les parameters remote.<remote>.push et push.default (voir ci-dessous).

Omettre la télécommand et la twig

Lorsque la command remote et la twig sont omises, le comportement de git push --force est déterminé par vos parameters de configuration Git push.default :

 git push --force 
  • À partir de Git 2.0, le paramètre par défaut, simple , va simplement pousser votre twig actuelle vers sa partie distante en amont. La télécommand est déterminée par la twig de la branch.<remote>.remote , et par défaut le repo d'origine.

  • Avant la version 2.0 de Git, le paramètre par défaut, matching , bascule simplement toutes vos twigs locales vers des twigs portant le même nom sur la télécommand (par défaut, origin).

Vous pouvez lire plus de parameters push.default en lisant git help config ou une version en ligne de la page Manual de git-config (1) .

Forcer à pousser plus en security avec --force-with-lease

Forcer le push avec un "bail" permet à la force d'échouer s'il y a de nouveaux commits sur la télécommand auxquels vous ne vous attendiez pas (techniquement, si vous ne les avez pas encore récupérés dans votre twig de suivi à distance), ce qui est utile vous ne voulez pas écraser accidentellement les commits de quelqu'un que vous ne saviez même pas encore, et vous voulez juste écraser les vôtres:

 git push <remote> <branch> --force-with-lease 

Vous pouvez apprendre plus de détails sur la façon d'utiliser --force-with-lease en lisant l'un des éléments suivants:

  • git push documentation
  • Git: Comment ignorer l'avance rapide et rétablir l'origine [twig] à commettre plus tôt?

Une autre option est de:

  • mettez vos nouveaux commits dans une twig dédiée
  • réinitialiser votre master sur l' origin/master
  • fusionnez votre twig dédiée à master , en conservant toujours les validations de la twig dédiée (ce qui signifie créer de nouvelles révisions sur le master qui reflétera votre twig dédiée).
    Voir " command git pour faire une twig comme une autre " pour les stratégies pour simuler une git merge --strategy=theirs .

De cette façon, vous pouvez pousser maître à distance sans avoir à forcer quoi que ce soit.

git push -f est un peu destructeur car il réinitialise tous les changements à distance qui ont été effectués par quelqu'un d'autre dans l'équipe. Une option plus sûre est {git push –force-with-lease}.

Ce que {–force-with-lease} fait est de refuser de mettre à jour une twig sauf si c'est l'état que nous attendons; c'est-à-dire que personne n'a mis à jour la twig en amont. En pratique, cela fonctionne en vérifiant que le ref amont est ce que nous attendons, parce que refs sont des hashes, et encodent implicitement la string de parents dans leur valeur. Vous pouvez dire à {–force-with-lease} exactement ce qu'il faut vérifier, mais par défaut, il vérifie la reference distante actuelle. Ce que cela signifie dans la pratique est que lorsqu'Alice met à jour sa twig et la pousse vers le référentiel distant, la tête de pointage de la twig sera mise à jour. Maintenant, à less que Bob ne tire sur la télécommand, sa reference locale à la télécommand sera périmée. Quand il va pousser en utilisant {–force-with-lease}, git va vérifier la reference locale par rapport à la nouvelle télécommand et refuse de forcer le push. {–force-with-lease} vous permet seulement de forcer si personne d'autre n'a poussé les changements jusqu'à la télécommand dans l'intervalle. C'est {–force} avec la ceinture de security.