3 votes

Rétablir un projet de plus de 20 commits et ensuite réappliquer sélectivement seulement certains d'entre eux

J'ai un projet git où plusieurs commits ont été faits et je veux revenir sur la plupart d'entre eux. Cependant, au cours de cette période, il y a eu plusieurs corrections de bogues et d'autres commits que j'aimerais garder, alors je veux faire ce qui suit :

  1. Retourner le dépôt au commit sur lequel il était avant le premier commit que je veux retourner
  2. Passez en revue les commits et réappliquez seulement certains d'entre eux, et certains d'entre eux seulement partiellement.

Existe-t-il une séquence de commandes git qui me permette d'y parvenir ? Je pourrais comprendre comment revenir à un certain commit, mais je ne sais pas si le re-commiting sélectif est possible.

3voto

worc Points 1393

Vous n'avez pas besoin de revenir en arrière. Vous pouvez utiliser git rebase en mode interactif pour modifier votre historique. Par exemple, sur la branche de mon sujet actuel, si j'exécute git rebase -i master J'obtiens cette vue dans VIM :

pick 23299aa6 improve unit test messages
pick cf1c3c0c move sagas tests to where they'll get run
pick f7ff7fa7 use docker-compose up to rebuild the ui image more quickly
pick 544902ec split definitions file into helpers and given, when, then files
pick 55e94e7b remove canary test
pick 8a4b0862 move expectTitleToBe function to helper file

# Rebase 72b74f26..8a4b0862 onto 72b74f26 (6 commands)
#
# 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
# f, fixup = like "squash", but discard this commit's log message
# x, exec = run command (the rest of the line) using shell
# d, drop = remove commit
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
# However, if you remove everything, the rebase will be aborted.
#
# Note that empty commits are commented out

À partir de cette vue, je peux supprimer les lignes que je ne veux pas valider, si je ne veux pas supprimer le test canari, je peux supprimer ou commenter cette ligne ou utiliser la commande tomber commande. Je peux arrêter le rebasement à un commit et changer ce qui sera committé avec modifier (vous pourriez commettre partiellement ici en supprimant les modifications) et ainsi de suite pour les autres commandes listées :

edit 23299aa6 improve unit test messages
pick cf1c3c0c move sagas tests to where they'll get run
pick f7ff7fa7 use docker-compose up to rebuild the ui image more quickly
pick 544902ec split definitions file into helpers and given, when, then files
drop 55e94e7b remove canary test
pick 8a4b0862 move expectTitleToBe function to helper file

# Rebase 72b74f26..8a4b0862 onto 72b74f26 (6 commands)
#
# 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
# f, fixup = like "squash", but discard this commit's log message
# x, exec = run command (the rest of the line) using shell
# d, drop = remove commit
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
# However, if you remove everything, the rebase will be aborted.
#
# Note that empty commits are commented out

Pour votre situation et le rebasage contre vous-même et non contre une autre branche, vous pouvez regarder en arrière dans l'onglet git log pour trouver le hash du commit sur lequel vous voulez revenir. Il s'agit généralement d'un seul commit avant le travail que vous avez commencé : git rebase -i <where to "revert"> .

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