Je souhaite supprimer les entrées de journal de validation sélectionnées d'un arbre de validation linéaire afin qu'elles ne s'affichent pas dans le journal de validation.
Mon arbre de commit ressemble à quelque chose comme:
R--A--B--C--D--E--HEAD
Je souhaite supprimer les entrées B et C afin qu'elles ne s'affichent pas dans le journal de validation, mais les modifications de A à D doivent être conservé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 A, vient directement de D. D 'représentant les 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 branche à ce jour et n’est donc pas fusionné.
git-rebase (1) fait exactement cela.
$ git rebase -i HEAD~5
git awsome-ness [git rebase --interactive] contient un exemple.
git-rebase
sur les commits publics (à distance).commit
ou stash
vos modifications actuelles).$EDITOR
.pick
avant C
et D
par squash
. Il fusionnera C et D en B. Si vous souhaitez supprimer un commit, supprimez simplement sa ligne.Si vous êtes perdu, tapez:
$ git rebase --abort
# detach head and move to D commit
git checkout <SHA1-for-D>
# move HEAD to A, but leave the index and working tree as for D
git reset --soft <SHA1-for-A>
# Redo the D commit re-using the commit message, but now on top of A
git commit -C <SHA1-for-D>
# Re-apply everything from the old D onwards onto this new place
git rebase --onto HEAD <SHA1-for-D> master
Voici un moyen de supprimer un identifiant de validation spécifique en ne connaissant que l'identifiant 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 J.F. Sebastian:
Vous pouvez utiliser git-rebase pour apporter facilement toutes sortes de modifications à votre historique de validation.
Après avoir exécuté 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. Vous pouvez également ajouter une commande pour combiner (supprimer) deux commissions en une seule validation (la validation précédente est la validation ci-dessus), modifier les modifications (ce qui a été modifié) ou reformuler les messages de validation.
Je pense que "pick" signifie simplement que vous voulez laisser ce commet seul.
(L'exemple est de ici )
Vous pouvez non-interactivement supprimer B et C dans votre exemple avec:
git rebase --onto HEAD~5 HEAD~3 HEAD
ou symboliquement,
git rebase --onto A C HEAD
Notez que les changements dans B et C seront et non dans D; ils seront partis .
Une autre façon,
git rebase -i ad0389efc1a79b1f9c4dd6061dca6edc1d5bb78a (C's hash)
and
git Push Origin master -f
choisissez le hash que vous voulez utiliser comme base, et la commande ci-dessus devrait le rendre interactif afin de pouvoir écraser tous les messages haut (vous devez laisser les plus anciens)
Je trouve ce processus beaucoup plus sûr et plus facile à comprendre en créant une autre branche à partir de la SHA1 de A et en sélectionnant les modifications souhaitées afin de m'assurer que je suis satisfait de l'apparence de cette nouvelle branche. Après cela, il est facile de supprimer l’ancienne branche et de renommer la nouvelle.
git checkout <SHA1 of A>
git log #verify looks good
git checkout -b rework
git cherry-pick <SHA1 of D>
....
git log #verify looks good
git branch -D <oldbranch>
git branch -m rework <oldbranch>
Je viens de recueillir toutes les réponses des gens: (m nouveau pour git plz l’utiliser à titre de référence seulement)
journal 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:
pick 0c2236d Nouvelle ligne ajoutée.
Rebaser 2a1cd65..0c2236d sur 2a1cd65 (1 commande)
#
Commandes:
p, pick = use commit
r, reword = utilise commit, mais édite le message de commit
e, edit = utilise commit, mais arrête pour modification
s, squash = utilise commit, mais fusionne avec le commit précédent
f, fixup = like "squash", mais ignore le message de journal de ce commit
x, exec = commande d'exécution (le reste de la ligne) à l'aide de Shell
d, drop = remove commit
#
Ces lignes peuvent être réordonnées. ils sont exécutés de haut en bas.
#
Si vous supprimez une ligne ici, CE COMMIT SERA PERDU.
#
Cependant, si vous supprimez tout, la base sera annulée.
#
Notez que les commits vides sont commentés ~ ~
~
~
~
~
~
~
~
~
~
Ici, changez la première ligne selon vos besoins (en utilisant les commandes listées ci-dessus, par exemple "drop" pour supprimer les commit, etc.). Une fois terminé, appuyez sur ": x" pour enregistrer et quitter l'éditeur (ceci est pour l'éditeur vim uniquement)
Puis
git Push
Si cela pose problème, vous devez forcer avec force les modifications à distance (ITS TRY CRITICAL: ne forcez pas Push si vous travaillez en équipe).
git push -f origine