Wie ignoriere ich einen Fehler bei 'git pull', bei dem meine lokalen Änderungen durch Zusammenführen überschrieben werden?

568

Wie ignoriere ich die folgende Fehlermeldung bei Git Pull?

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

Was ist, wenn ich sie überschreiben möchte ?

Ich habe Dinge wie versucht git pull -f, aber nichts funktioniert.

Um klar zu sein, ich möchte nur bestimmte Änderungen überschreiben, nicht alles.

mae
quelle
Verwandte, aber kein Duplikat: stackoverflow.com/questions/52704/…
Daniel Hilgarth
7
@BrianKnoblauch stimme voll und ganz zu! Außerdem ist es keine große "Verschmelzung", wenn es "Überschreiben" ist, oder? Ich vermisse SVN jeden Tag ...
user1944491
2
git config core.fileMode falserette meine Zeiten
Nolwennig
Was ist, wenn ich sie nicht überschreiben möchte?
Philip Rego

Antworten:

439

Wenn Sie alle lokalen Änderungen - einschließlich Dateien, die von git nicht verfolgt werden - aus Ihrer Arbeitskopie entfernen möchten, speichern Sie sie einfach:

git stash push --include-untracked

Wenn Sie sie nicht mehr benötigen, können Sie sie jetzt ablegen:

git stash drop

Wenn Sie Änderungen, die Sie bereits bereitgestellt haben, nicht speichern möchten - z. B. mit git add-, fügen Sie die Option hinzu --keep-index. Beachten Sie jedoch, dass dies das Zusammenführen weiterhin verhindert, wenn diese bereitgestellten Änderungen mit denen von Upstream kollidieren.


Wenn Sie nur bestimmte Teile Ihrer lokalen Änderungen überschreiben möchten, gibt es zwei Möglichkeiten:

  1. Übernehmen Sie alles, was Sie nicht überschreiben möchten, und verwenden Sie für den Rest die oben beschriebene Methode.

  2. Verwenden git checkout path/to/file/to/revertSie diese Option für die Änderungen, die Sie überschreiben möchten. Stellen Sie sicher, dass die Datei nicht über bereitgestellt wird git reset HEAD path/to/file/to/revert.

Daniel Hilgarth
quelle
Möglichkeit Nr. 2 funktioniert nicht. Nach dem Ausführen des Befehls passiert nichts. Beim Ziehen bekomme ich immer noch den gleichen Fehler.
Mae
1
@ user1132363: Es funktioniert bei mir. Bitte testen Sie es zuerst mit einer einzigen Datei. Außerdem müssen Sie sicherstellen, dass die Datei, die Sie überschreiben möchten, nicht bereitgestellt wird.
Daniel Hilgarth
3
Der Trick war zu benutzen git checkout HEAD^ path/to/file/to/revert. Die Verwendung von HEAD ^ machte den Unterschied.
Mae
2
@ user1132363: Das überprüft die vorherige Version und nicht die aktuell eingecheckte. Ich glaube nicht, dass dies der richtige Ansatz ist.
Daniel Hilgarth
1
Ich musste " save --keep-index" weglassen.
Peter Mortensen
318

Okay, mit Hilfe der beiden anderen Antworten habe ich eine direkte Lösung gefunden:

git checkout HEAD^ file/to/overwrite
git pull
mae
quelle
7
Das hat bei mir funktioniert. Könnten Sie diese Antwort erweitern, dh. was macht das eigentlich
AC Patrice
3
Es löscht lokale Änderungen und kehrt zur HEAD-Referenz zurück, die wahrscheinlich das letzte Commit in der Hauptniederlassung ist
k3a
32
warum HEAD ^ statt HEAD?
Yura
19
HEAD ^ ist die Abkürzung für HEAD ^ 1, was im Wesentlichen das Commit vor HEAD bedeutet. Sie können auch HEAD ^ 2 für das Commit vor diesem ausführen. Weitere Informationen finden Sie unter git-scm.com/book/en/v2/… und stackoverflow.com/questions/1955985/… .
Davidneedham
4
Bitte erklären Sie, was dies in der Antwort tut
Endolith
242

Dies funktioniert für mich, um alle lokalen Änderungen zu überschreiben, und erfordert keine Identität:

git reset --hard
git pull
kravits88
quelle
4
SO muss an ihrem Ranking-Algo arbeiten, umständlich, um eine funktionierende, hoch bewertete Antwort zu finden.
Benedict K.
3
@ BenedictK. Ich glaube, dass das Ranking-System angemessen widerspiegelt, "was die meisten Menschen am hilfreichsten finden". Sie sind nach Stimmen geordnet. Mehr Menschen bevorzugen die anderen Lösungen. Dies ist eine gute Lösung, aber mehr Leute finden , die anderen Antworten mehr hilfreich.
Kittsil
Funktioniert gut für mich
Ender
super einfach =) thx ^^
lestat_kim
Panzer, funktioniert gut für mich
Igor
76

Hier ist eine Lösung, die inszenierte Änderungen wegwirft:

git reset file/to/overwrite
git checkout file/to/overwrite
Nachbeben
quelle
11
Ärgerlicherweise wird das Problem dadurch nicht behoben, wenn der wahrgenommene Unterschied auf der Tatsache beruht, dass die Zeilenumbrüche der Datei beim Auschecken geändert wurden.
DanielSank
1
Mein Problem gelöst.
Loïc N.
Dies ist die beste Antwort, imo, weil es keine inszenierten Elemente stört, sondern das Problem der Datei
behebt
65

Sie können Ihre Änderungen entweder vor dem Zusammenführen festschreiben oder sie speichern:

  1. git stash save
  2. git merge origin/master
  3. git stash pop
Suneel Kumar
quelle
10
Der Punkt ist, Sie sollten dies nicht tun müssen. Nehmen Sie einfach das aktuelle HEAD-Material und ..... fügen Sie es ein! Es ist wirklich einfach, Git, alle anderen VCS machen es ... aber nein. Linus musste es nervig machen, es zu benutzen.
Jon
@ Jon Diese Lösung ist für Ubuntu, ich habe nichts Besseres gefunden als diese.
Suneel Kumar
Leider ist --autostashOption nur mit --rebaseOption verfügbar (
Eugen Konkov
Das wird so viele Probleme mit sich bringen, dass es sich nicht lohnt. Es dauert mindestens 5 Minuten, um auch zu laden. Führt auch "Unlink of File" -Fehler ein. Downvote
Philip Rego
51

Wenn Sie Ihre lokalen Änderungen in einer Datei verwerfen möchten, haben Sie folgende Möglichkeiten:

git checkout -- <file>

Dann könnten Sie die Datei (en) mit der neuesten Version überschreiben, die gerade ausgeführt wird:

git pull
pabloasc
quelle
@pabloasc Dies zerstört Ihre lokalen Änderungen in dieser Datei.
Suneel Kumar
6
Ja, das tut es: "Was ist, wenn ich sie überschreiben möchte?"
David
1
Die ursprüngliche Frage kann dies nicht. Diese Antwort kann jemandem einen Albtraum bescheren, der den Befehl blind kopieren und einfügen kann.
Suneel Kumar
Falls Sie bereits ein Commit durchgeführt haben, müssen Sie zuerst das Commit über git reset HEAD~git checkout
zurücksetzen
git checkout -- <file>scheitert miterror: pathspec '<file>' did not match any file(s) known to git.
A__
18

Wenn Ihr Repository einige Dateien enthält, die entfernt wurden aus master:

  1. git checkout master
  2. git fetch origin
  3. git reset --hard origin/master
  4. git checkout -b newbranch
Nikhil KR
quelle
12

Manchmal funktioniert nichts davon. Ärgerlicherweise wird aufgrund der LF-Sache, die ich denke, das Löschen der Dateien und das anschließende Ziehen funktionieren . Nicht, dass ich diese Lösung empfehle, aber wenn die Datei nicht existiert, informiert git Sie nicht unnötig darüber, dass Ihre Änderungen (die möglicherweise nicht einmal Änderungen sind) überschrieben werden und Sie fortfahren können.

Benutzung auf eigene Gefahr.

Jeremy Holovacs
quelle
Wenn Sie aufgrund von Zeilenenden stecken bleiben, ist diese Methode ein Lebensretter
Dan Pisarski
Das funktioniert bei mir nicht. Die Dateien existieren nicht lokal und ich erhalte immer noch den Fehler.
PRMan
11

git stash save --keep-index hat bei mir nicht funktioniert.

Der folgende Befehl funktionierte wie erwartet.

git reset --hard
git pull

Es überschreibt alle lokalen Änderungen, wenn Sie sie nicht benötigen.

Khemraj
quelle
10

So viele Antworten hier, dass ich es hasse, noch eine hinzuzufügen, aber alle oben genannten sind klobiger als sie sein müssen. Ich muss dies die ganze Zeit tun, da Git verwirrt zu sein scheint und sagt, dass ich Dateien geändert habe, die sich nicht geändert haben (kann nicht zurückgesetzt werden, weil sie sich nicht geändert haben, aber ich kann nicht ziehen, weil sie sich angeblich geändert haben) Das schnellste, das ich bisher gefunden habe, ist:

git stash
git stash drop
git pull
Brian Knoblauch
quelle
arbeitete wie ein Zauber
Blaze
Tolle! einfache und funktionierende Lösung.
naive RSA
Genial, vielen Dank
Hamza
8

Im letzten Git können Sie den Befehl -r/ --rebaseon hinzufügen pull, um Ihren aktuellen Zweig nach dem Abrufen über dem Upstream-Zweig neu zu starten. Die Warnung sollte verschwinden, aber es besteht die Gefahr, dass Sie einige Konflikte bekommen, die Sie lösen müssen.


Alternativ können Sie verschiedene Zweige mit Gewalt auschecken und dann wieder masterzurückkehren, z.

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

Dann ziehen Sie es wieder wie gewohnt:

git pull origin master

Mit dieser Methode können Sie Zeit sparen, wenn Sie Probleme mit Stashing ( git stash) und potenziellen Berechtigungen haben, Dateien zurücksetzen ( git reset HEAD --hard), Dateien entfernen ( git clean -fd) usw. Auch die oben genannten Punkte sind leichter zu merken.

Kenorb
quelle
8

Dieses Problem ist darauf zurückzuführen, dass Sie lokal Änderungen an Dateien vorgenommen haben und dieselbe Datei mit denselben Änderungen im Git-Repository vorhanden ist. Vor dem Ziehen / Push benötigen Sie also lokale Änderungen:

So überschreiben Sie lokale Änderungen einer einzelnen Datei:

git reset file/to/overwrite
git checkout file/to/overwrite

So überschreiben Sie alle lokalen Änderungen (Änderungen in allen Dateien):

git stash
git pull
git stash pop

Dieses Problem kann auch daran liegen, dass Sie sich in einem Zweig befinden, der nicht mit dem Hauptzweig zusammengeführt wird.

BSB
quelle
5

git reset --hard && git clean -df

Achtung : Dadurch werden nicht verfolgte Dateien zurückgesetzt und gelöscht.

Yamen Ashraf
quelle
27
Man benutzt keine Axt, um die Fliege von der Stirn eines Freundes zu entfernen.
HonoredMule
3
Verwenden Sie dies NICHT, ohne zu wissen, dass einige Dateien gelöscht werden.
Andromeda
4

Sie können dies zum Überschreiben von Dateien verwenden

git checkout file_to_overwrite
Deepika Patel
quelle
4

Der beste Weg, um dieses Problem zu lösen, ist:

git checkout -- <path/file_name>

Danach können Sie die Datei überschreiben durch:

git pull origin master
AHM Forhadul Islam
quelle
Ich hatte das erwähnte Problem, weil ich den Index aktualisiert hatte, um anzunehmen, dass die Dateien unverändert waren. Es würde mich immer noch nicht ziehen lassen. Ich habe es git checkout -- path/*nur einmal benutzt und es hat mir erlaubt, den Pull danach auszuführen.
Stephen O'Flynn
4

Dies funktionierte für mich, um Änderungen auf dem Live-Remote-Server zu verwerfen und aus der Quellcodeverwaltung GitHub zu ziehen:

git reset --hard
git pull origin master
Gajen Sunthara
quelle
4

Hier ist meine Strategie, um das Problem zu lösen.

Problemstellung

Wir müssen Änderungen in mehr als 10 Dateien vornehmen. Wir haben es versucht PULL (git pull origin master), aber Git rief:

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

Wir haben versucht auszuführen commitund dann pull, aber sie haben auch nicht funktioniert.

Lösung

Wir waren tatsächlich in der schmutzigen Phase, weil sich die Dateien im "Staging Area", auch bekannt als "Index Area", und einige im "Head Area", auch bekannt als "Local Git Directory", befanden. Und wir wollten die Änderungen vom Server abrufen.

Überprüfen Sie diesen Link auf klare Weise auf Informationen zu verschiedenen Stufen von Git: GIT-Stufen

Wir haben die folgenden Schritte ausgeführt

  • git stash (Dies hat unser Arbeitsverzeichnis sauber gemacht. Ihre Änderungen werden von Git auf dem Stack gespeichert.)
  • git pull origin master (Ziehen Sie die Änderungen vom Server)
  • git stash apply (Alle Änderungen vom Stapel angewendet)
  • git commit -m 'message' (Änderungen übernommen)
  • git push origin master (Die Änderungen wurden auf den Server übertragen)
  • git stash drop (Lass den Stapel fallen)

Lassen Sie uns verstehen, wann und warum Sie etwas verstauen müssen

Wenn Sie sich im schmutzigen Zustand befinden, bedeutet dies, dass Sie Änderungen an Ihren Dateien vornehmen und dann aus irgendeinem Grund gezwungen sind, für eine sehr dringende Arbeit einen anderen Zweig zu ziehen oder zu wechseln , sodass Sie zu diesem Zeitpunkt nicht ziehen können oder Wechseln Sie, bis Sie Ihre Änderung festschreiben. Der stashBefehl ist hier als helfende Hand.

Aus dem Buch ProGIT , 2. Auflage:

Wenn Sie an einem Teil Ihres Projekts gearbeitet haben, sind die Dinge oft in einem chaotischen Zustand und Sie möchten die Zweige für ein bisschen wechseln, um an etwas anderem zu arbeiten. Das Problem ist, dass Sie keine halbfertige Arbeit ausführen möchten, nur um später auf diesen Punkt zurückzukommen. Die Antwort auf dieses Problem ist der Befehl git stash. Beim Verstecken wird der fehlerhafte Status Ihres Arbeitsverzeichnisses - dh Ihre geänderten nachverfolgten Dateien und bereitgestellten Änderungen - übernommen und auf einem Stapel nicht abgeschlossener Änderungen gespeichert, die Sie jederzeit erneut anwenden können.

STK
quelle
3

Wenn Sie bestimmte Änderungen überschreiben möchten, müssen Sie angeben, welche Sie vergessen möchten.

Sie können versuchen, die Änderungen, die Sie aufgeben möchten, selektiv zu speichern git stash --patchund diese dann mit zu löschen git stash drop. Sie können dann die Remote-Änderungen abrufen und wie gewohnt zusammenführen.

Will Vousden
quelle
3

TL; DR;

git pull --rebase --autostash
  -r, --rebase[=false|true|merges|preserve|interactive]
       When true, rebase the current branch on top of the upstream branch after
       fetching. If there is a remote-tracking branch corresponding to the upstream

  --autostash, --no-autostash
       Before starting rebase, stash local modifications away if
       needed, and apply the stash entry when done

Ich weiß nicht, warum dies noch nicht beantwortet wurde, aber die Lösung ist, wie Sie sehen können, einfach. Alle Antworten hier schlagen dasselbe vor: Um Ihre lokalen Änderungen zu löschen / zu speichern und Upstream anzuwenden, savewenden Sie (falls Sie ) Ihre lokalen Änderungen oben an.

Was git pull --rebase --autostashmacht Schritt für Schritt:

1. your local changes saved by `--autostash`
2. your local commits saved by `--rebase`
3. commits from upstream applied to your branch
4. your local commits are restored on top of upstream
5. your local changes are restored to working directory

Mein Fall (wahrscheinlich auch dein Fall):

Ich habe lokale Änderungen (Änderungen im Arbeitsverzeichnis):

Geben Sie hier die Bildbeschreibung ein

Wenn ich versuche, Remote-Änderungen abzurufen, wird folgende Fehlermeldung angezeigt:

Geben Sie hier die Bildbeschreibung ein

Diese Änderungen überschneiden sich nicht mit lokalen Änderungen:

Geben Sie hier die Bildbeschreibung ein

Also, wenn ich pull --rebase --autostashlokale Änderungen ohne Probleme automatisch gespeichert und angewendet habe

Geben Sie hier die Bildbeschreibung ein

Jetzt sind meine lokalen Änderungen etwas geringer: Geben Sie hier die Bildbeschreibung ein

Eugen Konkov
quelle
2

Ich hatte einen Sonderfall: Ich hatte eine Datei mit --assume-unverändert darauf. Es war schwer zu finden, da der git statusBefehl keine Änderungen zeigte


quelle
Ich habe das gleiche Problem. Haben Sie einen Weg gefunden, um das Problem zu umgehen? Ich nehme an, ich könnte entfernen und dann wieder hinzufügen - unverändert ... Ich habe diese Dateien nur manuell ausgecheckt, um unveränderte Versionen zu erhalten ... ich habe mich nur gefragt, ob es eine Möglichkeit gibt, das Auschecken / Wiederherstellen / Zusammenführen einfach zu überschreiben Sie.
David
1
Nein, ich musste die ganze Sache "unverändert annehmen" aufgeben.
2

Wenn Sie Produktionsänderungen auf dem Server beibehalten möchten, führen Sie sie einfach zu einem neuen Konfigurationselement zusammen. Die Verarbeitungsmethode ist wie folgt:

git stash
git pull
git stash pop

Möglicherweise führen Sie nicht alle Operationen aus. Sie können wissen, was Sie als nächstes tun können.

YanQing
quelle
Sie können dann den Git diff - w + Namen der Datei verwenden, um die automatische Zusammenführung des Codes zu bestätigen
YanQing
1

Ich habe eine Datei in meinem Repo ignoriert und git pull upstream masterdabei den folgenden Fehler erhalten:

Fehler: Ihre lokalen Änderungen an den folgenden Dateien werden durch Zusammenführen überschrieben: myfile.js Bitte übernehmen Sie Ihre Änderungen oder speichern Sie sie, bevor Sie sie zusammenführen können. Abbruch

Um das Problem zu beheben, habe ich Folgendes getan

git update-index --no-assume-unchanged myfile.js

Ich habe es dann getan git statusund diese Nachricht erhalten

Am Zweigstamm Ihr Zweig befindet sich mit 4 Commits hinter 'origin / master' und kann schnell vorgespult werden. (Verwenden Sie "git pull", um Ihren lokalen Zweig zu aktualisieren.)

Änderungen, die nicht für das Festschreiben bereitgestellt wurden: (Verwenden Sie "git add ...", um zu aktualisieren, was festgeschrieben wird.) (Verwenden Sie "git checkout - ...", um Änderungen im Arbeitsverzeichnis zu verwerfen.)

geändert: myfile.js

Keine Änderungen zum Festschreiben hinzugefügt (verwenden Sie "git add" und / oder "git commit -a")

Dann git checkout myfile.jsfolgte mir git pull upstream master. Diesmal war die Git-Pull-Operation erfolgreich.

Dmitry
quelle
1

Ich bin darauf gestoßen, als ich vom Meister gezogen habe.

So habe ich mit Visual Studio umgegangen;

  1. Zuerst habe ich ein Rückgängig-Commit für meine Lösung durchgeführt.
  2. Dann habe ich den Git-Pull-Prozess durchgeführt.

Hoffe das hilft!

AJ Macapaz
quelle
1

Die einfachste Lösung ist:

git reset --hard && git pull
Jackkobec
quelle
1

Ich bin neu in Git und nicht sicher, ob meine Lösung eine gute Idee ist.

Ich habe ALLE Antworten getestet und keine davon hat für mich funktioniert!

Aber ich habe eine andere Lösung gefunden:

1. Backup both of local and repository versions of the file.
2. Delete the file from repository.
3. git add .
4. git commit
5. git push

Hoffe das hilft.

Milad Safaei
quelle
1

Der Fehler "Ihre lokalen Änderungen an den folgenden Dateien würden durch Zusammenführen überschrieben" tritt auf, weil Sie einige Änderungen im lokalen Repo haben, die noch NICHT festgeschrieben wurden. Bevor Sie also vom Remote-Repo abrufen, übernehmen Sie einfach die Änderungen im lokalen Repo.

Nehmen wir an, Ihr Remote-Repo hat einen Zweig xyz und Sie möchten, dass dieser Remote-Repo-Zweig xyz in den lokalen Repo-Zweig xyz zusammengeführt (in diesen kopiert) wird.

{
git checkout xyz                  //check out to the respective branch in local repo
git commit -m "commiting message" //commit changes if any, in local repo branch xyz
git pull                          //it pulls remote xyz branch into local xyz branch
}
ASR
quelle
0

Wenn dieser Fehler auf Zeilenenden zurückzuführen ist,

git add
git checkout mybranch

wird funktionieren. Ich bin mir nicht sicher, warum es funktioniert.

user60561
quelle
0

Für Pycharm können Sie Git -> Zurücksetzen und dann ziehen.

Münchenong
quelle
0

Diese Meldung kann auch auftreten, wenn sie git-lfsverwendet wird und ein Dateizeiger von einer realen Datei überschrieben wurde.

dann benutzt du:

git stash
git lfs migrate import
git pull

volle Ausgabe von meinem Fall

λ git stash
Saved working directory and index state WIP on master: 5d4ad47 Merge branch 'feature/...' into 'master'
Encountered 1 file(s) that should have been pointers, but weren't:
        public/apple-touch-icon.png

λ git pull
Updating 5a4ad44..b25f79d
error: Your local changes to the following files would be overwritten by merge:
        public/apple-touch-icon.png
Please commit your changes or stash them before you merge.
Aborting

λ git lfs migrate import
migrate: Fetching remote refs: ..., done
migrate: Sorting commits: ..., done
migrate: Rewriting commits: 100% (0/0), done
migrate: Updating refs: ..., done
migrate: checkout: ..., done


λ git pull
Updating 5d4ad47..a25c79a
Fast-forward
 public/apple-touch-icon.png | Bin 2092 -> 130 bytes
 public/favicon.ico          | Bin 6518 -> 1150 bytes
 2 files changed, 0 insertions(+), 0 deletions(-)

Siehe https://github.com/git-lfs/git-lfs/issues/2839

c33s
quelle
0

Ich habe es versucht und es erfolgreich, bevor Sie ziehen, lassen Sie alle Dateien festschreiben, die Sie nicht festgeschrieben haben, dann werden Sie diese Nachrichten nicht von AS erhalten.

Ta Quang Tu
quelle