Git - Travailler sur une mauvaise branche - Comment copier les modifications dans une branche de sujet existante

333

J'ai travaillé sur un projet, mais malheureusement, j'ai oublié de passer à ma branche, et en tant que tel, j'ai travaillé sur master

Comment puis-je copier le travail (3 fichiers) que j'ai fait ici de master, dans ma branche (appelée, par exemple branch123 ) sans commettre sur master?

Alex
la source

Réponses:

540

On dirait que tout ce dont vous avez besoin est le suivant:

git stash
git checkout branch123
git stash apply

Ensuite, vous devriez être de retour sur votre propre branche sans toucher à la branche principale.

gnab
la source
6
ok - je l'ai exécuté, mais quand je reviens à master (git checkout master) et que j'exécute git status, les mêmes fichiers sont toujours "modifiés" - est-ce attendu?
Alex
5
Il se peut que vous n'ayez pas à ranger réellement si les différences entre votre branche actuelle (maître) et la branche de sujet (branche123) ne se trouvent dans aucun des fichiers que vous avez modifiés localement. Git vous permettra simplement de vérifier la branche du sujet dans ce cas.
Cascabel
3
@Alex: Oui, c'est prévu. Cela n'implique pas de commits. stashenregistre les modifications locales, puis stash applyles ramène.
Cascabel
6
comment puis-je "m'en débarrasser" de la branche principale ... pour laisser ça propre?
Alex
7
git reset --hard HEADet vous revenez au dernier commit que vous avez fait à votre branche principale.
gnab
46

La réponse acceptée est la plus complète, mais il existe un cas particulier où vous pouvez simplifier. Si les fichiers que vous avez modifiés dans le répertoire de travail sont identiques dans les deux masteret branch123vous pouvez simplement faire

git checkout branch123

Pas besoin de cacher quoi que ce soit, car le comportement par défaut de checkout NE PAS écraser les fichiers modifiés dans votre répertoire de travail, vous ne perdrez donc rien. (Cela a en fait été mentionné dans les commentaires d'abord par Cascabel)

Comme d'autres personnes l'ont mentionné dans les commentaires, s'il branch123n'existe pas encore, vous pouvez le faire

git checkout -b branch123

Basé sur ce que j'ai trouvé ici .

Russel Dirks
la source
3
Ou, si vous voulez créer une nouvelle branche,git checkout -b newbranch
Phil Mitchell
2
Cela fonctionne mieux pour moi que la cachette et c'est beaucoup plus facile. Merci!
Matthias
31
Non, cela ne fonctionne pas. Git vous montrera ce message: "validez vos modifications ou cachez-les avant de pouvoir changer de branche."
dsharew
1
@DegenSharew: Oui, vous avez raison dans certains cas, à savoir si les fichiers que vous avez modifiés dans le répertoire de travail ne sont pas identiques dans masteret branch123. Voir ma réponse modifiée.
Russel Dirks
1
Cela a très bien fonctionné pour moi. Je n'ai pas encore créé de branche, alors j'ai fait ceci: git checkout -b newbranchname. Mes changements se sont manifestés seuls dans cette branche.
dex3703
6

git stash est ce dont vous avez besoin.

une explication complète peut être trouvée dans Git-Tools-Stashing

Roee Gavirel
la source
0

Comme il est possible de créer une nouvelle branche mais pas possible d'extraire une branche existante tout en ayant extrait les fichiers, j'ai trouvé l'astuce suivante en utilisant une branche temporaire pour fonctionner:

Ce scénario fonctionne au moins avec le plugin VS 2015 Git mais fonctionnerait très probablement avec n'importe quel outil git.

  1. extraire et apporter des modifications aux fichiers dans master (ups !, mauvaise branche)
  2. créer une nouvelle branche "temp" (ou tout autre nom inutilisé que vous choisissez) à partir de master. Les fichiers extraits seront désormais extraits dans temp et non dans master.
  3. archiver les modifications de temp (le maître n'est pas modifié)
  4. Tout est maintenant archivé et il est possible d'extraire une branche existante. Découvrez la branche souhaitée (la branche avec laquelle je voulais apporter les modifications pour commencer) 3.5 Git Rebase
  5. fusionner temp à la branche recherchée. Maintenant, les modifications sont dans la bonne branche.
  6. supprimez la branche temporaire car elle n'est plus nécessaire

EDIT: J'ai découvert que vous devrez effectuer un rebase (git rebase --onto) de la branche temporaire avant d'effectuer la fusion. Sinon, les changements dans master seront inclus dans la fusion. Une étape supplémentaire 3.5 ci-dessus. En savoir plus sur le rebase ici: https://git-scm.com/book/en/v2/Git-Branching-Rebasing

Pasi
la source
Pourriez-vous élaborer davantage votre réponse en ajoutant un peu plus de description sur la solution que vous proposez?
abarisone
Merci pour vos commentaires. La solution est cependant assez simple et suit le même principe que la solution "stash" sauf qu'une branche temporaire est utilisée à la place de la stash. C'est plus pratique au moins pour les utilisateurs de Visual Studio car la cachette n'est pas prise en charge par le plugin GIT
Pasi