déplacement des fichiers modifiés vers une autre branche pour l'enregistrement

422

Cela m'arrive souvent: j'écris du code, vais vérifier mes modifications, puis je me rends compte que je ne suis pas dans la bonne branche pour vérifier ces modifications. Cependant, je ne peux pas passer à une autre branche sans que mes modifications soient annulées. Existe-t-il un moyen de déplacer les modifications vers une autre branche pour y être archivé?

mainsocial
la source

Réponses:

751

git stash est votre ami.

Si vous n'avez pas encore validé, exécutez simplement git stash. Cela permettra d'économiser toutes vos modifications.

Basculez vers la branche sur laquelle vous souhaitez que les modifications soient activées et exécutées git stash pop.

Il existe de nombreuses 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
Bill Door
la source
122
Pas besoin de cacher des changements non engagés, ils vous accompagnent lorsque vous consultez une succursale. Stash est plus pour le stockage à long terme de choses temporaires (choses que vous voulez terminer et valider plus tard, mais vous devez faire autre chose maintenant).
Tekkub
2
J'ai compris. Je dois donc me cacher, changer de branche et ensuite pop C:\kf [develop +0 ~4 -0]> git checkout feature/customers<br/> error: Your local changes to the following files would be overwritten by checkout:<br/> AspWebApp.vNext/global.asa<br/> RestApi/Web.config<br/> Please, commit your changes or stash them before you can switch branches.<br/> Aborting
IsmailS
3
@Tekkub "stockage à plus long terme de choses temporaires" qui dit se sentir très gênant, un autre point à utiliser est caché, il le pousse dans une pile, donc si vous ne voulez pas qu'il continue et travaille sur autre chose, il est utile de cette façon . Oui, vous n'avez pas à le faire, mais vous vous sentez plus propre et plus en contrôle.
Atherion
bravo bébé! devrait ajouter ce que vous devriez faire si vous avez fait les commits
Ishan Srivastava
2
@Tekkub Cela n'est vrai que si la branche vers laquelle vous passez est à jour avec la branche sur laquelle vous vous trouvez. Si, par exemple, vous travaillez accidentellement sur une branche prod et que vous devez passer à la branche stage, mais que la scène a changé dans le temps, la cachette est le seul moyen de faire le changement.
danielson317
248

Si vous n'avez pas encore validé vos modifications , utilisez simplement git checkoutpour passer à la nouvelle branche, puis validez-les normalement - les modifications apportées aux fichiers ne sont pas liées à une branche particulière jusqu'à ce que vous les validiez.

Si vous avez déjà validé vos modifications:

  1. Tapez git loget souvenez-vous du SHA du commit que vous souhaitez déplacer.
  2. Vérifiez la branche vers laquelle vous souhaitez déplacer le commit.
  3. Tapez en git cherry-pick SHAremplaçant le SHA par le haut.
  4. Revenez à votre branche d'origine.
  5. Utilisez git reset HEAD~1pour réinitialiser avant votre commit de mauvaise branche.

cherry-pick prend un commit donné et l'applique à la tête actuellement extraite, vous permettant ainsi de copier le commit sur une nouvelle branche.

ambre
la source
9
Vous ne devriez même pas avoir besoin de choisir ici. git reset HEAD~N --softpuis git checkout -bde déplacer tout le code désormais non engagé vers une nouvelle branche.
Aaron
19
les modifications apportées aux fichiers ne sont pas liées à une branche particulière tant que vous ne les avez pas validées. <- ça. Cela a résolu un mystère pour moi. Merci.
Tschallacka
8
J'obtiens l'erreur suivante lorsque j'essaie de changer de branche: "les modifications locales apportées aux fichiers suivants seraient écrasées lors du paiement". Donc, il ne semble pas que je puisse passer à une autre branche et m'engager normalement.
Mischa
3
@Mischa, cela ne fonctionne pas si vous basculez entre deux branches qui ont des histoires différentes
watashiSHUN
1
@Aaron c'est beaucoup plus sympa (pour le scénario post-commit)! Veuillez répondre séparément.
Jacktose
16

Malheureusement, cela m'arrive aussi régulièrement et j'utilise git stashsi j'ai réalisé mon erreur avant git commitet utilise git cherry-pickautrement, les deux commandes sont assez bien expliquées dans d'autres réponses

Je veux ajouter une clarification pour git checkout targetBranch: cette commande ne conservera votre répertoire de travail et un instantané intermédiaire que 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 newBranchun nouveau pointeur est créé et il pointe vers le même commit exact que votre branche actuelle.
En fait, s'il vous arrivait d'avoir une autre branche qui partage l'historique avec votre branche actuelle (les deux pointent au même commit), vous pouvez "déplacer vos modifications" engit checkout targetBranch

Cependant, généralement des branches différentes signifient un historique différent, et Git ne vous permettra pas de basculer entre ces branches avec un répertoire de travail ou une zone de transfert sale. dans ce cas, vous pouvez soit faire git checkout -f targetBranch(nettoyer et modifier les modifications) ou git stage+ git checkout targetBranch(nettoyer et enregistrer les modifications), simplement exécuter git checkout targetBranchdonnera une erreur:

erreur: Vos modifications locales dans les fichiers suivants seraient écrasées par la caisse: ... Veuillez valider vos modifications ou les cacher avant de changer de branche. Abandon

watashiSHUN
la source
5

Une réinitialisation logicielle réinitialisera les modifications validées dans votre index. Ensuite, vérifiez la branche sur laquelle vous aviez l'intention de vous engager. Ensuite, git commit avec un nouveau message de commit.

  1. git reset --soft <commit>

  2. git checkout <branch>

  3. git commit -m "Commit message goes here"

De git docs :

git reset [<mode>] [<commit>]Ce formulaire réinitialise la tête de branche actuelle et éventuellement met à jour l'index (en le réinitialisant dans l'arborescence de) et l'arborescence de travail en fonction. Si est omis, la valeur par défaut est --mixed. Le doit être l'un des suivants:

--softNe touche pas du tout le fichier d'index ou l'arborescence de travail (mais réinitialise la tête, comme tous les modes le font). Cela laisse tous vos fichiers modifiés "Modifications à valider", comme le dirait git status.

JSON C11
la source