Comment supprimer les entrées de journal de validation sélectionnées d’un référentiel Git tout en conservant leurs modifications?

Je voudrais supprimer les entrées de journal de validation sélectionnées dans une arborescence de validation linéaire, afin que les entrées ne s’affichent pas dans le journal de validation.

Mon arbre de validation ressemble à quelque chose comme:

R--A--B--C--D--E--HEAD 

Je voudrais supprimer les entrées B et C afin qu’elles n’apparaissent pas dans le journal de validation, mais les modifications de A à D doivent être préservées. Peut-être en introduisant un seul commit, pour que B et C deviennent BC et que l’arbre ressemble.

 R--A--BC--D--E--HEAD 

Ou, idéalement, après que A vienne directement. D ‘représentant des changements de A à B, B à C et C à D.

 R--A--D'--E--HEAD 

Est-ce possible? si oui, comment?

Il s’agit d’un projet relativement nouveau, il n’a donc pas de twigs à l’heure actuelle, donc pas de fusion.

    c’est exactement ce que fait git-rebase (1) .

     $ git rebase -i HEAD~5 

    git awsome-ness [git rebase –interactive] contient un exemple.

    1. N’utilisez pas git-rebase sur des git-rebase publics (distants).
    2. Assurez-vous que votre répertoire de travail est propre ( commit ou stash vos modifications en cours).
    3. Exécutez la commande ci-dessus. Il lance votre $EDITOR .
    4. Remplacer le pick avant C et D par une squash . Il fusionne C et D en B. Si vous souhaitez supprimer un commit, il vous suffit de supprimer sa ligne.

    Si vous êtes perdu, tapez:

     $ git rebase --abort 
     # detach head and move to D commit git checkout  # move HEAD to A, but leave the index and working tree as for D git reset --soft  # Redo the D commit re-using the commit message, but now on top of A git commit -C  # Re-apply everything from the old D onwards onto this new place git rebase --onto HEAD  master 

    Voici un moyen de supprimer un identifiant de validation spécifique en ne connaissant que l’ID de validation que vous souhaitez supprimer.

     git rebase --onto commit-id^ commit-id 

    Notez que cela supprime réellement la modification introduite par la validation.

    Pour développer la réponse de JF Sebastian:

    Vous pouvez utiliser git-rebase pour apporter facilement toutes sortes de modifications à votre historique de validation.

    Après avoir lancé git rebase –interactive, vous obtenez ce qui suit dans votre $ EDITOR:

     pick 366eca1 This has a huge file pick d975b30 delete foo pick 121802a delete bar # Rebase 57d0b28..121802a onto 57d0b28 # # Commands: # p, pick = use commit # r, reword = use commit, but edit the commit message # e, edit = use commit, but stop for amending # s, squash = use commit, but meld into previous commit 

    Vous pouvez déplacer des lignes pour modifier l’ordre des validations et supprimer des lignes pour supprimer ces validations. Ou vous pouvez append une commande pour combiner (squash) deux commits en un seul commit (commit précédent est le commit ci-dessus), éditer les commits (ce qui a été modifié), ou reformuler les messages de validation.

    Je pense que choisir signifie simplement que vous voulez quitter cet engagement seul.

    (Exemple est d’ ici )

    Vous pouvez supprimer de manière non interactive B et C dans votre exemple avec:

     git rebase --onto HEAD~5 HEAD~3 HEAD 

    ou symboliquement,

     git rebase --onto AC HEAD 

    Notez que les changements dans B et C ne seront pas en D; ils seront partis .

    Je trouve ce processus beaucoup plus sûr et facile à comprendre en créant une autre twig du SHA1 de A et en sélectionnant les modifications souhaitées pour que je sois satisfait de l’aspect de cette nouvelle twig. Après cela, il est facile de supprimer l’ancienne twig et de renommer la nouvelle.

     git checkout  git log #verify looks good git checkout -b rework git cherry-pick  .... git log #verify looks good git branch -D  git branch -m rework  

    Une autre façon,

     git rebase -i ad0389efc1a79b1f9c4dd6061dca6edc1d5bb78a (C's hash) and git push origin master -f 

    choisissez le hachage que vous souhaitez utiliser comme base, et la commande ci-dessus devrait le rendre interactif afin de pouvoir écraser tous les messages principaux (vous devez laisser le plus ancien)

    Je viens juste de rassembler les réponses de toutes les personnes:

    Git rebase pour supprimer tous les commits

    journal de git

     -first check from which commit you want to rebase 

    Git rebase -i HEAD ~ 1

     -Here i want to rebase on the second last commit- commit count starts from '1') -this will open the command line editor (called vim editor i guess) 

    Ensuite, l’écran ressemblera à ceci:

    choisissez 0c2236d Ajout d’une nouvelle ligne.

    Rebase 2a1cd65..0c2236d sur 2a1cd65 (1 commande)

    #

    Commandes:

    p, choisir = utiliser commettre

    r, reword = use commit, mais édite le message de validation

    e, edit = use commit, mais arrête de modifier

    s, squash = utiliser commit, mais se fondre dans un commit précédent

    f, fixup = comme “squash”, mais ignorez le message de ce commit

    x, exec = exécuter la commande (le rest de la ligne) en utilisant le shell

    d, drop = remove commit

    #

    Ces lignes peuvent être réorganisées; ils sont exécutés de haut en bas.

    #

    Si vous supprimez une ligne ici, cette opération sera perdue.

    #

    Cependant, si vous supprimez tout, le rebase sera annulé.

    #

    Notez que les validations vides sont commentées ~ ~

    ~
    ~
    ~
    ~
    ~
    ~
    ~
    ~
    ~

    Ici, modifiez la première ligne selon vos besoins (en utilisant les commandes listées ci-dessus, par exemple ‘drop’ pour supprimer commit, etc.). Une fois l’édition terminée, appuyez sur ‘: x’ pour sauvegarder et quitter l’éditeur

    Et alors

    git push

    Si c’est le problème, alors vous devez forcer les modifications à distance (SON TRÈS CRITIQUE: ne forcez pas si vous travaillez en équipe)

    git push -f origine

    Vous pouvez utiliser git cherry-pick pour cela. ‘cherry-pick’ va appliquer un commit sur la twig votre maintenant.

    alors fais

     git rebase --hard  

    puis appliquez les commits D et E.

     git cherry-pick  git cherry-pick  

    Cela va ignorer les commit B et C. Cela dit, il pourrait être impossible d’appliquer le D commit à la twig sans B, donc YMMV.