Question Comment fusionner mes modifications locales non validées dans une autre branche Git?


Comment puis-je faire cela dans git:

Ma branche actuelle est branch1 et j'ai fait quelques changements locaux. Cependant, je réalise maintenant que je voulais réellement appliquer ces changements à branch2. Existe-t-il un moyen d'appliquer / fusionner ces changements afin qu'ils deviennent des changements locaux sur branche2 sans les valider sur branche1?


546
2018-02-17 14:02


origine


Réponses:


Puisque vos fichiers ne sont pas encore validés dans branch1:

git stash
git checkout branch2
git stash pop

ou

git stash
git checkout branch2
git stash list       # to check the various stash made in different branch
git stash apply x    # to select the right one

Comme commenté par Benjohn (voir git stash page de manuel):

Pour également stocker les fichiers actuellement non suivis (nouvellement ajoutés), ajoutez l'argument -u, alors:

git stash -u

809
2018-02-17 14:16



Stashing, commits temporaires et rebasing peuvent tous être exagérés. Si vous n'avez pas encore ajouté les fichiers modifiés à l'index, vous pourrez peut-être simplement extraire l'autre branche.

git checkout branch2

Cela fonctionnera tant que les fichiers que vous éditez ne sont pas différents entre branche1 et branche2. Il vous laissera sur branche2 avec vous les changements de travail conservés. Si elles sont différentes, vous pouvez spécifier que vous souhaitez fusionner vos modifications locales avec les modifications introduites par le changement de branche avec -m option à la caisse.

git checkout -m branch2

Si vous avez ajouté des modifications à l'index, vous devez d'abord annuler ces modifications avec une réinitialisation. (Cela conservera votre copie de travail, il supprimera simplement les modifications par étapes.)

git reset

78
2018-02-17 19:53



Voici une alternative plus courte à l'approche de stockage mentionnée précédemment:

Déplacez temporairement les modifications dans une cachette.

git stash 

Créez et basculez vers une nouvelle branche, puis dépassez-la en une seule étape.

git stash branch new_branch_name

alors add et commit les changements à cette nouvelle branche.


9
2017-08-23 05:46



ATTENTION: Pas pour les débutants git.

Cela arrive assez dans mon flux de travail que j'ai presque essayé d'écrire une nouvelle commande git pour cela. L'habituel git stash le flux est le chemin à parcourir mais est un peu gênant. Je fais habituellement un nouveau commit en premier depuis si j'ai regardé les changements, toute l'information est fraîche dans mon esprit et il vaut mieux juste commencer git commit-ce que j'ai trouvé (généralement une correction de bogue appartenant à un maître que je découvre en travaillant sur une branche de fonctionnalité) tout de suite.

Il est également utile - si vous rencontrez des situations comme celle-ci beaucoup - d'avoir un autre répertoire de travail à côté de votre actuel qui a toujours le master branche vérifiée.

Alors, comment je réalise cela va comme ceci:

  1. git commit les changements tout de suite avec un bon message de validation.
  2. git reset HEAD~1 annuler la validation de la branche actuelle.
  3. (facultatif) continuez à travailler sur la fonction.

Parfois plus tard (de manière asynchrone), ou immédiatement dans une autre fenêtre de terminal:

  1. cd my-project-master qui est un autre WD partageant le même .git
  2. git reflog pour trouver le correctif que je viens de faire.
  3. git cherry-pick SHA1 du commit.

En option (toujours asynchrone), vous pouvez ensuite rebaser (ou fusionner) votre branche de fonctionnalité pour obtenir le correctif, généralement lorsque vous êtes sur le point de soumettre un PR et avez déjà nettoyé votre branche de fonctionnalité et votre WD:

  1. cd my-projectqui est le principal WD sur lequel je travaille.
  2. git rebase master pour obtenir les corrections de bugs.

De cette façon, je peux continuer à travailler sur la fonctionnalité ininterrompue et ne pas avoir à se soucier de git stash-de rien ou devoir nettoyer mon WD avant un git checkout (et puis en vérifiant à nouveau la fonctionnalité backout de branche.) Et toujours avoir toutes mes corrections de bugs va à master au lieu de caché dans ma branche de fonctionnalité.

OMI git stash et git checkout est un vrai PIA quand vous êtes en train de travailler sur une grande fonctionnalité.


7
2018-04-08 08:22



S'il s'agissait de changements validés, vous devriez jeter un oeil à git-rebase, mais comme le souligne le commentaire de VonC, puisque vous parlez de changements locaux, git-stash serait certainement le bon moyen de le faire.


2
2018-02-17 14:04



Les réponses données jusqu'à présent ne sont pas idéales car elles nécessitent beaucoup de travail inutile pour résoudre les conflits de fusion, ou font trop d'hypothèses souvent fausses. C'est comment le faire parfaitement. Le lien est sur mon propre site.

Comment s'engager dans une branche différente dans git

Vous avez des modifications non validées sur my_branch que vous voulez commettre master, sans engager tous les changements de my_branch.

Exemple

git merge master
git stash -u
git checkout master
git stash apply
git reset
git add example.js
git commit
git checkout .
git clean -f -d
git checkout my_branch
git merge master
git stash pop

Explication

Commencez par fusionner master dans votre branche, puisque vous devrez le faire de toute façon, et c'est le meilleur moment pour résoudre les conflits.

le -u option (aka --include-untracked) dans git stash -u vous empêche de perdre des fichiers non-suivis lorsque vous faites plus tard git clean -f -d dans master.

Après git checkout master il est important que vous NE fassiez PAS git stash pop, parce que vous aurez besoin de cette cachette plus tard. Si vous faites apparaître la cachette créée dans my_branch puis faites git stash dans master, vous provoquerez des conflits de fusion inutile lorsque vous appliquez plus tard cette cachette dans my_branch.

git reset désinstalle tout ce qui résulte de git stash apply. Par exemple, les fichiers qui ont été modifiés dans la mémoire mais qui n'existent pas dans master se mettre en scène en tant que "supprimé par nous" conflits.

git checkout . et git clean -f -d rejeter tout ce qui n'est pas commis: toutes les modifications apportées aux fichiers suivis, ainsi que tous les fichiers et répertoires non suivis. Ils sont déjà enregistrés dans la cachette et si laissé dans master provoquerait des conflits de fusion inutiles lors du retour à my_branch.

Le dernier git stash pop sera basé sur l'original my_branch, et ne provoquera donc aucun conflit de fusion. Cependant, si votre cachette contient des fichiers non-traités que vous vous êtes engagés à maîtriser, git se plaindra que "Impossible de restaurer les fichiers non-stockés de la cachette". Pour résoudre ce conflit, supprimez ces fichiers de votre arbre de travail, puis git stash pop, git add ., et git reset.


1
2017-08-15 06:41