1107 votes

Git: Créer une branche à partir de unstaged/uncommited changements sur le maître

Contexte: je suis en train de travailler sur la maîtrise de l'ajout d'une simple fonctionnalité. Après quelques minutes, je me rends compte qu'il n'était pas si simple et qu'il aurait été préférable de travailler dans une nouvelle direction.

Cela arrive toujours à moi et je n'ai aucune idée de comment faire pour changer de branche à l'autre et de prendre toutes ces uncommited changements avec moi en laissant la branche master propre. - Je censé git stash && git stash branch new_branch serait tout simplement d'accomplir cela, mais c'est ce que j'obtiens:

~/test $ git status
# On branch master
nothing to commit (working directory clean)

~/test $ echo "hello!" > testing 

~/test $ git status
# On branch master
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   modified:   testing
#
no changes added to commit (use "git add" and/or "git commit -a")

~/test $ git stash
Saved working directory and index state WIP on master: 4402b8c testing
HEAD is now at 4402b8c testing

~/test $ git status
# On branch master
nothing to commit (working directory clean)

~/test $ git stash branch new_branch
Switched to a new branch 'new_branch'
# On branch new_branch
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   modified:   testing
#
no changes added to commit (use "git add" and/or "git commit -a")
Dropped refs/stash@{0} (db1b9a3391a82d86c9fdd26dab095ba9b820e35b)

~/test $ git s
# On branch new_branch
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   modified:   testing
#
no changes added to commit (use "git add" and/or "git commit -a")

~/test $ git checkout master
M   testing
Switched to branch 'master'

~/test $ git status
# On branch master
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   modified:   testing
#
no changes added to commit (use "git add" and/or "git commit -a")

Savez-vous si il existe un moyen pour accomplir cette?

1329voto

Gauthier Points 6684

Pas besoin de ranger.

git checkout -b new_branch_name

ne touchez pas vos changements locaux. Il crée la branche à partir de l'actuel à la TÊTE et met la TÊTE là. Donc je suppose que c'est ce que vous voulez.

--- Edit pour expliquer le résultat de checkout master ---

Êtes-vous confus parce qu' checkout master ne jetez pas vos modifications?

Depuis les changements ne sont que locales, git ne voulez pas vous faire perdre trop facilement. Sur le changement de direction, git permet de ne pas écraser vos modifications locales. Le résultat de votre checkout master est:

M   testing

, ce qui signifie que vos fichiers de travail ne sont pas propres. git a fait changer de TÊTE, mais ne pas écraser vos fichiers locaux. C'est pourquoi votre dernier statut de toujours afficher vos modifications locales, bien que vous soyez en master.

Si vraiment vous souhaitez annuler les modifications locales, vous devez vous forcer à passer à la caisse avec -f.

git checkout master -f

Depuis vos modifications n'ont jamais été commis, vous perdez.

Essayez de revenir à votre succursale, validez vos modifications, puis de la caisse du maître.

git checkout new_branch
git commit -a -m"edited"
git checkout master
git status

Vous devriez obtenir un M message après la première caisse, mais alors pas plus après l' checkout master, et git status ne doivent présenter ni les fichiers modifiés.

--- Edit à éliminer la confusion à propos de répertoire de travail (fichiers locaux)---

En réponse à votre premier commentaire, les modifications locales sont juste... eh bien, locale. Git ne les sauvegarde pas automatiquement, vous devez le dire à les enregistrer pour plus tard. Si vous apportez des modifications et de ne pas s'engager explicitement ou les ranger, git ne sera pas la version. Si vous changez de TÊTE (checkout master), les variations locales ne sont pas remplacés car non enregistré.

68voto

Grant Limberg Points 7931

Essayez:

git stash
git checkout -b new-branch
git stash apply

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