Je sais comment résoudre ça:
user@host$ git pull
Updating 9386059..6e3ffde
error: Your local changes to the following files would be overwritten by merge:
foo.bar
Please, commit your changes or stash them before you can merge.
Aborting
Mais n'y a-t-il pas moyen de laisser git pull
faire stash
et pop
danser pour moi?
Si cette commande a un nom différent, c'est ok.
Créer un alias shell pour git stash; git pull; git stash pop
est une solution, mais je recherche une meilleure solution.
git stash; git pull; git stash pop
programme est dangereuse, car s'il n'y a rien à cacher, cegit stash
sera une non-opération, maisgit stash pop
fera apparaître la dernière réserve (le cas échéant), ce qui n'est presque certainement pas ce que vous voulez. L'utilisateur torek a un excellent article à ce sujet sur Stack Overflow, mais je ne le trouve pas ...Réponses:
Pour Git 2.6+ (publié le 28 septembre 2015)
le
seulementgit config
réglage qui serait intéressant est:(avec Git 2.27, Q2 2020, vous avez maintenant aussi
merge.autostash
, voir ci-dessous)combinez cela avec:
Cela suffirait pour un simple
git pull
à travailler même dans un arbre sale.Aucun alias nécessaire dans ce cas.
Voir commit 53c76dc (04 juillet 2015) par Kevin Daudt (
Ikke
) .(Fusionné par Junio C Hamano -
gitster
- in commit e69b408 , 17 août 2015)Remarque: si vous voulez tirer sans autostash (même si elle
rebase.autoStash true
est définie), vous avez depuis git 2.9 (juin 2016):Voir commit 450dd1d , commit 1662297 , commit 44a59ff , commit 5c82bcd , commit 6ddc97c , commit eff960b , commit efa195d (02 avril 2016) et commit f66398e , commit c48d73b (21 mars 2016) par Mehul Jain (
mehul2029
) .(Fusionné par Junio C Hamano -
gitster
- in commit 7c137bb , 13 avril 2016)Commit f66398e comprend notamment:
Attention: avant Git 2.14 (Q3 2017), "
git pull --rebase --autostash
" ne se cachait pas automatiquement lorsque l'histoire locale passait rapidement à l'amont.Voir commit f15e7cf (01 juin 2017) par Tyler Brazier (
tylerbrazier
) .(Fusionné par Junio C Hamano -
gitster
- dans commit 35898ea , 05 juin 2017)Mise à jour: Mariusz Pawelski pose dans les commentaires une question intéressante:
Répondre:
Le fil de discussion original traitant de cette fonction d'autostash, il a été implémenté à l'origine à la fois pour
git pull
(fusion) etgit pull --rebase
.Mais ... Junio C Hamano (mainteneur de Git) a noté que:
Donc, concernant un pull-merge classique, il vaut mieux:
Cela étant dit, avec Git 2.27 (Q2 2020), "
git pull
" a appris à avertir lorsqu'aucunepull.rebase
configuration n'existe, et ni--[no-]rebase
ni--ff-only
n'est donné (ce qui entraînerait une fusion).Voir commit d18c950 (10 mars 2020) par Alex Henrie (
alexhenrie
) .(Fusionné par Junio C Hamano -
gitster
- dans commit 1c56d6f , 27 mars 2020)Avec Git 2.27 (Q2 2020), "
git merge
" apprend l'--autostash
option " " et le nouveaumerge.autostash
paramètre.Voir commettre d9f15d3 , engager f8a1785 , engager a03b555 , engager 804fe31 , engager 12b6e13 , commettre 0dd562e , commettre 0816f1d , commettre 9bb3dea , commettre 4d4bc15 , engager b309a97 , engager f213f06 , engager 86ed00a , engager facca7f , engager be1bb60 , engager efcf6cf , engager c20de8b , commit bfa50c2 , commit 3442c3d , commit 5b2f6d9 (07 avril 2020), commit 65c425a(04 avril 2020), et commit fd6852c , commit 805d9ea (21 mars 2020) par Denton Liu (
Denton-L
) .(Fusionné par Junio C Hamano -
gitster
- dans commit bf10200 , 29 avril 2020)Et:
la source
rebase.autoStash
s'applique uniquement lors de l'utilisation de rebase.pull.rebase
s'applique uniquement lors de l'utilisation de pull.die_on_unclean_work_tree
.2.5.5
.rebase
(oupull --rebase
). Mais personne ne se préoccupe de l'autostashing lorsque vous faites normalementpull
des fusions. Il n'y a donc pas de commutateur automatique pour cela? Ou je manque quelque chose? Je préfère fairegit pull --rebase
mais OP a posé des questions sur "standard"git pull
Pour gagner quelques secondes pour les explorateurs à venir, voici un résumé (merci à @VonC):
la source
git config pull.rebase true
etgit config rebase.autoStash true
, tout ce dont vous aurez besoin estgit pull
. Justegit pull
. Aucune autre option requise.--autostash
option. Les-c rebase.autoStash=true
travaux dans Git 2.6 et versions ultérieures.Comme indiqué dans le commentaire ci-dessus, la définition des deux valeurs de configuration ne fonctionne pas actuellement
git pull
, car la configuration d'autostash ne s'applique qu'aux rebases réels. Ces commandes git font ce que vous voulez:Ou définissez-le comme un alias:
Alors fais:
Bien entendu, cet alias peut être renommé à volonté.
la source
Avec Git 2.6+, vous pouvez utiliser les éléments suivants:
Cela
--rebase
rend l'utilisation de git-pull à larebase
place demerge
, donc les paramètres / options comme--ff-only
ne s'appliquent pas.J'utilise un alias pour tirer avec
--ff-only
par défaut (git pull --ff-only
), et je peux ensuite utilisergup
(d'en haut) au cas où une fusion à avance rapide n'est pas possible ou s'il y a des modifications cachées.la source
git pull --ff-only
etgit pull pull --rebase --autostash
Comme vous l'avez déjà mentionné, c'est la façon de procéder. Vous pouvez l'utiliser dans un alias pour vous éviter de taper et utiliser un raccourci ou vous pouvez l'utiliser sur une seule ligne (peut également être un alias)
git stash && git pull --rebase && git stash pop
Il fera la même chose que vous, mais en une seule ligne (&&) et si vous le définissez comme alias, il sera encore plus court.
Les lignes suivantes afficheront les changements entrants / sortants avant de tirer / pousser
la source
stash pop
supprimera des éléments aléatoires d'avant.git stash
ne cache rien, il ne "retourne" toujours aucun code d'erreur, donc le && continuera toujours avecgit pull
etgit stash pop
et affichera un cache précédent. Il vaut donc mieux ne pas l'utiliser à moins d'être sûr que cela cachera quelque chose!