Quick Tip – Déplacer un commit de l’historique GIT sur une nouvelle branche

Il m’est arrivé récemment de vouloir déplacer un commit de mon historique sur une autre branche : à la base, il ne s’agissait que d’un petit correctif, qui s’est transformé en une fonctionnalité à part.

J’ai en revanche passé beaucoup de temps à trouver comment faire pour effectuer cette modification dans mon dépot.
Vous trouverez ci-dessous la liste de commandes que j’ai utilisé afin d’arriver à mes fins.

Attention, si vous avez déjà poussé les modifications sur un autre dépôt, vous risquez d’avoir des problèmes.
J’utilise par ailleurs le raccourci « git lg » que vous pourrez retrouver dans le dépot dotfiles de mon github.

[09:53] bruno@PC-Bruno:~/git/project[master]$ git lg
* 034bcdf – (HEAD, master) Update on new functionality (Bruno Sabot 10 minutes ago)
* d39bc5b – New functionality (Bruno Sabot 10 minutes ago)
* 4102855 – Small bugfix (Bruno Sabot 10 minutes ago)
* 768cd9a – Initial commit (Bruno Sabot 10 minutes ago)
[09:55] bruno@PC-Bruno:~/git/project[master]$ git checkout 4102855
Note: checking out ‘4102855’.
You are in ‘detached HEAD’ state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.
If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:
git checkout -b new_branch_name
HEAD is now at 4102855… Small bugfix
[09:56] bruno@PC-Bruno:~/git/project[(4102855…)]$ git branch project
[09:56] bruno@PC-Bruno:~/git/project[(4102855…)]$ git checkout master
Previous HEAD position was 4102855… Small bugfix
Switched to branch ‘master’
[09:56] bruno@PC-Bruno:~/git/project[master]$ git lg
* 034bcdf – (HEAD, master) Update on new functionality (Bruno Sabot 12 minutes ago)
* d39bc5b – New functionality (Bruno Sabot 12 minutes ago)
* 4102855 – (project) Small bugfix (Bruno Sabot 12 minutes ago)
* 768cd9a – Initial commit (Bruno Sabot 13 minutes ago)
[09:56] bruno@PC-Bruno:~/git/project[master]$ git rebase –onto 768cd9a 4102855 master
First, rewinding head to replay your work on top of it…
Applying: New functionality
Applying: Update on new functionality
[09:56] bruno@PC-Bruno:~/git/project[master]$ git lg
* 1aa8de7 – (HEAD, master) Update on new functionality (Bruno Sabot 4 seconds ago)
* 4afb8d3 – New functionality (Bruno Sabot 4 seconds ago)
* 768cd9a – Initial commit (Bruno Sabot 13 minutes ago)
[09:56] bruno@PC-Bruno:~/git/project[master]$ git checkout project
Switched to branch ‘project’
[09:56] bruno@PC-Bruno:~/git/project[project]$ git lg
* 4102855 – (HEAD, project) Small bugfix (Bruno Sabot 13 minutes ago)
* 768cd9a – Initial commit (Bruno Sabot 13 minutes ago)
[09:56] bruno@PC-Bruno:~/git/project[project]$ git checkout master
Switched to branch ‘master’
[09:56] bruno@PC-Bruno:~/git/project[master]$ git merge project
Merge made by recursive.
0 files changed, 0 insertions(+), 0 deletions(-)
create mode 100644 project2
[09:56] bruno@PC-Bruno:~/git/project[master]$ git lg
* 66b91dd – (HEAD, master) Merge branch ‘project’ (Bruno Sabot 1 seconds ago)
|
| * 4102855 – (project) Small bugfix (Bruno Sabot 13 minutes ago)
* | 1aa8de7 – Update on new functionality (Bruno Sabot 25 seconds ago)
* | 4afb8d3 – New functionality (Bruno Sabot 25 seconds ago)
|/
* 768cd9a – Initial commit (Bruno Sabot 13 minutes ago)

 

Toute la magie s’opère à la commande « git rebase –onto 768cd9a 4102855 master » :
– Le rebase signifie que l’on veut déplacer des commits de notre arbre
–onto 768cd9a indique que les commits déplacés le seront à la suite du commit #768cd9a
4102855 master sélectionne tous les commits entre 4102855 (exclu) et master (inclus)

A vous de jouer !

Publicités

Auteur : Bruno Sabot

Développeur Front end, Mobile, Ergonomie, UX

4 réflexions sur « Quick Tip – Déplacer un commit de l’historique GIT sur une nouvelle branche »

    1. Pas tout à fait !

      Le cherry-pick permet de copier le contenu d’un commit d’une branche à une autre, mais pas de le supprimer de l’ancienne branche, ce qui était le comportement recherché par cette méthode.
      L’utilisation du cherry-pick m’obligerait donc à réécrire l’historique par la suite ou de rajouter un commit « revert » du 4102855, chose que je cherchais à éviter.

      A moins qu’il y ait une option du cherry-pick qui m’est inconnue !

      J'aime

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion /  Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion /  Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion /  Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion /  Changer )

w

Connexion à %s