Erreur: impossible d'extraire avec rebase: vous avez des modifications non mises en scène


139

J'ai commencé à collaborer avec quelques amis sur un projet et ils utilisent le référentiel heroku git.

J'ai cloné le référentiel il y a quelques jours et ils ont depuis apporté des modifications, j'essaie donc d'obtenir les dernières mises à jour

J'ai exécuté la git pull --rebasecommande comme indiqué ici (est-ce la bonne façon de le faire?): Https://devcenter.heroku.com/articles/sharing#merging-code-changes

J'obtiens l'erreur suivante:

$ git pull --rebase
Cannot pull with rebase: You have unstaged changes.
Please commit or stash them.

Je suppose que j'ai dérangé le code et que maintenant il veut que je valide ou que je rejette (est-ce que cela signifie stash?) Les changements. Est-ce ce qui se passe? Si tel est le cas, je voudrais annuler toutes les modifications que j'aurais pu apporter et simplement obtenir le code mis à jour du référentiel git.

Une idée de ce que je peux faire?

Réponses:


174

Faites git status, cela vous montrera quels fichiers ont changé. Puisque vous avez déclaré que vous ne voulez pas conserver les modifications que vous pouvez faire git checkout -- <file name>ou git reset --hardvous en débarrasser.

Pour la plupart, git vous dira quoi faire des changements. Par exemple, votre message d'erreur indique git stashvos modifications. Ce serait si vous vouliez les garder. Après avoir tiré, vous feriez alors git stash popet vos modifications seraient réappliquées.

git status a également comment se débarrasser des changements selon que le fichier est préparé pour la validation ou non.


1
Cela semblait avoir du travail mais maintenant je suis confronté à une autre erreur (j'ai commencé une nouvelle question pour ne pas confondre les visiteurs futurs): stackoverflow.com/questions/23518247
...

J'ai littéralement ça à chaque fois, tout récemment. Avant, extraire des fichiers qui n'affectent pas vos modifications actuelles est bien, mais maintenant, tout ce que vous avez modifié doit être caché. Je ne peux même pas pousser, je suis obligé d'utilisergit push -f
Karma Blackshaw

@KarmaBlackshaw Vous ne devriez pas avoir besoin de forcer la poussée. Si vous devez faire une poussée forcée, cela signifie que votre histoire locale et l'histoire lointaine sont différentes et c'est une question différente de ce que couvre cette réponse.
Schleis

La portée de cette question est en effet différente de celle que prévoit la portée de cette question. Mais j'ai trouvé un moyen en supprimant la branche actuelle et en créant une nouvelle branche à partir de develop. Je suppose que c'était ma branche qui avait certaines choses mal configurées.
Karma Blackshaw

91

Si vous souhaitez conserver vos modifications de travail tout en effectuant un rebase, vous pouvez utiliser --autostash. De la documentation :

Avant de commencer le rebase, cachez les modifications locales (voir git-stash [1] ) si nécessaire, et appliquez le cache une fois terminé.

Par exemple:

git pull --rebase --autostash

7
Telle est la réponse moderne.
adl du

13
Si vous voulez que l'autostash soit le comportement par défaut que vous pouvez définir git config --global rebase.autoStash true , vous n'avez pas besoin de passer le commutateur.
Zoredache

1
CECI, ce que je cherchais! (notez que le commutateur de ligne de commande est disponible depuis git 2.9, mais l'option rebase.autostashest disponible depuis 2.6).
jjmontes

Cela fonctionne très bien git rebase --interactiveaussi!
Dan Dascalescu

6
Pourquoi n'est-ce pas la valeur par défaut?
Nick

49

Tirer avec rebase est une bonne pratique en général.

Cependant, vous ne pouvez pas faire cela si votre index n'est pas propre, c'est-à-dire que vous avez effectué des modifications qui n'ont pas été validées.

Vous pouvez le faire pour contourner, en supposant que vous souhaitiez conserver vos modifications:

  1. cachez vos modifications avec: git stash
  2. tirer du maître avec rebase
  3. réappliquez les modifications que vous avez cachées dans (1) avec: git stash apply stash@{0}ou le plus simplegit stash pop

1
Cela semblait avoir du travail mais maintenant je suis confronté à une autre erreur (j'ai commencé une nouvelle question pour ne pas confondre les visiteurs futurs): stackoverflow.com/questions/23518247/…
user3597950

6
@nehemiahjacob Vous pouvez également git stash popappliquer les modifications les plus récentes et éviter de les mémoriser plus longtemps apply stash@{0}.
Kostas Rousis

Je dois faire ça tout le temps. Un moyen plus simple?
Alper le

@alper vous travaillez généralement sur une autre branche (fonctionnalité). D'après mon expérience, je ne récupère et ne rebase contre master qu'après avoir validé mon travail, il n'est donc pas nécessaire de cacher / pop. Si vous vous trouvez en train de faire beaucoup cela pendant votre flux de travail de développement, vous pouvez toujours créer un alias dans votre .bashrc(ou ce que vous utilisez):alias stashpull='git stash; git pull; git stash pop'
Kostas Rousis

@KostasRousis J'ai cet alias exact, lol. Je l'appelle 'sppgit'
luizfls

30

Commencez par un git status

Vérifiez si vous avez des modifications en attente. Pour les jeter, exécutez

git reset --hard

Cela semblait avoir du travail mais maintenant je suis confronté à une autre erreur (j'ai commencé une nouvelle question pour ne pas confondre les visiteurs futurs): stackoverflow.com/questions/23518247
...

16

Cela fonctionne pour moi:

git fetch
git rebase --autostash FETCH_HEAD

1
Ah autostash, cela me fait gagner deux commandes supplémentaires. Cela devrait être la bonne réponse IMO.
Erik Berkun-Drevnig

10

Tu peux toujours faire

git fetch && git merge --ff-only origin/master

et vous obtiendrez soit (a) aucun changement si vous avez des changements non validés qui entrent en conflit avec les changements en amont ou (b) le même effet que stash / pull / apply: un rebase pour vous mettre sur les dernières modifications de HEAD et vos modifications non validées à gauche comme si.


6

Lorsque le changement non organisé est dû au fait que git tente de corriger les conventions eol sur un fichier (comme c'est toujours mon cas), aucune quantité de stockage, de retrait ou de réinitialisation ne le fera disparaître.

Cependant, si l'intention est vraiment de rebaser et d'ignorer les modifications non mises en scène, ce que je fais est de supprimer la branche localement, puis de la vérifier à nouveau.

git checkout -f anyotherbranchthanthisone
git branch -D thebranchineedtorebase
git checkout thebranchineedtorebase

Voila! Cela ne m'a pas encore déçu.


2

Si vous souhaitez cacher automatiquement vos modifications et les désinstaller pour chaque rebase, vous pouvez le faire:

git config --global rebase.autoStash true

1
C'est la seule réponse qui fait que la dernière version de Git fonctionne de la même manière que Git a toujours fonctionné dans le passé. Pourquoi faire ajouter des gens --autostashalors que cela peut être simplement ... automatique?
Andrew Koster
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.