Créer une branche Git avec les modifications actuelles

851

J'ai commencé à travailler sur mon maître la pensée branche que ma tâche serait facile. Après un certain temps, j'ai réalisé qu'il faudrait plus de travail et je veux faire tout ce travail dans une nouvelle branche.

Comment puis-je créer une nouvelle branche et emporter toutes ces modifications avec moi sans salir le maître ?

willcodejavaforfood
la source
4
Oui, ce sont des questions en double, mais le libellé est tellement différent que je pense qu'il est utile de le conserver. Notez les mots clés ici: branch current changesvs existing uncommited branch. Quiconque parle anglais verra immédiatement qu'ils sont les mêmes, mais les moteurs de recherche ne le feront probablement pas. Gardez cette question.
Scott Biggs

Réponses:

691

Si vous n'aviez pas encore fait de commit, seuls (1: branche) et (3: checkout) suffiraient.
Ou, en une seule commande:git checkout -b newBranch

Comme mentionné dans la git resetpage de manuel :

$ git branch topic/wip     # (1)
$ git reset --hard HEAD~3  # (2)  NOTE: use $git reset --soft HEAD~3 (explanation below)
$ git checkout topic/wip   # (3)
  1. Vous avez fait quelques commits, mais réalisez qu'ils étaient prématurés pour être dans la masterbranche " ". Vous souhaitez continuer à les peaufiner dans une branche de rubrique, donc créez une branche " topic/wip" à partir du courant HEAD.
  2. Rembobinez la masterbranche pour vous débarrasser de ces trois commits.
  3. Passez à la topic/wipbranche " " et continuez à travailler.

Remarque: en raison de l'effet "destructif" d'une git reset --hardcommande (elle réinitialise l'index et l'arborescence de travail. Toutes les modifications apportées aux fichiers suivis dans l'arborescence de travail <commit>sont supprimées), je préfère opter pour:

$ git reset --soft HEAD~3  # (2)

Cela garantirait que je ne perds aucun fichier privé (non ajouté à l'index).
L' --softoption ne touche pas du tout le fichier d'index ni l'arborescence de travail (mais réinitialise la tête <commit>, comme tous les modes le font).


Avec Git 2.23+ , la nouvelle commandegit switch créerait la branche sur une seule ligne (avec le même type de reset --hard, alors méfiez-vous de son effet):

git switch -f -c topic/wip HEAD~3
VonC
la source
6
Il est probablement également intéressant de noter que ce ne serait pas une bonne idée si vous avez engagé des éléments de sujet dans votre branche principale dans un référentiel à partir duquel d'autres personnes tirent. Ou du moins, si vous devez effectuer une réinitialisation, vous devrez dire aux gens que c'est ce que vous faites afin que les avertissements de leur prochaine traction ne soient pas trop choquants.
Andrew Walker
39
Note aux futurs lecteurs: lisez de bas en haut (ou assurez-vous de lire le tout). git reset --hardnuke vos modifications, et si elles ne sont pas encore engagées, elles sont irrécupérables! Vous pourriez avoir juste besoingit checkout -b …
Conrad Meyer
3
@ConradMeyer Bon point. J'ai édité la réponse et mis la git checkout -bpremière.
VonC
5
Pourquoi sujet / branche ?? pourquoi pas seulement le nom de la branche, y a-t-il une raison particulière à cette dénomination? je me demandais juste.
Sam Stoelinga
1
@C'est juste une convention de dénomination des espaces de noms (un moyen de classer facilement les branches, en utilisant des noms de branches hiérarchiques pour définir les espaces de noms): stackoverflow.com/a/2527436/6309 . Par exemple, pour les problèmes: randyfay.com/content/… . Vous n'avez pas besoin d'utiliser une hiérarchie lorsque vous nommez vos branches. topic_wipfonctionnerait aussi;)
VonC
269

Comme indiqué dans cette question: Git: créer une branche à partir de modifications non marquées / non validées sur le maître : la sauvegarde n'est pas nécessaire.

Utilisez simplement:

git checkout -b topic/newbranch

Tout travail non engagé sera emmené à la nouvelle succursale.

Si vous essayez de pousser, vous obtiendrez le message suivant

fatal: La fonction de branche actuelle / NEWBRANCH n'a pas de branche en amont. Pour pousser la branche actuelle et définir la télécommande en amont, utilisez

git push --set-upstream origin feature/feature/NEWBRANCH

Faites comme suggéré pour créer la branche à distance:

git push --set-upstream origin feature/feature/NEWBRANCH

EeKay
la source
3
Vous obtiendrez l'erreur «pas de branche en amont» uniquement si vous appuyez sur la nouvelle branche, pas lorsque vous validez le nouveau travail.
sam
2
@sam J'ai modifié la réponse en conséquence
Nick Kennedy
73

Suivez ces étapes:

  1. Créez une nouvelle branche:

    git branch newfeature
    
  2. Commander une nouvelle branche: (cela ne réinitialisera pas votre travail.)

    git checkout newfeature
    
  3. Maintenant, engagez votre travail sur cette nouvelle branche:

    git commit -s
    

L'utilisation des étapes ci-dessus gardera votre branche d'origine propre et vous n'aurez pas à faire de 'git reset --hard'.

AvadhP
la source
3
Que fait le «-s» à l'étape 3?
Scott Biggs
12
@ScottBiggs C'est inutile, mais une pratique que certaines personnes suivent. Il est l' abréviation de "--signoff" et ajoute votre nom d'utilisateur au commit pour que les futures personnes consultant les journaux sachent que vous avez toléré ce commit.
Frank Bryce
5
Belle réponse, mais pas nécessaire -sà l'étape 3.
Mohammed Ali
J'ai appris quelque chose de nouveau grâce au commentaire, merci @FrankBryce
Kasparov92
30

Comme vous n'avez encore effectué aucune validation, vous pouvez enregistrer toutes vos modifications dans la cachette, créer et basculer vers une nouvelle branche, puis réintégrer ces modifications dans votre arborescence de travail:

git stash  # save local modifications to new stash
git checkout -b topic/newbranch
git stash pop  # apply stash and remove it from the stash list
Éther
la source
9
ou comme VonC l'a souligné 'git checkout -b newbranch' et sautez la cachette
willcodejavaforfood
@will: Je pensais que la création d'une nouvelle branche remplacerait toutes les modifications non validées que vous aviez, mais si ce n'est pas le cas, oui, vous pouvez ignorer la cachette.
Ether
1
Je l'ai essayé et cela a bien fonctionné, git est très réfléchi et
n'écrasera
2
Je suppose que c'était une faute de frappe mais juste un avertissement qui git stash pushn'est pas une commande. Vous voudrez probablement utiliser git stashou git stash save. Si vous souhaitez inclure des fichiers non suivis dans la cachette, utilisez l' --include-untrackedoption. De même, si vous souhaitez inclure des fichiers non suivis et ignorés dans la cachette, utilisez --addplutôt l' option.
Six
si vous avez déjà créé la branche, cela est utile.
Sûrement
13

Pour ajouter de nouvelles modifications à une nouvelle branche et pousser vers la télécommande:

git branch branch/name
git checkout branch/name
git push origin branch/name

Souvent, j'oublie d'ajouter la partie d'origine pour pousser et devenir confus pourquoi je ne vois pas la nouvelle branche / commit dans bitbucket

Patrick Schaefer
la source