Bon, disons qu'un jour nous faisons arriver à faire un tas de modifications et quand nous allons les valider nous remarquons que nous travaillions sur la mauvaise branche.
Comment forcer git à changer de branche sans abandonner les changements locaux .
Je vais probablement m'y prendre de manière naïve en attendant une réponse, mais j'aimerais savoir s'il y a une procédure correcte car je mentirais si je disais que cela ne m'est pas arrivé auparavant ...
- Sauvegarde du dépôt modifié
git reset --hard
git checkout right-branch
- Restaurer les modifications
git commit -m "changes"
git
git-branch
mégawac
la source
la source
git stash
git-scm.com/book/en/Git-Tools-StashingRéponses:
Il existe de nombreuses façons différentes en fonction de votre progression et de la ou des branches sur lesquelles vous les souhaitez.
Prenons une erreur classique:
Alors maintenant, vous voulez que ces changements, auxquels vous ne vous êtes pas encore engagés
master
, soient appliquésdevelop
.Si vous ne disposez pas d' une
develop
encore, la méthode est triviale:Cela crée une nouvelle
develop
branche à partir de l'endroit où vous vous trouvez maintenant. Vous pouvez maintenant vous engager et les nouveautés sont activéesdevelop
.Vous avez un
develop
. Voyez si Git vous permettra de changer sans rien faire:Cela réussira ou se plaindra. Si ça réussit, tant mieux! Engagez-vous. Sinon (
error: Your local changes to the following files would be overwritten ...
), vous avez encore beaucoup d'options.Le plus simple est probablement
git stash
(comme l'ont dit tous les autres répondants qui m'ont battu en cliquant post). Exécutezgit stash save
ougit stash push
, 1 ou tout simplementgit stash
qui est l'abréviation desave
/push
:Cela valide votre code (oui, cela fait vraiment des commits) en utilisant une méthode étrange non-branch-y. Les commits qu'il fait ne sont "sur" aucune branche mais sont maintenant stockés en toute sécurité dans le référentiel, vous pouvez donc maintenant changer de branche, puis "appliquer" la cachette:
Si tout se passe bien et que vous aimez les résultats, vous devriez alors
git stash drop
le cacher. Cela supprime la référence aux commits étranges non-branch-y. (Ils sont toujours dans le référentiel et peuvent parfois être récupérés en cas d'urgence, mais dans la plupart des cas, vous devriez les considérer comme partis à ce stade.)L'
apply
étape effectue une fusion des modifications cachées, en utilisant la puissante machine de fusion sous-jacente de Git, le même genre de chose qu'elle utilise lorsque vous effectuez des fusions de branches. Cela signifie que vous pouvez obtenir des "conflits de fusion" si la branche sur laquelle vous travailliez par erreur est suffisamment différente de la branche sur laquelle vous vouliez travailler. C'est donc une bonne idée d' inspecter soigneusement les résultats avant de supposer que la réserve s'est appliquée proprement, même si Git lui-même n'a détecté aucun conflit de fusion.Beaucoup de gens utilisent
git stash pop
, ce qui est un raccourci pourgit stash apply && git stash drop
. C'est bien dans la mesure où cela se passe, mais cela signifie que si l'application entraîne un désordre et que vous décidez que vous ne voulez pas suivre cette voie, vous ne pouvez pas récupérer la réserve facilement. C'est pourquoi je recommande de séparerapply
, d'inspecter les résultats,drop
uniquement si / lorsqu'ils sont satisfaits. (Cela introduit bien sûr un autre point où vous pouvez prendre une autre pause-café et oublier ce que vous faisiez, revenir et faire la mauvaise chose, donc ce n'est pas un remède parfait.)1 Le
save
ingit stash save
est l'ancien verbe pour créer une nouvelle réserve. La version 2.13 de Git a introduit le nouveau verbe pour rendre les choses plus cohérentespop
et pour ajouter plus d'options à la commande de création. La version 2.16 de Git a formellement déprécié l'ancien verbe (bien qu'il fonctionne toujours dans Git 2.23, qui est la dernière version au moment où je modifie ceci).la source
git stash
pour que les commits - cargit stash
, vous obtenez deux commits par entrée de stash, dans un arrangement inhabituel - ne soient sur aucune branche. Sauf pour des cas spéciaux à très court terme, cependant, je préfère généralement faire un commit normal. Vous pouvezgit reset --soft
ougit reset --mixed
plus tard, ou utilisergit commit --amend
pour le mettre de côté, lorsque vous revenez à travailler sur cette branche. (Dans Git moderne, vous pouvez également utilisergit worktree add
, ce qui peut être une solution encore meilleure.)Utiliser git stash
Il pousse les modifications dans une pile. Lorsque vous voulez les retirer, utilisez
Vous pouvez même retirer des éléments individuels. Pour faire sauter complètement la réserve:
la source
git stash drop
;git stash clear
effacera toute la pile de cachettes, y compris les cachettes éventuellement sans rapport avec cet ensemble de commandes.git stash
pour enregistrer vos modifications non validéesgit stash list
pour répertorier vos cachettes non validées enregistréesgit stash apply stash@{x}
où x peut être 0,1,2..no de stashes que vous avez créésla source
Tu peux soit :
Utilisez
git stash
pour mettre vos modifications en attente ou,Créez une autre branche et validez vos modifications, puis fusionnez cette branche dans votre répertoire de travail
la source