COMMIT sélectionnez des modifications à une autre branche, puis reprendre le travail sur la branche actuelle?
-
28-09-2019 - |
Question
Cela se produit souvent dans mon flux de travail: Je travaille sur une fonctionnalité dans une branche séparée, et en faisant cela, je vais venir à travers de petites choses qui ont besoin de fixation, mais sont de plus haut dans la mise en page de cadre ou d'un site par exemple .
Je veux revenir à la principale développer branche et valider les modifications de fichiers sélectionnez là, puis revenir à une fonction branche et rebase pour que je puisse continuer là avec les tweaks sans rapport avec / corrections de bogues de la route.
J'utilise git stash
et git stash pop
de le faire, mais je reçois beaucoup de conflits d'un tas de fichiers que je modifed mais ne pas besoin d'être commis à la branche mère de toute façon.
Y at-il une autre façon d'éviter les conflits ou en quelque sorte sauver l'état actuel, et ne tirez sélectionner les changements d'arbre de travail à une autre branche pour commiting? (Un peu comme git-stash-cerise choisir; -))
La solution
- Valider les modifications que vous voulez dans
master
sur votre branche actuelle. - Stash vos modifications restantes
- Passez à la branche de
master
et l'utilisationgit cherry-pick
pour déplacer les changements surmaster
- Reculer à votre succursale de plumes et
rebase
(en option) - Unstash les modifications apportées aux fonctionnalités originales
Autres conseils
Je fais habituellement ce l'inverse. Je continue à travailler dans ma branche de fonction jusqu'à ce que je suis prêt à faire là-bas commettras. Dès que je suis, j'ajouter tous les changements qui appartiennent à la nouvelle engager pour la branche à l'index, mais pas ceux qui appartiennent au maître. git add -p
faire et.al ce vraiment facile. Une fois que tous les changements pertinents dans l'index, je livre à la branche. Tous les autres changements de sales restants appartiennent à maître et seront entraînés très bien une fois que je passe à ce que je puisse commettre là.
Essayez de revenir au master
branche en utilisant l'option --merge
. Il va essayer de faire une fusion à trois entre les deux branches. La documentation git a un bon exemple:
2. After working in the wrong branch, switching to the correct branch would be done using: $ git checkout mytopic However, your "wrong" branch and correct "mytopic" branch may differ in files that you have modified locally, in which case the above checkout would fail like this: $ git checkout mytopic error: You have local changes to 'frotz'; not switching branches. You can give the -m flag to the command, which would try a three-way merge: $ git checkout -m mytopic Auto-merging frotz After this three-way merge, the local modifications are not registered in your index file, so git diff would show you what changes you made since the tip of the new branch.
Sur MacOS, GitX il est très facile de faire le genre de commettre sélectif rafl décrit, de sorte que c'est un une bonne façon de l'aborder si c'est l'environnement que vous êtes.
Il est également possible / pratique pour valider les modifications de la branche-y et des changements de maître-y dans des livraisons séparées, puis utilisez git format-patch
pour exporter les commits de la branche sous forme de fichiers et git am
pour les tirer pour le maître.
Le danger ici est de savoir si les fichiers autour des changements sont trop différents, dans ce cas, il peut y avoir des conflits en tirant les commits pour le maître.
Qu'en est-il la création d'une branche temporaire?
Quelque chose comme:
- oh crap need to do somethning else now
- git checkout -b ResumeLater
- git add .
- git commit
- git checkout ImportantStuff
- ....
- git checkout ResumeLater