Je sais comment résoudre ceci:
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
_ les stash
et pop
dansent-ils pour moi?
Si cette commande a un nom différent, c'est bon.
Créer un alias de shell pour git stash; git pull; git stash pop
est une solution, mais je cherche une meilleure solution.
Pour Git 2.6+ (publié le 28 septembre 2015)
Le seul git config
le réglage qui pourrait être intéressant est:
rebase.autoStash
Lorsqu'il est défini sur true, créez automatiquement une réserve temporaire avant le début de l'opération et appliquez-la à la fin de l'opération.
Cela signifie que vous pouvez exécuter rebase sur un arbre de travail incorrect.Toutefois, utilisez-le avec précaution: l'application de stockage final après une nouvelle base peut entraîner des conflits non triviaux. La valeur par défaut est false.
combinez cela avec:
pull.rebase
Lorsque la valeur est true, rebase les branches au-dessus de la branche extraite, au lieu de fusionner la branche par défaut de la télécommande par défaut lorsque "git pull" est exécuté.
git config pull.rebase true
git config rebase.autoStash true
Cela suffirait pour un simple git pull
travailler même dans un arbre sale.
Aucun alias requis dans ce cas.
Voir commit 53c76dc (04 juil. 2015) par Kevin Daudt (Ikke
) .
(Fusion par Junio C Hamano - gitster
- dans commit e69b408 , 17 août 2015)
pull
: autoriser un arbre sale quandrebase.autostash
activéerebase a appris à cacher les changements quand il rencontre un arbre de travail sale, mais
git pull --rebase
ne fait pas.Seulement vérifier si l’arbre de travail est sale quand
rebase.autostash
n'est pas activé.
Note: si vous voulez tirer sans autostash (même si rebase.autoStash true
est réglé), vous avez depuis git 2.9 (juin 2016):
pull --rebase --no-autostash
Voir commit 450dd1d , commit 1662297 , commit 44a59ff , commit 5c82bcd , commit 6ddc97c , commit eff960b , commit efa195d (02 avr. 2016), et commit f66398e , commit c48d73b (21 mars 2016 ) par Mehul Jain (mehul2029
) .
(Fusion par Junio C Hamano - gitster
- dans commit 7c137bb , 13 avril 2016)
Commit f66398e comprend notamment:
pull --rebase
: ajouter--[no-]autostash
drapeauSi
rebase.autoStash
La variable de configuration est définie, il n’existe aucun moyen de la remplacer pour "git pull --rebase
"depuis la ligne de commande.Enseigner "
git pull --rebase
" le--[no-]autostash
indicateur de ligne de commande qui remplace la valeur actuelle derebase.autoStash
, si défini. Comme "git rebase
"comprend le--[no-]autostash
Option, c’est juste une question de passer l’option à "git rebase
" quand "git pull --rebase
" est appelé.
Avertissement: avant Git 2.14 (Q3 2017), "git pull --rebase --autostash
"n'a pas bloqué automatiquement lorsque l'historique local avance rapidement vers l'amont.
Voir commit f15e7cf (01 juin 2017) par Tyler Brazier (tylerbrazier
) .
(Fusion par Junio C Hamano - gitster
- dans commit 35898ea , 5 juin 2017)
pull
: ff--rebase --autostash
fonctionne dans le dépôt saleQuand
git pull --rebase --autostash
dans un référentiel sale, une avance rapide a été effectuée, aucun enregistrement automatique n’a été effectué et la récupération a échoué.
Cela était dû à un raccourci pour éviter d'exécuter rebase lorsque nous pouvions effectuer une avance rapide, mais l'autostash est ignoré sur ce chemin de code.
Mise à jour: Mariusz Pawelski demande dans les commentaires une question intéressante:
Donc tout le monde écrit à propos de
autostash
lorsque vous rebasez (oupull --rebase
).Mais personne ne parle d’autostashing lorsque vous effectuez une extraction normale avec fusionne.
Il n’ya donc pas de commutateur automatique pour cela? Ou je manque quelque chose? Je préfère fairegit pull --rebase
mais OP a demandé " standard" git pull
Répondre:
Le fil original discutant de cette fonctionnalité de démarrage automatique, elle a été implémentée à l'origine à la fois pour git pull
(fusion) et git pull --rebase
.
Mais ... Junio C Hamano (mainteneur Git) a noté que:
Si la
pull-merge
étaient _ quelque chose qui induirait le "désagrément" qui a déclenché ce sujet, par définition, le changement local chevauche la fusion, et ce "bruit de cache" interne va toucher les chemins que la fusion a touchés et il est probable que "Dropped" "mais laissons d’autres conflits à résoudre.Je soupçonne que
pull.autostash
La configuration n'est pas un bon ajout car elle encourage un flux de travail douloureux et induisant.
Dans les cas simples, cela peut ne pas nuire, mais lorsque les changements locaux sont complexes, il serait plus nuisible que de ne pas l’avoir, et la configuration l’empêche de choisir.L'équation est quelque peu différente pour "pull-rebase", car "rebase" insiste pour que vous commenciez à partir d'un arbre de travail propre, de sorte que "télécharger puis arrêter" l'ennui semble plus grand. Je soupçonne que le relâchement pourrait être une solution plus productive au vrai problème.
Donc, en ce qui concerne une fusion classique, il est préférable de:
encouragez l'utilisateur à réfléchir à la nature des travaux en cours qu'il a dans l'arbre de travail avant d'exécuter "
git pull
".
Est-ce une bête trop complexe qui peut interférer avec ce que font les autres, ou est-ce un changement anodin qu'il peut dissimuler et le repasser?Si le premier, il sera beaucoup mieux faire "
checkout -b
", continuez à travailler jusqu'à ce que le changement local prenne une forme quelque peu meilleure et" engagez ", avant de passer à la branche d'origine.Si ce dernier, il vaut mieux faire:
- "
git pull
",- après avoir trouvé des conflits, lancez
git stash
,git merge FETCH_HEAD
etgit stash pop
Pour économiser quelques secondes aux explorateurs à venir, voici un résumé (grâce à @VonC):
git pull --rebase --autostash
Comme indiqué dans le commentaire ci-dessus, la définition des deux valeurs de configuration ne fonctionne pas avec git pull
, car la configuration de l’autostash ne s’applique qu’à des bases réelles. Ces commandes git font ce que vous voulez:
git fetch
git rebase --autostash FETCH_HEAD
Ou définissez-le comme un alias:
git config alias.pullr '!git fetch; git rebase --autostash FETCH_HEAD'
Alors fais:
git pullr
Bien sûr, cet alias peut être renommé comme vous le souhaitez.
Avec Git 2.6+, vous pouvez utiliser les éléments suivants:
alias gup='git -c rebase.autoStash=true pull --rebase'
Cette --rebase
fait que git-pull utilise rebase
au lieu de merge
, donc des paramètres/options comme --ff-only
ne s'appliquera pas.
J'utilise un alias pour tirer avec --ff-only
par défaut (git pull --ff-only
), et peut alors utiliser gup
(vue de dessus) dans le cas où une fusion à avance rapide est impossible ou des modifications stockées sont stockées.
Comme vous l'avez déjà mentionné, c'est la façon de le faire. Vous pouvez l'utiliser dans un alias pour enregistrer votre saisie 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
Cela fera la même chose que vous, mais sur une seule ligne (&&) et si vous le définissez comme pseudonyme, il sera même plus court.
Les lignes suivantes affichent les modifications entrantes/sortantes avant de tirer/pousser
git log ^master Origin/master
git log master ^Origin/master