web-dev-qa-db-fra.com

déplacer les fichiers modifiés dans une autre branche pour l'enregistrement

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?

367
mainsocial

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
636
Bill Door

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:

  1. Tapez git log et rappelez-vous le SHA du commit que vous souhaitez déplacer.
  2. Vérifiez la branche vers laquelle vous voulez déplacer le commit.
  3. Tapez git cherry-pick SHA en remplaçant le SHA par le haut.
  4. Revenez à votre branche d'origine.
  5. Utilisez 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.

226
Amber

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.

34
mr_mmmmore

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

12
watashiSHUN

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.

  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 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.

2
JSON C11