Je souhaite supprimer les entrées de journal de validation sélectionnées d'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 à ceci:
R--A--B--C--D--E--HEAD
Je voudrais 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 que A vient directement 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 succursales pour l'instant, donc pas de fusion aussi.
rebase
peut supprimer les anciens / créer de nouveaux commits. Je ne sais pas ce que signifie "valider les entrées du journal".git log
affiche le "journal de validation" git-scm.com/docs/git-log . Et je voulais me débarrasser de deux entrées de ce journal - pas des changements.Réponses:
git-rebase (1) fait exactement cela.
git awsome-ness [git rebase --interactive] contient un exemple.
git-rebase
sur des validations publiques (distantes).commit
oustash
vos modifications actuelles).$EDITOR
.pick
avantC
etD
parsquash
. Il fusionnera C et D en B. Si vous souhaitez supprimer un commit, supprimez simplement sa ligne.Si vous êtes perdu, tapez:
la source
git rebase -i D [A]
?push -f
vos changements. Ne le faites pas si vous ne travaillez pas seul.git-rebase
manuel et la machine de retour pour le billet de blog.la source
Voici un moyen de supprimer un ID de validation spécifique en ne connaissant que l'ID de validation que vous souhaitez supprimer.
Notez que cela supprime réellement la modification introduite par la validation.
la source
Pour développer la réponse de JF Sebastian:
Vous pouvez utiliser git-rebase pour apporter facilement toutes sortes de modifications à votre historique de commit.
Après avoir exécuté git rebase --interactive, vous obtenez ce qui suit dans votre $ EDITOR:
Vous pouvez déplacer des lignes pour modifier l'ordre des validations et supprimer des lignes pour supprimer cette validation. Ou vous pouvez ajouter une commande pour combiner (écraser) deux validations en une seule validation (la validation précédente est la validation ci-dessus), modifier les validations (ce qui a été modifié) ou reformuler les messages de validation.
Je pense que choisir signifie simplement que vous voulez laisser cet engagement seul.
(L'exemple vient d' ici )
la source
Vous pouvez supprimer de manière non interactive B et C dans votre exemple avec:
ou symboliquement,
Notez que les changements en B et C ne seront pas en D; ils seront partis .
la source
Encore une façon,
choisissez le hachage que vous souhaitez utiliser comme base, et la commande ci-dessus devrait le rendre interactif afin que vous puissiez écraser tous les premiers messages (vous devez laisser le plus ancien)
la source
Je trouve ce processus beaucoup plus sûr et plus facile à comprendre en créant une autre branche à partir du SHA1 de A et en sélectionnant les changements souhaités afin de pouvoir 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.
la source
Je viens de rassembler les réponses de toutes les personnes: (m nouveau pour git plz l'utiliser uniquement à titre de référence)
git rebase pour supprimer les commits
git log
git rebase -i HEAD ~ 1
L'écran ressemblera alors à ceci:
Ici, changez la première ligne selon vos besoins (en utilisant les commandes énumérées ci-dessus, c'est-à-dire 'drop' pour supprimer la validation, etc.) Une fois terminé, appuyez sur ': x' pour enregistrer et quitter l'éditeur (c'est pour l'éditeur vim uniquement)
Puis
git push
Si son problème s'affiche, vous devez forcer les modifications à distance (SON TRÈS CRITIQUE: ne forcez pas si vous travaillez en équipe)
git push -f origine
la source
Vous pouvez utiliser git cherry-pick pour cela. 'cherry-pick' appliquera un commit sur la branche que vous utilisez maintenant.
alors fais
puis appliquez les commits D et E.
Cela sautera la validation B et C. Cela dit, il pourrait être impossible d'appliquer le commit D à la branche sans B, donc YMMV.
la source
reset --hard
, pasrebase --hard
(qui n'existe pas)