Question Git: Créer une branche à partir de changements non gérés / non validés sur le maître


Contexte: Je travaille sur le master en ajoutant une fonctionnalité simple. Après quelques minutes, je me rends compte que ce n'était pas si simple et qu'il aurait mieux valu travailler dans une nouvelle branche.

Cela m'arrive toujours et je n'ai aucune idée de la façon de passer à une autre branche et de prendre tous ces changements non-motivés en laissant la branche master propre. J'ai supposé git stash && git stash branch new_branch J'accomplirais simplement cela, mais voici ce que j'ai:

~/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?


789
2018-04-02 22:09


origine


Réponses:


Pas besoin de cacher.

git checkout -b new_branch_name

ne touche pas à vos changements locaux. Il crée simplement la branche à partir de la tête actuelle et place la tête là. Donc je suppose que c'est ce que tu veux.

--- Modifier pour expliquer le résultat du maître de caisse ---

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

Puisque les changements ne sont que locaux, git ne veut pas que vous les perdiez trop facilement. En changeant de branche, git n'écrase pas vos changements locaux. 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 montre encore vos changements locaux, même si vous êtes sur master.

Si vous voulez vraiment ignorer les changements locaux, vous devez forcer la vérification avec -f.

git checkout master -f

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

Essayez de revenir à votre branche, validez vos modifications, puis réexpédiez le 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 plus maintenant après le checkout master, et git status devrait montrer aucun fichier modifié.

--- Modifier pour effacer la confusion au sujet du répertoire de travail (fichiers locaux) ---

En réponse à votre premier commentaire, les changements locaux sont juste ... bien, locaux. Git ne les sauvegarde pas automatiquement, vous devez lui indiquer de les sauvegarder pour plus tard. Si vous apportez des modifications et que vous ne les validez pas explicitement, git ne les modifiera pas. Si vous changez HEAD (checkout master), les modifications locales ne sont pas remplacées depuis non enregistrées.


941
2018-04-02 22:25



Essayer:

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

50
2018-04-02 22:15



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 aussi des changements non-planifiés)


15
2018-01-13 21:38



Si vous utilisez le client Windows GitHub (comme je le suis) et que vous êtes en train d'effectuer 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 passera à la branche nouvellement créée et conservera vos modifications.

enter image description here


4
2017-09-13 13:35