159 votes

Comment créer une branche à partir d'un commit spécifique dans une branche différente ?

J'ai fait plusieurs commits dans la branche master et les ai ensuite fusionnés dans la branche dev.

Je veux créer une branche à partir d'un commit spécifique dans la branche dev, qui a été commis en premier dans la branche master.

J'ai utilisé les commandes :

git checkout dev
git branch  <branch name> <commit id>

Cependant, cela crée la branche à partir de la branche master, et non de la branche dev à laquelle je m'attendais. Le commit id est le même dans la branche master et la branche dev. Alors, comment puis-je distinguer le même identifiant de commit dans différentes branches ?

PS : j'ai fait un exemple dans github ici https://github.com/RolandXu/test_for_branch

J'ai utilisé les commandes :

git checkout dev
git branch test 07aeec983bfc17c25f0b0a7c1d47da8e35df7af8

Ce que j'attends, c'est que la branche de test contienne aa.txt bb.txt cc.txt. Cependant, la branche de test ne contient que aa.txt et cc.txt. Il est probable que la branche a été créée à partir de la branche master.

0 votes

Malheureusement, le dépôt git original sur github n'existe plus, ce qui rend cette question et les réponses qui y font référence moins utiles.

197voto

Gauthier Points 6684

Si vous utilisez cette forme de l branch (avec le point de départ), l'endroit où se situe votre HEAD est.

Ce que vous faites :

git checkout dev
git branch test 07aeec983bfc17c25f0b0a7c1d47da8e35df7af8
  • Tout d'abord, vous définissez votre HEAD à la branche dev ,

  • Ensuite, vous démarrez une nouvelle branche sur le commit 07aeec98 . Il n'y a pas de bb.txt à ce commit (selon votre repo github).

Si vous souhaitez créer une nouvelle branche à l'endroit que vous venez de quitter, vous pouvez soit exécuter une branche sans point de départ :

git branch test

ou, comme d'autres l'ont répondu, de se brancher et d'aller à la caisse en une seule opération :

git checkout -b test

Je pense que vous pourriez être confus par le fait que 07aeec98 fait partie de la branche dev . Il est vrai que ce commit est un ancêtre de dev ses modifications sont nécessaires pour atteindre le dernier commit dans le fichier dev . Cependant, il y a d'autres commits qui sont nécessaires pour atteindre le dernier dev et ceux-ci ne sont pas nécessairement dans l'histoire de l'Europe. 07aeec98 .

8480e8ae (où vous avez ajouté bb.txt) n'est par exemple pas dans l'historique de 07aeec98 . Si vous passez de 07aeec98 vous n'obtiendrez pas les modifications introduites par 8480e8ae .

En d'autres termes : si vous fusionnez la branche A et la branche B dans la branche C, puis créez une nouvelle branche sur un commit de A, vous n'obtiendrez pas les changements introduits dans B.

Même chose ici, vous aviez deux branches parallèles master et dev, que vous avez fusionnées dans dev. Se brancher à partir d'un commit de master (plus ancien que la fusion) ne vous fournira pas les changements de dev.


Si vous voulez en permanence Pour intégrer les nouvelles modifications de master dans vos branches de fonctionnalité, vous devez fusionner les modifications de master avec celles de vos branches de fonctionnalité. master en eux et continuez. Cela créera des commits de fusion dans vos branches de fonctionnalité, cependant.

Si vous n'avez pas publié vos branches de fonctionnalités, vous pouvez également les rebaser sur le master mis à jour : git rebase master featureA . Soyez prêt à résoudre d'éventuels conflits.

Si vous souhaitez un flux de travail qui vous permette de travailler sur des branches de fonctionnalités sans commits de fusion et de continuer à intégrer les modifications les plus récentes dans master, je vous recommande ce qui suit :

  • base chaque nouvelle branche de fonctionnalité sur un commit de master
  • créer un dev sur un commit de master
  • lorsque vous avez besoin de voir comment votre branche de fonctionnalité s'intègre aux nouveaux changements dans master, fusionnez master et la branche de fonctionnalité dans le fichier dev .

Ne vous engagez pas dans dev directement, ne l'utilisez que pour fusionner d'autres branches.

Par exemple, si vous travaillez sur les caractéristiques A et B :

a---b---c---d---e---f---g -master
    \       \
     \       \-x -featureB
      \
       \-j---k -featureA

Fusionner les branches dans un dev pour vérifier s'ils fonctionnent bien avec le nouveau master :

a---b---c---d---e---f---g -master
    \       \            \
     \       \            \--x'---k' -dev
      \       \             /    /   
       \       \-x----------    /    -featureB
        \                      /
         \-j---k--------------- -featureA

Vous pouvez continuer à travailler sur vos branches de fonctionnalité, et continuer à fusionner les nouvelles modifications des branches master et de fonctionnalité dans le système de gestion des modifications. dev régulièrement.

a---b---c---d---e---f---g---h---i----- -master
    \       \            \            \
     \       \            \--x'---k'---i'---l' -dev
      \       \             /    /         /
       \       \-x----------    /         /  -featureB
        \                      /         /  
         \-j---k-----------------l------ -featureA

Lorsque le moment est venu d'intégrer les nouvelles fonctionnalités, fusionnez les branches des fonctionnalités (pas les dev !) en maître.

0 votes

Merci. Vous répondez à ma question. Je me suis trompé dans la compréhension du mode de branchement de git. Et avez-vous une suggestion pour mon problème. J'ai la branche master qui a beaucoup de commits opportuns des autres (synchronisation avec perforce). J'ai une branche dev où je fais du travail personnel. Je veux une branche qui contient tous les commits de la branche master et de la branche dev, alors je peux facilement créer une branche basée sur cette branche, puis commencer un travail spécifique.

0 votes

Je n'ai pas pu répondre dans un commentaire, donc je mets à jour ma réponse avec les flux de travail suggérés.

0 votes

Merci pour cette réponse brillante et complète ! Juste par curiosité : En fin de compte, pourquoi devrait-on merge the feature branches (not dev!) into master ?

79voto

Jefromi Points 127932

Vous avez les arguments dans le mauvais ordre :

git branch <branch-name> <commit>

et pour cela, la branche qui est extraite n'a pas d'importance ; elle fera ce que vous dites. (Si vous omettez l'argument commit, il crée par défaut une branche au même endroit que la branche actuelle).

Si vous voulez vérifier la nouvelle branche au moment où vous la créez :

git checkout -b <branch> <commit>

avec le même comportement si vous omettez l'argument commit.

50voto

msoliman Points 732

Vous pouvez le faire localement comme tout le monde l'a mentionné en utilisant

git checkout -b <branch-name> <sha1-of-commit>

Alternativement, vous pouvez le faire dans github lui-même, suivez les étapes :

1- Dans le référentiel, cliquez sur l'onglet Commits .

2- sur le commit à partir duquel vous voulez vous brancher, cliquez sur <> pour parcourir le référentiel à ce moment de l'historique.

commits history

3- Cliquez sur le tree: xxxxxx en haut à gauche. Il suffit de taper un nouveau nom de branche et de cliquer sur Create branch xxx comme indiqué ci-dessous.

create new branch

Maintenant vous pouvez récupérer les changements de cette branche localement et continuer à partir de là.

0 votes

C'est ce dont j'avais besoin Comment le faire dans le site web

1 votes

Je ne le savais pas. C'est ça. L'interface graphique est tout simplement géniale et je voulais m'éloigner du CLI.

13voto

ZMorek Points 335

Essayez

git checkout <commit hash>
git checkout -b new_branch

Le commit ne doit exister qu'une seule fois dans votre arbre, et non dans deux branches distinctes.

Cela vous permet de vérifier ce commit spécifique et de le nommer comme vous le souhaitez.

0 votes

Bonjour, j'ai essayé le git log dev et le git log master, j'ai trouvé que le commit hash id est le même pour le commit que j'ai fusionné dans la branche dev depuis la branche master.

0 votes

Il pourrait être utile d'utiliser quelque chose comme gitk pour visualiser votre journal

0 votes

Je viens d'ajouter un exemple dans github. Et Gauthier a déjà répondu à ma question car j'ai mal compris le mode de branchement de git. Merci :)

11voto

manojlds Points 96599

Vous devez le faire :

git branch <branch_name> <commit>

(vous intervertissiez le nom de la branche et le commit)

Ou vous pouvez le faire :

git checkout -b <branch_name> <commit>

Si à la place vous utilisez le nom de la branche, vous obtenez une branche à partir de la pointe de la branche.

0 votes

Ce n'est pas ce que HEAD moyens. Vous pourriez dire "l'extrémité de la branche" ou "le commit vers lequel pointe la branche".

0 votes

@Jefromi - Pour être puriste, on peut dire la branche seulement, car la branche elle-même est un pointeur vers, eh bien, l'extrémité de la branche.

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