Déplacer les travaux existants et non engagés dans une nouvelle branche de Git

j'ai commencé à travailler sur une nouvelle fonctionnalité et après codage, pour un peu, j'ai décidé cette fonctionnalité devrait être sur sa propre branche.

Comment puis-je déplacer les changements non engagés existants dans une nouvelle branche et réinitialiser ma branche actuelle?

je veux réinitialiser ma branche actuelle tout en préservant les travaux existants sur la nouvelle fonctionnalité.

2573
demandé sur Cœur 2009-09-08 19:57:05
la source

5 ответов

utiliser ce qui suit:

git checkout -b <new-branch>

cela laissera votre branche actuelle telle quelle, créera et vérifiera une nouvelle branche et conservera toutes vos modifications. Vous pouvez alors vous engager avec:

git add <files>

et engagez - vous dans votre nouvelle branche avec:

git commit -m "<Brief description of this commit>"

les changements dans le répertoire de travail et les changements échelonnés dans index n'appartiennent pas encore à une branche. Cela change là où ces changements se termineraient.

Vous n'avez pas reset l'original de votre branche, il reste comme il est. Le dernier engagement sur <old-branch> sera toujours le même. Par conséquent, vous checkout -b et puis commettre.

3030
répondu knittl 2017-03-27 14:42:20
la source

alternativement:

  1. Enregistrer les modifications en cours pour un temp stash:

    $ git stash

  2. créer une nouvelle branche basée sur cette cachette, et passer à la nouvelle branche:

    $ git stash branch <new-branch> [email protected]{0}

CONSEIL: Utilisez la touche tab pour réduire la saisie du nom de la cachette.

262
répondu Robin Qiu 2017-03-16 01:50:34
la source

si vous avez fait commits sur votre branche principale pendant que vous codez, mais vous voulez maintenant déplacer ces commits à une autre branche:

  1. Copiez votre historique actuel sur une nouvelle branche, apportant avec vous tout changement non engagé aussi:

    git checkout -b <new-feature-branch>
    
  2. maintenant forcer la branche "messy" originale à reculer: (sans passer à elle)

    git branch -f <previous-branch> <earlier-commit-id>
    

    par exemple:

    git branch -f master origin/master
    

    ou si vous aviez fait 4 s'engage:

    git branch -f master HEAD~4
    

attention: il apparaît que git branch -f master origin/master va Réinitialiser les informations de suivi pour cette branche. Donc, si vous avez configuré votre branche master pour pousser vers un autre endroit que origin/master , cette configuration sera perdue.

une alternative est d'utiliser cette technique de réinitialisation . Mais ces instructions élimineront tous les changements non engagés que vous avez. Si vous voulez garder ces, ranger premier et unstash à la fin.

37
répondu joeytwiddle 2018-03-14 07:05:16
la source

si vous le commettez, vous pouvez aussi choisir l'ID de commit unique. Je le fais souvent quand je commence à travailler dans master, et puis je veux créer une branche locale avant de pousser jusqu'à mon origine/.

git cherry-pick <commitID>

il y a beaucoup de choses que vous pouvez faire avec le pic à cerise, comme décrit ici , mais cela pourrait être un cas d'utilisation pour vous.

16
répondu password 2015-11-30 23:58:06
la source

le scénario courant est le suivant: j'ai oublié de créer la nouvelle branche pour la nouvelle fonctionnalité, et je faisais tout le travail dans l'ancienne branche. J'ai consacré tout le "vieux" travail à la branche principale, et je veux que ma nouvelle branche se développe à partir du "maître". Je n'ai pas fait un seul engagement de mon nouveau travail. Voici la structure de branche: "maître"->"Old_feature"

git stash 
git checkout master
git checkout -b "New_branch"
git stash apply
1
répondu Alex Burov 2018-08-13 19:07:54
la source

Autres questions sur git git-reset git-stash git-branch