2016-12-01 1 views
2

Je suis nouveau à git et je ne sais pas comment aborder cela.Renvoi passé git commits, mais gardez les changements introduits depuis

Je souhaite annuler une série de validations spécifiques (relatives à un seul fichier) qui, selon nous, ne constituent pas une bonne solution à un problème, mais je souhaite préserver tous les autres validations introduites depuis.

Je ne veux pas simplement éditer le fichier pour supprimer ce morceau de code car je pense que revenir ici est plus explicite et communique mieux l'intention.

Il va quelque chose comme ceci:

X -> Y -> X -> -X ->Y -> X -> X

Y se réfère aux validations relatives à cette fonctionnalité particulière et X sont tous les commits que nous voulons garder intacts, se terminant par:

X -> X -> -X -> X -> X

Je ne sais pas comment rebasage fonctionnerait ici car je ne veux pas simplement inclure tous les engage à partir d'un certain point partir.

Est-ce que choisir une cerise serait une meilleure approche?

EDIT: Il vaut probablement la peine de mentionner que tous ces commits sont poussés.

+1

rebasage Interactive et simplement supprimer l'infraction engage de la liste de sélection. –

Répondre

1

Vous pouvez utiliser git rebase --onto comme expliqué ici: https://blog.pivotal.io/labs/labs/git-rebase-onto

Dans votre cas particulier:

X1 -> Y1 -> X2 -> X3 -> Y2 -> X4 -> X5 

Les commandes seraient:

git rebase --onto X3 Y2 # strips Y2 
git rebase --onto X1 Y1 # strips Y1 
+0

Juste pour confirmer, cela doit être fait dans l'ordre chronologique inverse? Du plus tôt au plus tôt? – Nobilis

+0

@Nobilis: Vous pouvez le faire dans n'importe quel ordre, mais modifier l'historique peut modifier les hachages ultérieurs, j'ai donc choisi de le faire de cette façon car vous pouvez écrire les hachages au début du processus et les utiliser sans vérifier eux encore. Si vous le faites dans l'autre sens, cela ne devrait rien faire de terrible, mais je pense que cela pourrait échouer et que vous devriez revoir les hachages avant chaque étape. –

+0

Merci pour le conseil, je considérerai rebase --onto dont je n'étais pas au courant à l'avenir mais ayant poussé ces commits il semble que réécrire l'histoire n'est pas une option conseillée dans notre cas. Je vais devoir descendre le chemin 'revert'. – Nobilis

0

Vous pouvez revenir un fichier spécifique à une précédente valider:

git reset <commit hash> <filename>

Il pourrait être bon de revoir les modifications apportées au fichier premier:

git diff <commit hash> <file name>

Vous pouvez obtenir avec git log engager hash.

Alternativement, vous pouvez simplement la caisse de la version précédente du fichier de contrôle de version:

git checkout -- <file name>

Edit: Plus d'info here.

0

Personnellement, je préfère git rebase -i HEAD ~ 10 (rebase interactif des 10 derniers commits) où je laisserais tomber les mauvais commits en commentant leurs lignes.Notez que cela nécessite un push --force qui est toujours quelque chose à faire très attention à propos de.

2

Vous pouvez utiliser le rebasage interactif afin de corriger vos erreurs si vos commits ne sont pas encore partagés (encore commits locaux dans votre dépôt)

Le syntax est: git rebase --interactive commettras de hash (ou juste git rebase-hash hash)

Dans votre cas, disons que le hash de votre première x commit est x1 (utilisez git log pour git le code de hachage pour cette validation), alors vous pouvez utiliser: git rebase -i x1

enter image description here

Pour chaque validation que vous souhaitez supprimer remplacer ramasser par goutte

Puis mettez le mode d'édition (en utilisant la touche ESC) et: wq