Fehler: Kann nicht mit Rebase ziehen: Sie haben nicht bereitgestellte Änderungen

137

Ich habe angefangen, mit ein paar Freunden an einem Projekt zusammenzuarbeiten und sie verwenden das Heroku Git Repository.

Ich habe das Repository vor ein paar Tagen geklont und sie haben seitdem einige Änderungen vorgenommen, sodass ich versuche, die neuesten Updates zu erhalten

Ich habe den git pull --rebaseBefehl wie hier angegeben ausgeführt (Ist dies der richtige Weg?): Https://devcenter.heroku.com/articles/sharing#merging-code-changes

Ich erhalte folgende Fehlermeldung:

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

Ich vermute, dass ich mit dem Code herumgespielt habe und jetzt möchte ich die Änderungen entweder festschreiben oder verwerfen (bedeutet das, was Stash bedeutet?). Passiert das? In diesem Fall möchte ich alle vorgenommenen Änderungen verwerfen und nur den aktualisierten Code aus dem Git-Repository abrufen.

Irgendeine Idee, was ich tun kann?

user3597950
quelle

Antworten:

172

Do git status, dies zeigt Ihnen , welche Dateien geändert haben. Da Sie angegeben haben, dass Sie die Änderungen, die Sie vornehmen können, nicht beibehalten git checkout -- <file name>oder die Änderungen entfernen möchten git reset --hard.

Zum größten Teil wird git Ihnen sagen, was Sie gegen Änderungen tun sollen. In Ihrer Fehlermeldung wurden beispielsweise git stashIhre Änderungen angegeben. Dies wäre, wenn Sie sie behalten wollten. Nach dem Ziehen würden Sie dann tun git stash popund Ihre Änderungen würden erneut angewendet.

git status Außerdem können Sie Änderungen entfernen, je nachdem, ob die Datei für das Festschreiben bereitgestellt wird oder nicht.

Schleis
quelle
1
Dies schien zu funktionieren, aber jetzt stehe ich vor einem weiteren Fehler (es wurden neue Fragen gestellt, um zukünftige Besucher nicht zu verwirren): stackoverflow.com/questions/23518247/…
user3597950
Ich habe das buchstäblich jedes Mal, erst vor kurzem. Früher war das Abrufen von Dateien, die sich nicht auf Ihre aktuellen Änderungen auswirken, in Ordnung. Jetzt muss alles, was Sie ändern, gespeichert werden. Ich kann nicht einmal pushen, ich bin gezwungen zu benutzengit push -f
Karma Blackshaw
@KarmaBlackshaw Du solltest keinen Druck erzwingen müssen. Wenn Sie einen Force-Push ausführen müssen, bedeutet dies, dass Ihr lokaler Verlauf und der Remote-Verlauf unterschiedlich sind und dass dies eine andere Frage ist als die, die diese Antwort abdeckt.
Schleis
Es ist in der Tat etwas anderes als der Umfang dieser Frage. Aber ich habe einen Weg gefunden, indem ich den aktuellen Zweig gelöscht und einen neuen Zweig aus der Entwicklung erstellt habe. Ich denke, es war mein Zweig, in dem einige Dinge falsch konfiguriert waren.
Karma Blackshaw
90

Wenn Sie Ihre Arbeitsänderungen beibehalten möchten, während Sie eine Rebase durchführen, können Sie diese verwenden --autostash. Aus der Dokumentation :

Bevor Sie mit der Rebase beginnen, verstauen Sie bei Bedarf lokale Änderungen (siehe git-stash [1] ) und wenden Sie den Stash an, wenn Sie fertig sind.

Beispielsweise:

git pull --rebase --autostash
mkobit
quelle
7
Dies ist die moderne Antwort.
adl
13
Wenn Sie möchten, dass Autostash das Standardverhalten ist, das Sie festlegen können, müssen git config --global rebase.autoStash true Sie den Schalter nicht übergeben.
Zoredache
1
DAS, wonach ich gesucht habe! (Beachten Sie, dass der Befehlszeilenschalter ab Git 2.9 verfügbar ist, die Option rebase.autostashjedoch ab 2.6 verfügbar ist.)
Jjmontes
Das funktioniert auch gut für git rebase --interactive!
Dan Dascalescu
6
Warum ist das nicht die Standardeinstellung?
Nick
49

Das Ziehen mit Rebase ist im Allgemeinen eine gute Praxis.

Sie können dies jedoch nicht tun, wenn Ihr Index nicht sauber ist, dh Sie haben Änderungen vorgenommen, die nicht festgeschrieben wurden.

Sie können dies tun, um das Problem zu umgehen, vorausgesetzt, Sie möchten Ihre Änderungen beibehalten:

  1. Verstecken Sie Ihre Änderungen mit: git stash
  2. Mit Rebase vom Master ziehen
  3. Wenden Sie die Änderungen, die Sie in (1) gespeichert haben, erneut an mit: git stash apply stash@{0}oder den einfacherengit stash pop
Kostas Rousis
quelle
1
Dies schien zu funktionieren, aber jetzt stehe ich vor einem weiteren Fehler (neue Fragen wurden gestartet, um zukünftige Besucher nicht zu verwirren): stackoverflow.com/questions/23518247/…
user3597950
6
@nehemiahjacob Sie können auch git stash popdie zuletzt verdeckten Änderungen anwenden und vermeiden, sich länger zu merken apply stash@{0}.
Kostas Rousis
Ich muss das die ganze Zeit machen. Einfacher?
Alper
@alper Normalerweise arbeiten Sie an einem anderen (Feature-) Zweig. Nach meiner Erfahrung rufe ich den Master erst ab, nachdem ich meine Arbeit geleistet habe, und muss ihn nicht mehr verstecken. Wenn Sie dies während Ihres Entwicklungsworkflows häufig tun, können Sie jederzeit einen Alias ​​in Ihrem .bashrc(oder was auch immer Sie verwenden) alias stashpull='git stash; git pull; git stash pop'
erstellen
@KostasRousis Ich habe genau diesen Alias, lol. Ich nenne es 'sppgit'
luizfls
30

Beginnen Sie zuerst mit einem git status

Überprüfen Sie, ob Änderungen anstehen. Um sie zu verwerfen, laufen Sie

git reset --hard
Igal S.
quelle
Dies schien zu funktionieren, aber jetzt stehe ich vor einem weiteren Fehler (es wurden neue Fragen gestellt, um zukünftige Besucher nicht zu verwirren): stackoverflow.com/questions/23518247/…
user3597950
16

Das funktioniert bei mir:

git fetch
git rebase --autostash FETCH_HEAD
CppChase
quelle
1
Ah autostash, das erspart mir zwei zusätzliche Befehle. Dies sollte die richtige Antwort IMO sein.
Erik Berkun-Drevnig
10

Das kannst du immer tun

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

und Sie erhalten entweder (a) keine Änderung, wenn Sie nicht festgeschriebene Änderungen vorgenommen haben, die im Widerspruch zu vorgelagerten Änderungen stehen, oder (b) den gleichen Effekt wie stash / pull / apply: eine Rebase, mit der Sie auf die neuesten Änderungen von HEAD und Ihre nicht festgeschriebenen Änderungen zurückgreifen können wie es ist.

Jared Updike
quelle
6

Wenn die nicht bereitgestellte Änderung darauf zurückzuführen ist, dass git versucht, eol-Konventionen für eine Datei zu korrigieren (wie es immer mein Fall ist), wird sie durch kein Verstauen, Auschecken oder Zurücksetzen verschwinden.

Wenn die Absicht jedoch wirklich darin besteht, nicht bereitgestellte Änderungen neu zu starten und zu ignorieren, lösche ich den Zweig lokal und checke ihn dann erneut aus.

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

Voila! Es hat mich noch nicht enttäuscht.

tggagne
quelle
2

Wenn Sie Ihre Änderungen automatisch speichern und für jede Rebase freigeben möchten, können Sie Folgendes tun:

git config --global rebase.autoStash true
Agirault
quelle
1
Dies ist die einzige Antwort, mit der die neueste Version von Git so funktioniert, wie Git es in der Vergangenheit immer getan hat. Warum Leute hinzufügen lassen, --autostashwenn es nur ... automatisch sein kann?
Andrew Koster