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.
git-rebase
sur des git-rebase
publics (distants). commit
ou stash
vos modifications en cours). $EDITOR
. 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:
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.