web-dev-qa-db-fra.com

Rebaser un seul commit Git

Existe-t-il un moyen de rebaser un seul commit d'une branche vers 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 maître et restauration Feature-branch un commit.

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

Comment je fais ça?

93
Kevin Meyer

Vous pouvez sélectionner XX pour maîtriser.

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

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

git checkout Feature-branch
git reset --hard HEAD^
99
tewe
git rebase --onto master branch~1 branch 

Ceci dit "rebase la plage des commits entre dernier-avant-branche et branche (c'est-à-dire XX commit) sur le bout de la branche principale"

Après cette opération, branch tip est déplacé le commit XX, vous voulez donc le réinitialiser avec

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

Ce qui dit "réinitialise le branchement de la branche au commit avant son état précédent"

Donc, un choix de cerises est une solution plus simple ...

78
CharlesB

C'est assez simple à faire en réalité. La solution consiste à créer une base interactive et à "supprimer" tous les commits que vous ne souhaitez pas inclure dans la base.

git rebase -i <target_branch>target_branch est la branche sur laquelle vous souhaitez vous baser

Ensuite, vous modifierez 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 emporter. .

28
hrdwdmrbl

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

 * a8f9182 (HEAD -> production) configuration de production 
 | * daa18b7 configuration (pré) pré-production 
 |/
 | * d365f5f (local) configuration locale 
 |/
 * 27d2835 (dev) nouvelle fonctionnalité étonnante qui sauvera le monde 
 * | 56d2467 (maître) ennuyeux état de l'art pour le projet 
 | /

que je crée une nouvelle commande pour cela:

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

normalement, vous souhaitez compléter automatiquement les noms de branche pour cette commande, ajoutez-la à cette source (en 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) config de BBDD 
 * a8f9182 (local) config locale 
 * a8f9182 (debug) config de niveau de journalisation 
 * a8f9182 (dev) nouvelle fonctionnalité 
 | 

Je suppose que c’est ce que couette les gens aiment faire.

cette commande fonctionnera quand même avec tout ce que sha/ref vous fournira:

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