Comment puis-je faire ce qui suit dans Git?
Ma branche actuelle est branch1 et j'ai apporté quelques modifications locales. Cependant, je me rends compte maintenant que je voulais réellement appliquer ces modifications à branch2. Existe-t-il un moyen d'appliquer / fusionner ces modifications afin qu'elles deviennent des modifications locales sur branch2 sans les valider sur branch1?
Réponses:
Étant donné que vos fichiers ne sont pas encore validés dans
branch1
:ou
Comme commenté par benjohn (voir
git stash
page man ):la source
-u
, donc:git stash -u
.Le stashing, les validations temporaires et le rebasage 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.
Cela fonctionnera tant qu'aucun fichier que vous modifiez n'est différent entre branch1 et branch2. Il vous laissera sur branch2 avec vos modifications de travail préservées. S'ils sont différents, vous pouvez spécifier que vous souhaitez fusionner vos modifications locales avec les modifications introduites en changeant de branche avec l'
-m
option de retrait.Si vous avez ajouté des modifications à l'index, vous voudrez d'abord annuler ces modifications avec une réinitialisation. (Cela préservera votre copie de travail, il supprimera simplement les modifications par étapes.)
la source
checkout -m
n'est pas "sûr" dans certaines situations (peut-être que cela provoquerait un conflit de fusion), la cachette fournirait-elle un avantage (par exemple, pouvez-vous annuler le pop d'une cachette)?.orig
?Une alternative plus courte à l'approche cachée précédemment mentionnée serait:
git stash
git stash branch new_branch_name
Alors juste
add
etcommit
les changements à cette nouvelle branche.la source
AVERTISSEMENT: pas pour les débutants git.
Cela revient suffisamment dans mon flux de travail que j'ai presque essayé d'écrire une nouvelle commande git pour cela. Le
git stash
flux habituel est le chemin à parcourir mais est un peu gênant. Je fais généralement un nouveau commit d'abord car si j'ai regardé les changements, toutes les informations sont fraîches dans mon esprit et il vaut mieux commencer justegit commit
ce que j'ai trouvé (généralement un correctif appartenant au maître que je découvre en travaillant sur un branche caractéristique) tout de suite.Alors, comment j'y parviens va comme ceci:
git commit
les changements tout de suite avec un bon message de validation.git reset HEAD~1
pour annuler la validation de la branche actuelle.Parfois plus tard (de manière asynchrone), ou immédiatement dans une autre fenêtre de terminal:
cd my-project-master
qui est un autre WD partageant le même.git
git reflog
pour trouver le correctif que je viens de faire.git cherry-pick SHA1
du commit.En option (toujours asynchrone), vous pouvez ensuite rebaser (ou fusionner) votre branche de fonctionnalités pour obtenir le correctif, généralement lorsque vous êtes sur le point de soumettre un PR et que vous avez déjà nettoyé votre branche de fonctionnalités et WD:
cd my-project
qui est le principal WD sur lequel je travaille.git rebase master
pour obtenir les corrections de bugs.De cette façon , je peux continuer à travailler sur la fonction ininterrompue et ne pas avoir à vous soucier de
git stash
-ment quoi que ce soit ou d' avoir à nettoyer mon WD devant ungit checkout
(et ayant le contrôle backout branche de fonction à nouveau.) Et ont encore toutes mes corrections de bugs va aumaster
lieu de caché dans ma branche de fonctionnalité.IMO
git stash
etgit checkout
est un véritable PIA lorsque vous êtes en train de travailler sur une grande fonctionnalité.la source
my-project-master
partage le même.git
donne l'impression qu'il en a l'air. Pourquoi ne pasgit checkout -b bugfixABC; git commit -a; git reset HEAD^ --hard
, puis plus tard ( de façon asynchrone) pendantmaster
,git cherry-pick <SHA1 of the commit(s) in bugfixABC
? (ou même, pour éviter d'avoir à découvrir le SHA1,git rebase --onto master feature bugfixABC
d'où que vous soyez actuellement. Ce qui signifie que vous pouvez le faire directement après ce quigit reset
précède, pendant que vous êtes en lignefeature
.)checkout -m
c'est mieux.S'il s'agissait de changements validés, vous devriez jeter un œil à git-rebase, mais comme le souligne VonC, lorsque vous parlez de changements locaux, git-stash serait certainement le bon moyen de le faire.
la source
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 elles font trop d'hypothèses qui sont souvent fausses. Voilà comment le faire parfaitement. Le lien est vers mon propre site.
Comment s'engager dans une autre branche dans git
Vous avez des modifications non validées sur
my_branch
lesquelles vous souhaitez vous engagermaster
, sans valider toutes les modifications demy_branch
.Exemple
Explication
Commencez par fusionner
master
dans votre branche, car vous devrez le faire de toute façon, et c'est maintenant le meilleur moment pour résoudre tout conflit.L'
-u
option de (aka--include-untracked
) engit stash -u
vous empêche de perdre des fichiers non suivis quand vous faites plus tardgit clean -f -d
dans lesmaster
.Après,
git checkout master
il est important de ne PAS le fairegit stash pop
, car vous aurez besoin de cette cachette plus tard. Si vous pop la planque créémy_branch
puis faitesgit stash
enmaster
, vous causer des conflits de fusion inutiles lorsque vous appliquez plus tard que dans Stashmy_branch
.git reset
met en scène tout ce qui en résultegit stash apply
. Par exemple, les fichiers qui ont été modifiés dans la cachette mais qui n'existent pas sontmaster
mis en scène comme des conflits «supprimés par nous».git checkout .
etgit clean -f -d
supprimez tout ce qui n'est pas validé: toutes les modifications apportées aux fichiers suivis et tous les fichiers et répertoires non suivis. Ils sont déjà enregistrés dans la cachette et s'ils sont laissés dans,master
cela provoquerait des conflits de fusion inutiles lors du retour àmy_branch
.Le dernier
git stash pop
sera basé sur l'originalmy_branch
et ne provoquera donc aucun conflit de fusion. Cependant, si votre cachette contient des fichiers non suivis que vous vous êtes engagé à maîtriser, git se plaindra qu'il "n'a pas pu restaurer les fichiers non suivis à partir de la cachette". Pour résoudre ce conflit, supprimez ces fichiers de votre arborescence de travail, puisgit stash pop
,git add .
etgit reset
.la source