web-dev-qa-db-fra.com

Est-ce que "git pull" peut automatiquement cacher et faire apparaître les modifications en attente?

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.

103
guettli

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 quand rebase.autostash activée

rebase 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 drapeau

Si 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 de rebase.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 sale

Quand 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 (ou pull --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 faire git 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 et
    • git stash pop
155
VonC

Pour économiser quelques secondes aux explorateurs à venir, voici un résumé (grâce à @VonC):

git pull --rebase --autostash
27
Vitaliy Ulantikov

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.

14
user397114

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.

6
blueyed

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
1
CodeWizard