Cela m’arrive souvent: j’écris du code, j’enregistre mes modifications, puis j’aperçois que je ne suis pas dans la branche appropriée pour archiver ces modifications. Cependant, je ne peux pas changer de branche sans que mes modifications soient inversées. Existe-t-il un moyen de transférer les modifications dans une autre branche pour y être archivées?
git stash
est votre ami.
Si vous n'avez pas encore fait la validation, lancez simplement git stash
. Cela évitera toutes vos modifications.
Basculez sur la branche sur laquelle vous souhaitez effectuer les modifications et exécutez git stash pop
.
Il y a beaucoup d'utilisations pour Git Stash. C'est certainement l'une des raisons les plus utiles.
Un exemple:
# work on some code
git stash
git checkout correct-branch
git stash pop
Si vous n'avez pas encore validé vos modifications , utilisez simplement git checkout
pour passer à la nouvelle branche, puis validez-les normalement - modifications des fichiers ne sont pas liés à une branche particulière tant que vous ne les avez pas validés.
Si vous avez déjà validé vos modifications:
git log
et rappelez-vous le SHA du commit que vous souhaitez déplacer.git cherry-pick SHA
en remplaçant le SHA par le haut.git reset HEAD~1
pour réinitialiser avant la validation de votre branche erronée.cherry-pick
prend un commit et l'applique à la tête extraite, ce qui vous permet de copier le commit dans une nouvelle branche.
Si vous souhaitez déplacer les modifications vers une nouvelle branche , vous ne pouvez le faire qu'avec deux commandes:
git stash
git stash branch new-branch
Selon le documentation git stash :
branche
<branchname> [<stash>]
Crée et extrait une nouvelle branche nommée
<branchname>
à partir de la validation à laquelle le<stash>
a été créé à l'origine, applique les modifications enregistrées au nouvel arbre et index de travail.
Malheureusement, cela m’arrive aussi assez régulièrement et j’utilise git stash
si j’ai réalisé mon erreur avant git commit
et j’utilise git cherry-pick
sinon, les deux commandes sont expliquées assez bien dans d’autres réponses.
Je souhaite ajouter une clarification pour git checkout targetBranch
: cette commande préservera uniquement votre répertoire de travail et l'instantané mis en scène si targetBranch a le même historique que votre branche actuelle
Si vous n'avez pas encore validé vos modifications, utilisez simplement git checkout pour passer à la nouvelle branche , puis validez-les normalement.
La déclaration de @ Amber n'est pas fausse. Lorsque vous passez à newBranch, git checkout -b newBranch
, un nouveau pointeur est créé et il pointe exactement sur le même commit que votre branche actuelle.
En fait, si vous aviez une autre branche qui partage l’historique de votre branche actuelle (les deux pointent sur le même commit), vous pouvez "déplacer vos modifications" de git checkout targetBranch
Cependant, différentes branches signifient généralement un historique différent, et Git ne vous autorisera pas à basculer entre ces branches avec un répertoire de travail ou une zone de transfert en mauvais état. dans ce cas, vous pouvez soit faire git checkout -f targetBranch
(modifications nettes et jetables) ou git stage
+ git checkout targetBranch
(nettoyer et enregistrer modifications), en exécutant simplement git checkout targetBranch
va donner une erreur:
erreur: vos modifications locales dans les fichiers suivants seraient écrasées par la vérification: ... Veuillez valider vos modifications ou les stocker avant de changer de branche. Avorter
Une réinitialisation logicielle remettra les modifications validées dans votre index. Ensuite, vérifiez la branche sur laquelle vous aviez l'intention de vous engager. Puis git commit avec un nouveau message de validation.
git reset --soft <commit>
git checkout <branch>
git commit -m "Commit message goes here"
De git docs :
git reset [<mode>] [<commit>]
Ce formulaire réinitialise la tête de la branche actuelle et éventuellement met à jour l'index (en le réinitialisant dans l'arborescence de) et l'arborescence de travail en fonction de. Si omis, la valeur par défaut est --mixed. Le doit être l’un des suivants:
--soft
Ne touche pas du tout le fichier d'index ou l'arborescence de travail (mais réinitialise la tête à, comme le font tous les modes). Cela laisse tous vos fichiers modifiés "Les modifications à valider", comme le dirait le statut de git.