Prendre toutes mes modifications sur la branche actuelle et les déplacer vers une nouvelle branche dans Git

105

J'ai commencé à travailler sur ce que je pensais être une correction de bogue mineur sur ma branche principale. Cependant, il est devenu incontrôlable au point que j'aurais aimé créer une branche distincte pour faire le développement en premier lieu.

Alors maintenant, ce que j'aimerais faire, c'est:

  1. Créez une nouvelle branche appelée (par exemple) "edge"
  2. Déplacez tous les fichiers modifiés / non suivis sur le maître vers le bord (de sorte que le maître reste inchangé par rapport au moment où j'ai commencé la correction de bogue)
  3. Terminer mon travail sur le bord, fusionner de nouveau dans le maître

Comment puis-je faire ceci?

Tom Lehman
la source

Réponses:

103

Si vous n'avez encore rien commis, vous êtes déjà dans la bonne position.

  1. Créez une nouvelle branche: git checkout -b edge
  2. Vos fichiers n'ont pas changé. Juste git addce qu'il faut et s'engager comme d'habitude.
  3. Lorsque vous avez terminé de vous engager edge, revenez à masteravec git checkoutet git merge edge.
JB.
la source
Je n'avais encore rien commis, donc cette première ligne était un spectacle bienvenu ... ouf, c'était en fait assez indolore :-)
Drenai
87

Pour ajouter à la réponse de JB, si vous avez déjà commencé à faire quelques commits sur master pour ce qui s'est avéré être un effort "de pointe", vous pouvez:

git stash
git checkout -b edge master
git branch -f master SHA1_before_your_commits
git stash apply
VonC
la source
le wrapper stash n'est pas strictement nécessaire, mais juste pour les changements de travail non validés, n'est-ce pas?
HaveAGuess
4
@HaveAGuess right. Par "prendre toutes mes modifications", j'ai également inclus les modifications actuelles non encore ajoutées. D'où la cachette.
VonC
Les deuxième et troisième lignes n'ont-elles pas pu être réduites en "git checkout -b edge master"?
Paul Lynch
@PaulLynch compte tenu de ces commits (sur masterqui devrait être sur) edge sont sur master, oui. J'ai édité la réponse.
VonC
Je ne vois pas en quoi git stashest utile ici, car l'utilisation git checkout -bne modifie pas du tout l'arbre de travail ...
user1686
13

Si vous essayez de déplacer le travail de master vers une branche qui existe déjà, mais qui se trouve derrière master, git ne vous laissera pas passer à l'autre branche. Dans ce cas, procédez comme suit:

git stash
git checkout oldBranch
git merge master
git checkout master
git stash apply
git checkout oldBranch
Jesse P
la source