web-dev-qa-db-fra.com

Git: Créer une branche à partir de modifications non mises en scène / non validées sur le maître

Contexte: je travaille sur le maître en ajoutant une fonctionnalité simple. Après quelques minutes, je réalise que ce n'était pas si simple et qu'il aurait mieux valu travailler dans une nouvelle branche.

Cela m’arrive toujours à moi et je ne sais pas comment passer à une autre branche et accepter tous ces changements non engagés avec moi, laissant la branche principale en état de propreté. Je supposais que git stash && git stash branch new_branch accomplirait simplement cela, mais voici ce que je reçois:

~/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 s'il existe un moyen d'accomplir cela?

917
knoopx

Pas besoin de cacher.

git checkout -b new_branch_name

ne touche pas vos changements locaux. Il crée simplement la branche à partir du HEAD actuel et définit le HEAD ici. Donc je suppose que c'est ce que vous voulez.

--- Modifier pour expliquer le résultat de la caisse principale ---

Êtes-vous confus parce que checkout master ne rejette pas vos modifications?

Comme les changements ne sont que locaux, git ne veut pas que vous les perdiez trop facilement. Lors du changement de branche, git ne remplace pas 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 changé le HEAD, mais n'a pas écrasé vos fichiers locaux. C'est pourquoi votre dernier statut indique toujours vos modifications locales, bien que vous soyez sur master.

Si vous voulez vraiment ignorer les modifications locales, vous devez forcer la commande avec -f.

git checkout master -f

Puisque vos modifications n'ont jamais été engagées, vous les perdriez.

Essayez de revenir dans votre branche, validez vos modifications, puis extrayez de nouveau le maître.

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

Vous devriez recevoir un message M après le premier paiement, mais plus après le checkout master, et git status ne devrait afficher aucun fichier modifié.

--- Edit pour dissiper toute confusion sur le répertoire de travail (fichiers locaux) ---

En réponse à votre premier commentaire, les changements locaux sont simplement… bien, locaux. Git ne les sauvegarde pas automatiquement, vous devez lui dire de les enregistrer pour plus tard. Si vous apportez des modifications et ne les engagez pas explicitement, git ne les versera pas. Si vous modifiez HEAD (checkout master), les modifications locales ne sont pas écrasées car non enregistrées.

1102
Gauthier

Essayer:

git stash
git checkout -b new-branch
git stash apply
57
Grant Limberg

Deux choses que vous pouvez faire:

git checkout -b sillyname
git commit -am "silly message"
git checkout - 

ou

git stash -u
git branch sillyname stash@{0}

(git checkout - <- le tiret est un raccourci pour la branche précédente sur laquelle vous étiez)

(git stash -u <- le -u signifie qu'il faut également des modifications non mises en scène.)

20
Pylinux

Si vous utilisez le client Windows GitHub (tel que je suis) et que vous êtes en train d'apporter des modifications non validées que vous souhaitez déplacer vers une nouvelle branche, vous pouvez simplement "créer une nouvelle branche" via le client GitHub. Il basculera vers la branche nouvellement créée et préservera vos modifications.

enter image description here

6
Tod Birdsall

Dans le dernier client GitHub pour Windows, si vous avez des modifications non validées et que vous choisissez de créer une nouvelle branche, cela vous indique comment gérer ce scénario précis:

enter image description here

Il en va de même si vous changez simplement de branche également.

0
Jerry Dodge