8
votes

GIT: une meilleure façon pour Git Revert sans engagement supplémentaire révolutionnaire

J'ai un commit dans une succursale locale distante et je tiens à jetter cela commettez de l'histoire et de mettre certains d'entre eux dans une propre branche.

Fondamentalement, j'ai maintenant: P>

             E---G topic
            /
           D master


0 commentaires

3 Réponses :


4
votes

Vous pouvez réécrire votre histoire si vous le souhaitez, mais c'est une mauvaise idée si quelqu'un d'autre a des copies de l'histoire. Dans ce cas, vous utiliseriez probablement une rebasse interactive: git rebase -i sujet maître . Cela vous donnera une liste de commettre du Master au sujet, avec des astuces sur la façon de jouer avec eux. Vous auriez juste besoin de supprimer la ligne contenant le COMMIT que vous souhaitez supprimer.

Cela dit, je dois souligner qu'il est irresponsable de le faire si quelqu'un d'autre a cette histoire. Il vous faudrait forcer-le pousser à votre repo central et que tout le monde devrait réparer leurs référentiels pour correspondre, peut être relativement simple ou complexe en fonction des circonstances.

Il y a une belle section intitulée "Récupération de la Rebase en amont" dans le Page Git-Rebase < / a> discuter de la manière de traiter cela, si vous décidez vraiment de.

EDIT:

Pour une histoire simple, un scénario courant serait, après avoir forcé une poussée non rapide à la repo central ( push -f -f ), d'autres développeurs:


5 commentaires

Ok, merci beaucoup pour ces informations. Donc, ce n'est pas vraiment une solution alors parce que je ne veux pas faire une telle force-poussée. Quelle serait la solution la plus propre pour obtenir un résultat similaire? Celui que je penserais maintenant est de revenir à E, F, G en Master, puis créez une nouvelle succursale à partir de cet état et de ce choix de cerisier E et G. est que ce que l'on ferait naturellement?


Il y a aucun moyen de supprimer un engagement de l'histoire sans causer ces types de problèmes. Peu importe ce que vous faites, vous allez finir par pointer votre maître Ref à un commit qui n'a pas la position précédente de la maîtrise dans son histoire.


Ceci est largement abordé dans ma réponse à votre nouvelle version de cette question, mais pour répondre à votre commentaire: peu importe la façon dont vous entrez dans un état dans lequel vous avez réécrit l'histoire de Maître. Vous aurez toujours réécrit. Si vous faites toutes ces choses localement , c'est bon. Cela s'appelle le nettoyage. Si vous les faites au travail publié, vous jouez des choses, créant un repo public que personne ne peut faire confiance, etc.


Avec Refenser E, F, G, je voulais utiliser Git-Revert. Donc, l'histoire serait un peu laide mais je n'aurais pas à traiter de ces problèmes, car je vouloir changer déjà l'histoire.


Ah ok. Désolé, j'ai mal compris et pensais que vous parliez de pointer du maître à l'ensemble choisi Cherry. Si vous souhaitez créer cette nouvelle succursale, vous pouvez toujours utiliser la même méthode de Rebase - faites-la simplement sur Master-New, pas Master.



7
votes

Si vous avez publié, vous avez raison de ne pas vouloir ré-écrire l'historique de maître . Ce que vous voulez, c'est de publier un engagement à maîtriser qui le ramène à l'état qu'il était à d tout en conservant son historique actuel afin que d'autres utilisateurs puissent fusionner ou rebaisser facilement leur travail.

Si Vous planifiez à un moment donné à l'avenir de fusionner Sujet dans Master , alors ce que vous voulez probablement aussi faire est de faire une nouvelle base commune entre maître et sujet , de sorte que lorsque vous fusionnez ultérieurement sujet , vous ne perdez pas les engagements qui ont été retournés dans maître . Le moyen le plus simple de le faire est de faire un «refonte» commet-t-il en haut de la commission «annuler» qui réinitialise maître à son état d'origine et en basant le nouveau sujet branche sur le dessus de cela. xxx

comme une alternative que vous auriez pu faire commettre E ', F' et G 'refaire chaque partie séparément mais comme E, F et G sont déjà dans Votre histoire publiée Il est probablement plus compréhensible si vous faites simplement référence à «Annuler» commettez et disons que ce commettre est annulé. C'est ce que git revert fait, de toute façon.

essentiellement ce que vous savez avoir est-ce. xxx

Les choses importantes sont que vous n'avez pas réécrit l'histoire et que le sujet est basé sur le maître, de sorte que les fantasmes n'appliqueront pas accidentellement de «annuler» commet. Vous pouvez désormais pousser en toute sécurité les deux maître et sujet sur votre référentiel distant.


4 commentaires

Merci, c'est exactement ce que j'ai fait maintenant (aussi ce que j'ai suggéré dans certains des commentaires à JEFROMI). L'histoire est un peu laide maintenant à cause de cet annulation, mais je ne peux rien faire à ce sujet.


2 semaines utilisateur git ici. Ne serait-il pas plus facile de la première branche g to g ', puis git revenir g à d, résultant en D'? De cette façon, vous n'avez pas à annuler / refaire quoi que ce soit, ce qui se sent beaucoup plus sûr pour moi. (J'ai déjà des modifications perdues sans recouvertes en raison de la gâche avec GIT RESET .)


@bart, consultez git reflog . Des trucs qui ont été comisés et ensuite vissés devraient toujours être récupérables à travers le reflex, au moins pendant quelques jours. Vous pouvez toutefois perdre des changements sans recouvertes que vous n'avez jamais commis.


@bart, Charles Bailey explique pourquoi il a fait des choses dans l'ordre qu'il a fait ici quand il dit "Vous voulez probablement aussi faire est de faire une nouvelle base commune entre le maître et le sujet, de sorte que lorsque vous fusionnez ensuite de sujet, vous ne fusionnez pas. perdre les commits qui ont été retournés en maître. "



-3
votes

Je trouve git cache est assez utile

Stassez-le simplement et ne le regarde plus jamais.


1 commentaires

Utilisez GIT RESET HEAD ^ pour que vous puissiez sortir sans perdre vos modifications.