web-dev-qa-db-fra.com

Déplacer les travaux existants et non validés vers une nouvelle succursale dans Git

J'ai commencé à travailler sur une nouvelle fonctionnalité et après avoir codé pendant un moment, j'ai décidé que cette fonctionnalité devrait se trouver sur sa propre branche.

Comment déplacer les modifications non validées existantes vers une nouvelle branche et réinitialiser ma modification actuelle?

Je souhaite réinitialiser ma branche actuelle tout en préservant le travail existant sur la nouvelle fonctionnalité.

2902
Dane O'Connor

Utilisez le suivant:

git checkout -b <new-branch>

Cela laissera votre branche actuelle telle quelle, créera et enregistrera une nouvelle branche et conservera toutes vos modifications. Vous pouvez ensuite faire un commit avec:

git add <files>

et engagez-vous dans votre nouvelle succursale avec:

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

Les modifications apportées au répertoire de travail et les modifications effectuées dans l'index n'appartiennent pas encore à une branche. Cela change où ces changements finiraient.

Vous n'avez pas réinitialiser votre branche d'origine, elle reste telle quelle. Le dernier commit sur <old-branch> sera toujours le même. Par conséquent, vous checkout -b puis vous validez.

3404
knittl

Alternativement:

  1. Enregistrer les modifications actuelles dans une réserve temporaire:

    $ git stash

  2. Créez une nouvelle branche basée sur cette réserve et passez à la nouvelle branche:

    $ git stash branch <new-branch> stash@{0}

Astuce: utilisez la touche de tabulation pour réduire la saisie du nom de stash.

305
Robin Qiu

Si vous avez effectué des commits sur votre branche principale pendant le codage, vous souhaitez maintenant les déplacer vers une autre branche:

  1. Copiez votre historique actuel sur une nouvelle branche, en apportant également les modifications non validées:

    git checkout -b <new-feature-branch>
    
  2. Forcez maintenant la branche "désordonnée" d'origine à revenir en arrière: (sans basculer vers elle)

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

    Par exemple:

    git branch -f master Origin/master
    

    ou si vous aviez fait 4 commits:

    git branch -f master HEAD~4
    

Avertissement: Il semble que git branch -f master Origin/master va réinitialiser le informations de suivi pour cette branche. Ainsi, si vous avez configuré votre branche master sur Push vers un autre emplacement que Origin/master, cette configuration sera perdue.

Une alternative consiste à utiliser cette technique de réinitialisation . Mais ces instructions annulent toutes les modifications non validées que vous avez. Si vous voulez les garder, rangez-les d'abord et décompressez-les à la fin.

43
joeytwiddle

Le scénario courant est le suivant: j'ai oublié de créer la nouvelle branche pour la nouvelle fonctionnalité et effectuais tout le travail dans l'ancienne branche. J'ai confié tous les "anciens" travaux à la branche maître et je souhaite que ma nouvelle branche passe du "maître". Je n'ai pas commis un seul engagement de mon nouveau travail. Voici la structure de la branche: "master" -> "Old_feature"

git stash 
git checkout master
git checkout -b "New_branch"
git stash apply
21
Alex Burov

Si vous le commettez, vous pouvez également sélectionner l’identifiant de validation unique. Je le fais souvent lorsque je commence à travailler en master, puis que je veux créer une branche locale avant de passer à mon origine /.

git cherry-pick <commitID>

Il y a beaucoup de choses que vous pouvez faire avec cherry-pick, comme décrit ici , mais cela pourrait être un cas d'utilisation pour vous.

17
password

J'ai utilisé @ Robin répondre et répertorier tout ce que j'ai fait,

git status                               <-- review/list uncommitted changes
git stash                                <-- stash uncommitted changes
git stash branch <new-branch> stash@{1}  <-- create a branch from stash
git add .                                <-- add local changes
git status                               <-- review the status; ready to commit
git commit -m "local changes ..."        <-- commit the changes
git branch --list                        <-- see list of branches incl the one created above
git status                               <-- nothing to commit, working tree (new-branch) is clean
git checkout <old-branch>                <-- switch back

! Si le référentiel a plus d'une réserve, voyez laquelle appliquer à la nouvelle branche:

git stash list  
  stash@{0}: WIP on ...  
  stash@{1}: WIP on ...

et inspectez la cachette individuelle par,

git stash show stash@{1}

Ou inspectez toutes les caches à la fois:

git stash list -p
0
NBhat

Il existe en fait un moyen très facile de faire cela avec GitHub Desktop maintenant que je ne pensais pas que c'était une fonctionnalité auparavant.

Tout ce que vous avez à faire est de basculer vers la nouvelle branche dans GitHub Desktop. Il vous invitera à laisser vos modifications dans la branche actuelle (qui sera stockée) ou à les apporter avec vous dans la nouvelle branche. Il suffit de choisir la deuxième option pour apporter les modifications à la nouvelle branche. Vous pouvez ensuite vous engager comme d'habitude.

GitHub Desktop

0
Kristofer Doman