Rétablir certains commits Git, garder les autres?

Supposons que je fasse des commits A, B et C, qui ont tous touché des paths de code entièrement différents. (Ils sont donc indépendants et le commit B peut exister sans les changements dans A, et ainsi de suite.)

Commit A a introduit un bug, alors que committe B et C sont bien. Je veux donc revenir à l'état de mon code avant la validation A, puis valider les modifications B et C.

Quelle est la meilleure façon de faire cela? Une façon est de simplement faire un git revert <SHA-of-commit-before-A> et ensuite rappend manuellement dans les commits B et C – y a-t-il une meilleure solution?

Solutions Collecting From Web of "Rétablir certains commits Git, garder les autres?"

Vous n'avez pas besoin de rappend B et C : ils sont déjà validés et ne seront pas impactés par votre return qui ajoute un nouveau commit (image négative de A ).

Une autre façon est ( si vous n'avez pas déjà poussé ces commits ) de faire une rebase interactive ( git rebase -i A^ ), et de réorganiser vos commits, en laissant tomber complètement A
Vous verrez dans votre rebase les options suivantes (voir git Book )

 # Commands: # p, pick = use commit # e, edit = use commit, but stop for amending # s, squash = use commit, but meld into previous commit # # If you remove a line here THAT COMMIT WILL BE LOST. # However, if you remove everything, the rebase will be aborted. # 

Mais encore une fois, cela va changer votre histoire et vous fera un coup de pouce – force, ce qui n'est pas toujours une bonne idée, si d'autres personnes ont déjà tiré de votre repo.
Dans ce cas, le return rest la solution la plus sûre.

Si vous avez déjà poussé vos modifications (afin qu'elles soient visibles par les autres), la bonne chose à faire est git-revert <SHA-of-A> . Cela fait explicitement un nouveau commit qui est le contraire de A. Si personne n'a encore vu votre tree, vous pouvez utiliser git-rebase -i A^ (où A^ signifie "parent de A") pour réorganiser ou omettre interactivement les commits depuis A. Dans ce cas, vous pouvez supprimer A et il ferait exactement ce que vous avez décrit (se détendre juste avant A, puis réappliquer seulement B et C).