web-dev-qa-db-fra.com

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

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é.

238
xk0der

git-rebase (1) fait exactement cela.

$ git rebase -i HEAD~5

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

  1. N'utilisez pas git-rebase sur les commits publics (à distance).
  2. Assurez-vous que votre répertoire de travail est propre (commit ou stash vos modifications actuelles).
  3. Exécutez la commande ci-dessus. Il lance votre $EDITOR.
  4. Remplacez 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  
270
jfs
# 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
73
CB Bailey

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.

40
rado

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 )

19
idbrii

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 .

14
Head

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)

3
resultsway

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>
2
Eric Woodruff

Je viens de recueillir toutes les réponses des gens: (m nouveau pour git plz l’utiliser à titre de référence seulement)

git rebase pour supprimer les commits

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

0
Shrinath Kopare