141 votes

Rebasement d'un seul commit Git

Existe-t-il un moyen de rebaser un seul commit d'une branche sur une autre branche ?

J'ai cette structure de branche :

-- -- -- -- -- (Master)
            \
              -- -- -- -- -- XX (Feature-branch)

Tout ce que je veux faire est de rebaser le dernier commit de Feature-branch sur le master et le rollback Feature-branch un engagement.

-- -- -- -- -- XX (Master)
            \
              -- -- -- -- -- (Feature-branch)

Comment je fais ça ?

139voto

tewe Points 658

Vous pouvez sélectionner XX à maîtriser.

git checkout master
git cherry-pick <commit ID of XX>

Et supprimez le dernier commit de la branche feature avec git reset.

git checkout Feature-branch
git reset --hard HEAD^

122voto

CharlesB Points 27070
git rebase --onto master branch~1 branch 

Cela dit "rebase la plage de commits entre last-before-branch et branch (c'est-à-dire XX commit) sur la pointe de la branche master".

Après cette opération branch la pointe est déplacée sur l'engagement XX et vous voulez donc le remettre à zéro avec

git checkout branch
git reset --hard branch@{1}^

Qui dit "réinitialiser l'extrémité de la branche au commit avant son état précédent"

Donc, un "cherry pick" est une solution plus simple...

77voto

jackquack Points 1246

C'est assez simple à faire en fait. La solution est de faire un rebase interactif et de "laisser tomber" tous les commits que vous ne voulez pas inclure dans le rebase.

git rebase -i <target_branch>target_branch est la branche sur laquelle vous voulez rebaser vers

Ensuite, vous allez éditer le fichier qui est ouvert et pick les commits que vous voulez et drop (ou d pour faire court) tous les commits que vous ne voulez pas emmener avec vous.

0voto

albfan Points 2333

La réponse de @Charles est correcte. Quoi qu'il en soit, j'ai fini par l'utiliser de nombreuses fois, surtout pour rebaser une configuration spécifique sur un projet.

  \* a8f9182 (HEAD -> production) production configuration
  | \* daa18b7 (pre) preproduction configuration
  |/  
  | \* d365f5f (local) local configuration
  |/  
  \* 27d2835 (dev) amazing new feature that will save the world
\* | 56d2467 (master) boring state of the art for project
|/

que je crée une nouvelle commande pour ça :

$ cat ~/bin/git-rebaseshot 
COMMIT=$1
DEST=${2:-HEAD}
git rebase ${COMMIT}^ ${COMMIT} --onto $DEST

Normalement, vous voulez que les noms de branches soient autocomplétés pour cette commande, alors ajoutez-la en utilisant cette fonction (en l'ajoutant à .bashrc ou .profile) :

\_git\_rebaseshot () 
{ 
    \_\_gitcomp\_nl "$(\_\_git\_refs)"
}

git autocomplete le recherchera

vous pouvez utiliser cette commande comme ceci :

# rebase config on prepro on actual HEAD
$ git rebaseshot prepro 
# rebase config on local onto dev
$ git rebaseshot local dev
# rebase production config on master
$ git rebaseshot pro master

Lorsque vous divisez les caractéristiques correctement, les possibilités sont infinies.

\* a8f9182 (HEAD -> postgres) BBDD config
\* a8f9182 (local) local config
\* a8f9182 (debug) log level config
\* a8f9182 (dev) new feature
|

Je suppose que c'est ce que édredon que les gens aiment faire.

cette commande fonctionnera de toute façon avec le sha/ref que vous fournissez :

$ git rebaseshot <Feature branch> master
$ git rebaseshot <commit of XX> master

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