224 votes

Comment puis-je écraser deux commits non consécutifs?

Je suis un peu nouveau sur toute la fonctionnalité de rebasement au sein de git. Disons que j'ai fait les commits suivants:

 A -> B -> C -> D
 

Ensuite, je me rends compte que D contient un correctif qui dépend d’un nouveau code ajouté dans A et que ces commits vont ensemble. Comment puis-je écraser A & D ensemble et laisser B & C seul?

324voto

Rudi Points 8756

Vous pouvez exécuter git rebase --interactive et réorganiser D avant B et écraser D en A.

46voto

Nate Points 870

Remarque: Vous ne devez pas rebase commits qui ont été poussés à un autre repo.

git log --oneline -4

D commit_message_for_D
C commit_message_for_C
B commit_message_for_B
A commit_message_for_A

git rebase --interactive

pick D commit_message_for_D
pick C commit_message_for_C
pick B commit_message_for_B
pick A commit_message_for_A

Type i (Mettre VIM en mode insertion)

Modifier la liste ressemble à ceci (Vous n'avez pas à supprimer ou d'inclure le message de commit):

pick C commit_message_for_C
pick B commit_message_for_B
pick A commit_message_for_A
squash D

Type Esc , puis ZZ (Enregistrer et quitter VIM)

# This is a combination of 2 commits.
# The first commit's message is:

commit_message_for_D

# This is the 2nd commit message:

commit_message_for_A

Type i

Le changement qu'elle ressemble à ceci:

new_commit_message_for_A_and_D

Type Esc , puis ZZ

git log --oneline -4

E new_commit_message_for_A_and_D
C commit_message_for_C
B commit_message_for_B

git show E

(You should see a diff showing a combination of changes from A and D)

-1voto

Cotton Points 810

$ git checkout master

$ git log --oneline

 D
C
B
A
 

$ git rebase --to HEAD ^^^ HEAD ^

$ git log --oneline

 D
A
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X