Wie löse ich git mit der Meldung "Übernehmen Sie Ihre Änderungen oder speichern Sie sie, bevor Sie sie zusammenführen können"?

763

Ich habe einige Updates auf meinem lokalen Computer vorgenommen, sie in ein Remote-Repository verschoben und jetzt versuche ich, die Änderungen auf den Server zu übertragen, und ich erhalte die Nachricht.

Fehler: Ihre lokalen Änderungen an den folgenden Dateien werden durch Zusammenführen überschrieben:

wp-content / w3tc-config / master.php

Bitte übernehmen Sie Ihre Änderungen oder speichern Sie sie, bevor Sie sie zusammenführen können.

Also rannte ich,

git checkout -- wp-content/w3tc-config/master.php

und versuchte es erneut und ich bekomme die gleiche Nachricht. Ich gehe davon aus, dass w3tcsich etwas in der Konfigurationsdatei auf dem Server geändert hat. Es ist mir egal, ob die lokale Kopie oder die Remote-Kopie auf dem Server gespeichert wird (ich nehme an, die Remote-Kopie ist die beste), ich möchte nur den Rest meiner Änderungen (Plugin-Updates) zusammenführen können.

Irgendwelche Ideen?

Jo Sprague
quelle
11
Dies ist eine explizitere Frage mit mehr Details und einer besseren Antwort. Ich denke, es ist wertvoll, diesen hier zu behalten. Ja, der andere wurde zuerst technisch gefragt, aber das Entfernen dieses würde es für die Leute schwieriger machen, die Antworten zu finden, nach denen sie suchen.
Jo Sprague

Antworten:

1300

Sie können nicht mit lokalen Änderungen zusammengeführt werden. Git schützt Sie vor dem Verlust potenziell wichtiger Änderungen.

Sie haben drei Möglichkeiten:

  • Übernehmen Sie die Änderung mit

    git commit -m "My message"
    
  • Verstecke es.

    Stashing fungiert als Stapel, in dem Sie Änderungen verschieben und in umgekehrter Reihenfolge einfügen können.

    Geben Sie zum Verstecken Folgendes ein

    git stash
    

    Führen Sie die Zusammenführung durch und ziehen Sie dann das Versteck:

    git stash pop
    
  • Verwerfen Sie die lokalen Änderungen

    mit git reset --hard
    odergit checkout -t -f remote/branch

    Oder: Verwerfen Sie lokale Änderungen für eine bestimmte Datei

    mit git checkout filename

stdcall
quelle
104
Sie können auch lokale Änderungen für eine bestimmte Datei verwerfen, indem Sie
Folgendes
6
Vielen Dank. Ich würde dem hinzufügen, wenn Sie dies tun git reset --hard, möchten Sie möglicherweise auch nicht verfolgte Dateien mitgit clean -dfx
Jo Sprague
13
Standardmäßig git stashwerden keine Dateien gespeichert, für die es keinen Verlauf gibt. Wenn Sie also Dateien haben, die Sie noch nicht hinzugefügt haben, die aber durch die Zusammenführung überschrieben oder "erstellt" würden, wird die Zusammenführung weiterhin blockiert. In dieser Situation können Sie auch git stash -unicht festgeschriebene Dateien speichern. Oder Sie können sie einfach löschen!
Joeytwiddle
25
Laufen git clean -dfxwar eine schreckliche Idee. Einige .gitignored-Dateien, die ich tatsächlich brauchte, wurden entfernt.
Ezuk
5
Ich bin auf eine Situation gestoßen, in der ein Benutzer nach dem Ausführen git reset --hardnoch nicht zusammengeführte Änderungen hatte!
Amedee Van Gasse
83
git stash
git pull <remote name> <remote branch name> (or) switch branch
git stash apply --index

Der erste Befehl speichert Ihre Änderungen vorübergehend im Stash und entfernt sie aus dem Arbeitsverzeichnis.

Der zweite Befehl wechselt die Zweige.

Der dritte Befehl stellt die Änderungen wieder her, die Sie im Stash gespeichert haben (die --indexOption ist nützlich, um sicherzustellen, dass bereitgestellte Dateien noch bereitgestellt werden).

Loganathan
quelle
1
stackoverflow.com/questions/15286075/… , kann auch nützlich sein
vikramvi
2
um @ vikramvis Punkt zu erklären: wir können auch git stash popanstelle von verwenden git stash apply. Ersteres entfernt es aus dem Vorrat, während Letzteres es noch dort aufbewahrt
Anupam,
27

Sie können eine der folgenden Methoden ausprobieren:

Rebase

Versuchen Sie bei einfachen Änderungen, die Änderungen erneut vorzunehmen, während Sie die Änderungen vornehmen, z

git pull origin master -r

Nach dem Abrufen wird Ihr aktueller Zweig über dem Upstream-Zweig angewendet.

Dies ist äquivalent zu: checkout master, fetchund rebase origin/masterGIT - Befehle.

Dies ist eine potenziell gefährliche Betriebsart. Es schreibt die Geschichte neu, was nicht gut ist, wenn Sie diese Geschichte bereits veröffentlicht haben. Verwenden Sie diese Option nur, wenn Sie sie git-rebase(1)sorgfältig gelesen haben .


Auschecken

Wenn Sie sich nicht um Ihre lokalen Änderungen kümmern, können Sie vorübergehend (mit Gewalt) zu einem anderen Zweig wechseln und ihn zurückschalten, z

git checkout origin/master -f
git checkout master -f

zurücksetzen

Wenn Sie sich nicht um Ihre lokalen Änderungen kümmern, versuchen Sie, sie auf HEAD (Originalzustand) zurückzusetzen, z

git reset HEAD --hard

Wenn das oben Gesagte nicht hilft, sind möglicherweise Regeln in Ihrer Git-Normalisierungsdatei ( .gitattributes) enthalten. Es ist daher besser, die darin enthaltenen Informationen festzuschreiben. Oder Ihr Dateisystem unterstützt keine Berechtigungen, sodass Sie diese filemodein Ihrer Git-Konfiguration deaktivieren müssen .

Verwandte: Wie erzwinge ich "git pull", um lokale Dateien zu überschreiben?

Kenorb
quelle
1
Funktioniert nicht: Ich erhalte immer noch die gleiche Meldung wie "Verstecke deine Änderungen zuerst". Wenn ich "git stash" und dann "git pull" eingebe -> "Fehler: Sie haben nicht gespeicherte Änderungen. Machen Sie zuerst einen Stash". Kurz bevor ich meinen Computer zerstöre
trinity420
@ trinity420 Könnten es Ihre Dateiberechtigungen sein, überprüfen Sie, git statuswelche Änderungen Sie nach dem Verstecken haben. Wenn keine Antwort hilft, sollten Sie eine neue Frage hinzufügen.
Kenorb
Vielen Dank, aber mein Problem wurde gelöst, alles hier ausprobiert, nichts hat funktioniert, dann auf "Änderungen festschreiben" und "Zusammenführen" in PHPStorm geklickt und dann habe ich die Änderungen aufgehoben und es hat funktioniert.
Trinity420
14

Versuche dies

git stash save ""

und versuchen Sie es erneut

Herr Niemand
quelle
In meinem Fall muss ich verwenden git stash -u, wie unter stackoverflow.com/questions/15745045/…
Obst
13

Die Situation, in die ich geriet, war folgende:

Fehler: Ihre lokalen Änderungen an den folgenden Dateien werden durch Zusammenführen überschrieben: wp-content / w3tc-config / master.php Bitte übernehmen Sie Ihre Änderungen oder speichern Sie sie, bevor Sie sie zusammenführen können.

außer, kurz davor war fern: also eigentlich das:

remote: error: Ihre lokalen Änderungen an den folgenden Dateien werden durch Zusammenführen überschrieben: some / file.ext Bitte übernehmen Sie Ihre Änderungen oder speichern Sie sie, bevor Sie sie zusammenführen können.

Was geschah, war (ich denke, nicht 100% positiv), dass der Git-Post-Empfangshaken aufgrund von Bewegungsänderungen im Remote-Server-Repository, die theoretisch nicht hätten berührt werden dürfen, anfing zu laufen und zu versagen.

Am Ende habe ich also den Post-Receive-Hook nachverfolgt und festgestellt, dass ich zum Remote-Repository auf dem Server gehen musste, und es gab die Änderung (die sich nicht in meinem lokalen Repository befand, was tatsächlich der Fall war) sagte, dass es übereinstimmte, keine Änderungen, nichts festzuschreiben, auf dem neuesten Stand usw.) Also, während es auf dem lokalen keine Änderungen gab, habe ich auf dem Server ein git checkout -- some/file.extund dann die lokalen und entfernten Repositorys tatsächlich übereinstimmten und ich konnte weiter arbeiten und bereitstellen. Ich bin mir nicht ganz sicher, wie diese Situation aufgetreten ist, obwohl ein paar Dutzend Entwickler und IT-Änderungen möglicherweise etwas damit zu tun haben.

Mike
quelle
2
Ist es eine Frage oder eine Antwort?
stdcall
2
@stdcall - Ein bisschen von beidem. Als ich auf diese Situation stieß, wie in der Frage beschrieben, musste ich Folgendes tun, um sie zu beheben. Es war definitiv keine normale Git-Lösung, und aus der Frage geht hervor, dass es sich um dieselbe abnormale Situation handeln könnte (dh Konfigurationsänderungen auf dem Server, aber die lokale hat keine Änderungen). Wenn jemand mehr Ahnung hat, warum (oder wie) dies passiert ist, würde ich jede Einsicht begrüßen.
Mike
7

WARNUNG: Dadurch werden nicht verfolgte Dateien gelöscht, daher ist dies keine gute Antwort auf diese Frage.

In meinem Fall wollte ich die Dateien nicht behalten, daher funktionierte dies für mich:

Git 2.11 und neuer:

git clean  -d  -fx .

Älterer Git:

git clean  -d  -fx ""

Referenz: http://www.kernel.org/pub/software/scm/git/docs/git-clean.html

  • -x bedeutet, dass ignorierte Dateien sowie Dateien, die git nicht kennen, ebenfalls entfernt werden.

  • -d bedeutet, dass nicht verfolgte Verzeichnisse zusätzlich zu nicht verfolgten Dateien entfernt werden.

  • -f ist erforderlich, um die Ausführung zu erzwingen.

Dunkle Materie
quelle
4

So protokollieren Sie Ihre neu erstellten Dateien, während Sie dieses Problem beheben:

Wenn Sie neu erstellte Dateien haben , können Sie einen Patch mit lokalen Änderungen erstellen, Remote-Zusammenführungen abrufen und Ihren lokalen Patch anwenden, nachdem die Remote-Zusammenführung abgeschlossen ist, wie unten Schritt für Schritt definiert:

  1. Stellen Sie Ihre lokalen Änderungen bereit. (nicht verpflichten). Staging ist erforderlich, um Patches für neu erstellte Dateien zu erstellen (da diese noch nicht verfolgt werden).

git add .

  1. Erstellen Sie einen Patch, um Aufzeichnungen zu führen

git diff --cached > mypatch.patch

  1. Verwerfen Sie lokale Änderungen und löschen Sie neue lokale Dateien

git reset --hard

  1. Änderungen ziehen

git pull

  1. Wende deinen Patch an

git apply mypatch.patch

Git führt Änderungen zusammen und erstellt .rej-Dateien für Änderungen, die nicht zusammengeführt werden.

Versuchen Sie, wie von Anu vorgeschlagen, wenn Sie Probleme beim Anwenden des Patches haben:

git apply --reject --whitespace=fix mypatch.patch Diese Antwort git: patch wendet keine ausführlichen Gespräche zu diesem Problem an

Genießen Sie Ihre fortgesetzte Arbeit an Ihrer Funktion und übernehmen Sie Ihre lokalen Änderungen, wenn Sie fertig sind.

Manpreet
quelle
Ich wollte einen Teil des Codes mit neuen Änderungen verschieben, also habe ich: 1. einen Patch aus meinem lokalen Entwicklungszweig erstellt 2. den Hard-Reset durchgeführt 3. die neuen Änderungen von Master zu Entwickler ziehen (um Zusammenführungskonflikte zu vermeiden) 4 . hat eine kleine Änderung an meinem lokalen Entwickler vorgenommen. 5. Auf Remote-Entwickler 6 error: patch failed: yourfile.py:33 error: yourfile.py: patch does not applyverschoben. Patch zurück angewendet. -> Fehler: Ich habe immer noch mypatch.patch, weiß aber nicht, warum es nicht angewendet wird und ich habe meine Änderungen verloren !
Anu
Ich habe es verstanden, der richtige Befehl war git apply --reject --whitespace=fix mypatch.patch, ich habe meine Änderungen zurückbekommen, Puh !!! [Danke an] ( stackoverflow.com/a/15375869/6484358 )
Anu
1
Anu, der Befehl git apply mypatch.patch ist korrekt, um Patch anzuwenden. Dies ist das, was ich ständig verwende. Möglicherweise liegt ein Problem mit dem erstellten Patch selbst vor, und Sie verlieren Ihre Änderungen nie, wenn Sie Ihren Patch in der Hand haben enthält alle konsolidierten Änderungen.
Manpreet
2

Vor dem Ziehen nach Commit fragen

  • git stash
  • git pull origin << branchname >>

Wenn benötigt :

  • Git Stash anwenden
Rahul Mankar
quelle
1
Verwenden Sie git stash, wenn Sie den aktuellen Status des Arbeitsverzeichnisses und des Index aufzeichnen möchten, aber zu einem sauberen Arbeitsverzeichnis zurückkehren möchten. Der Befehl speichert Ihre lokalen Änderungen und setzt das Arbeitsverzeichnis auf das HEAD-Commit zurück.
Pushpak Sharma
2

Für mich hat nur git reset --hardfunktioniert.

Commit war keine Option, da es nichts zu Commit gab.

Verstecken war keine Option, weil es nichts zu verstauen gab.

Sieht so aus, als hätte es von ausgeschlossenen Dateien stammen können .git/info/exclude, git update-index --assume-unchanged <file>die einige Dateien bearbeitet haben.

Löwe
quelle
0

In meinem Fall habe ich die Datei, über die Git sich beschwert hat, gesichert und dann gelöscht. Dann konnte ich endlich einen anderen Zweig auschecken.

Ich ersetzte dann die Datei, kopierte sie zurück in den Inhalt und fuhr fort, als ob nichts passiert wäre.

CodyBugstein
quelle
0

Ich habe die erste Antwort versucht: git stashmit der höchsten Punktzahl, aber die Fehlermeldung ist immer noch aufgetaucht, und dann habe ich diesen Artikel gefunden, um die Änderungen festzuschreiben , anstatt "Reluctant Commit" zu speichern.

und die Fehlermeldung verschwand schließlich:

1: git add .

2: git commit -m "this is an additional commit"

3: git checkout the-other-file-name

dann hat es geklappt. hoffe diese antwort hilft. :)

Sophie Cai
quelle
0

Wenn Sie Git Extensions verwenden , sollten Sie in der Lage sein, Ihre lokalen Änderungen Working directorywie folgt zu finden :

Geben Sie hier die Bildbeschreibung ein

Wenn Sie keine Änderungen sehen, liegt dies wahrscheinlich daran, dass Sie sich in einem falschen Untermodul befinden. Überprüfen Sie daher alle Elemente mit einem U-Boot-Symbol, wie unten gezeigt:

Geben Sie hier die Bildbeschreibung ein

Wenn Sie eine nicht festgeschriebene Änderung gefunden haben:

Wählen Sie die Zeile mit aus Working directory, navigieren Sie zur Registerkarte Diff , klicken Sie mit der rechten Maustaste auf Zeilen mit einem Stiftsymbol (oder +oder -), wählen Sie Zurücksetzen, um zuerst festzuschreiben oder festzuschreiben oder zu speichern, oder was auch immer Sie damit tun möchten.

Bizhan
quelle
0

Bei mir hat das geklappt:

git reset --hard

und dann

git pull origin <*current branch>

nachdem

git checkout <*branch>

Chloe
quelle
0

Wahrscheinlich

git --rebase --autostash

würde helfen

Eugen Konkov
quelle