Contexte: je travaille sur 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 dû être préférable de travailler dans une nouvelle branche.
Cela m'arrive toujours et je n'ai aucune idée de comment passer à une autre branche et prendre toutes ces modifications non validées avec moi en laissant la branche principale propre. Je supposais git stash && git stash branch new_branch
simplement accomplir cela, mais voici 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 s'il existe un moyen d'y parvenir?
Réponses:
Pas besoin de planquer.
ne touche pas à vos changements locaux. Il crée simplement la branche à partir du HEAD actuel et y définit le HEAD. Donc je suppose que c'est ce que vous voulez.
--- Modifier pour expliquer le résultat du maître de caisse ---
Êtes-vous confus car
checkout master
ne rejette pas vos modifications?Comme les modifications ne sont que locales, git ne veut pas que vous les perdiez trop facilement. Lors d'un changement de branche, git n'écrase pas vos modifications locales. Le résultat de votre
checkout master
est:, 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 affiche toujours vos modifications locales, bien que vous soyez activé
master
.Si vous voulez vraiment ignorer les modifications locales, vous devez forcer le paiement avec
-f
.Étant donné que vos modifications n'ont jamais été validées, vous les perdriez.
Essayez de revenir dans votre branche, validez vos modifications, puis récupérez à nouveau le maître.
Vous devriez recevoir un
M
message après le premier paiement, mais plus maintenant après lecheckout master
, etgit status
ne montrer aucun fichier modifié.--- Modifier pour éliminer la confusion au sujet du répertoire de travail (fichiers locaux) ---
En réponse à votre premier commentaire, les changements locaux sont juste ... enfin, locaux. Git ne les enregistre pas automatiquement, vous devez lui dire de les enregistrer pour plus tard. Si vous apportez des modifications et ne les validez pas ou ne les cache pas explicitement, git ne les mettra pas à jour. Si vous modifiez HEAD (
checkout master
), les modifications locales ne sont pas écrasées car non enregistrées.la source
git checkout
«Met à jour les fichiers dans l'arborescence de travail pour correspondre à la version de l'index ou de l'arborescence spécifiée.». Cela suppose que vos modifications dans votre système de fichiers seront EFFECTUÉES par la suite. Sans aucune chance de les récupérer. Même si vous dites qu'ils ne le feront pas, cela laisse un très mauvais sentiment. Je ne fais pas confiance du tout à ça . Soit la documentation est vraiment mauvaise, soit le comportement par défaut de git est vraiment dangereux. Il ne faut pas se fier à une heuristique «automagique» pour détecter que dans ce cas, vous ne voulez pas perdre vos modifications.checkout
n'entre pas en conflit avec vos modifications locales, le paiement fonctionne et laisse les modifications locales seules. Je comprends bien le mauvais sentiment, la page de manuel devrait peut-être dire "Met à jour les fichiers non modifiés dans l'arborescence de travail". Git ne permet pas en revanche de perdre trop facilement les modifications locales.git checkout
soit laisse vos changements locaux seuls, soit refuse en cas de conflit.git checkout <other_branch> -f
. Vous perdrez vos modifications locales sans avertissement.Essayer:
la source
Vous pouvez faire deux choses:
ou
(
git checkout -
<- le tiret est un raccourci pour la branche précédente sur laquelle vous étiez)(
git stash -u
<--u
signifie qu'il faut également des modifications non mises en scène)la source
Si vous utilisez le client GitHub Windows (comme je le suis) et que vous êtes dans la situation d'avoir apporté 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 conservera vos modifications.
la source
Si vous souhaitez que vos modifications non validées actuelles sur la branche actuelle soient déplacées vers une nouvelle branche, utilisez la commande suivante pour créer une nouvelle branche et copiez automatiquement les modifications non validées.
Cela créera une nouvelle branche à partir de votre branche actuelle (en supposant qu'elle soit maître), copiera les modifications non validées et basculera vers la nouvelle branche.
Validez vos modifications dans la nouvelle branche.
Depuis, une nouvelle branche est créée, avant de la pousser à distance, vous devez définir l'amont. Utilisez la commande ci-dessous pour définir l'amont et le pousser à distance.
Une fois que vous appuyez sur cette commande, une nouvelle branche sera créée sur la télécommande et votre nouvelle branche locale sera poussée sur la télécommande.
Maintenant, si vous souhaitez supprimer vos modifications non validées de la branche principale, utilisez:
Cela supprimera toutes les modifications locales non validées lors du paiement.
la source
Dans le dernier client GitHub pour Windows , si vous avez des modifications non validées et choisissez de créer une nouvelle branche.
Il vous demande comment gérer ce scénario exact:
La même chose s'applique si vous changez simplement de branche aussi.
la source