Git: Lokale Änderungen können nicht rückgängig gemacht werden (Fehler: Pfad… ist nicht zusammengeführt)


335

Ich habe folgenden Arbeitsbaumzustand

$ git status foo/bar.txt
# On branch master
# Unmerged paths:
#   (use "git reset HEAD <file>..." to unstage)
#   (use "git add/rm <file>..." as appropriate to mark resolution)
#
#       deleted by us:      foo/bar.txt
#
no changes added to commit (use "git add" and/or "git commit -a")

Die Datei foo/bar.txtist da und ich möchte sie wieder in den "unveränderten Zustand" bringen (ähnlich wie bei 'svn revert'):

$ git checkout HEAD foo/bar.txt
error: path 'foo/bar.txt' is unmerged
$ git reset HEAD foo/bar.txt
Unstaged changes after reset:
M       foo/bar.txt

Jetzt wird es verwirrend:

$ git status foo/bar.txt
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       new file:   foo/bar.txt
#
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#       modified:   foo/bar.txt
#

Dieselbe Datei in beiden Abschnitten, neu und geändert? Was sollte ich tun?


7
Ich wünschte, jemand könnte erklären, wie wir in diese Situation geraten, warum es passiert und warum die Lösung funktioniert.
Marcos Dione

1
Ich bin in diese Situation geraten, als ich meinen Vorrat nach einer Rebase, die mich in einen Zusammenführungskonflikt brachte (Stash Pop führt einen Zusammenschluss durch), aufgeschnappt habe Änderungen waren noch da .... um diese zu entfernen..Ich habe erneut versucht, die Datei auszuchecken..das war, als ich den obigen Fehler sah.
Arindam Roychowdhury

Antworten:


553

Du hast es falsch gemacht. Sie sollten zuerst zurücksetzen, die Datei entfernen und dann auschecken, um lokale Änderungen rückgängig zu machen.

Versuche dies:

$ git reset foo/bar.txt
$ git checkout foo/bar.txt

Vielen Dank; Lief wie am Schnürchen! Ich musste mich verpflichten ( nicht mit dem -a arg, die relevanten Änderungen wurden bereits inszeniert) und dann konnte ich wie gewohnt schieben / ziehen.
Patrick

18
Für mich war Folgendes erforderlich: <br/> $ git reset - foo / bar.txt <br/> $ git checkout - foo / bar.txt <br/> (Beachten Sie das zusätzliche "-" dazwischen)
Jan

4
Die gute Syntax ist "Git zurücksetzen HEAD Datei1 Datei2 ..." dann "Git Checkout - Datei1 Datei2 ..."
Thomas Decaux

1
Es ist immer amüsant, wenn die Antwort mit der höchsten Stimme im Grunde nur "Du machst es falsch" sagt :)
nathanchere

4
Eine Erklärung (was die Dinge tun) wäre großartig gewesen ...
Kissaki

51

Das hat bei mir perfekt funktioniert:

$ git reset -- foo/bar.txt
$ git checkout foo/bar.txt

14
git checkout origin/[branch] .
git status

// Punkt (.) Am Ende notieren. Und alles wird gut


-2
git checkout foo/bar.txt

hast du das versucht (ohne HEAD-Schlüsselwort)

Normalerweise mache ich meine Änderungen auf diese Weise rückgängig.


1
Typischer Fehler beim Versuch eines checkoutmitten in einer Zusammenführung: $ git co path/to/file= result => error: path 'path/to/file' is unmerged => Führen Sie also zuerst: aus $ git reset path/to/file, und dann git checkout path/to/filesollte das funktionieren.
Michael

2
Wenn Sie HEAD nicht angeben, wird das Auschecken von Git aus dem Index ausgeführt. Dies ist eine schwächere Operation (die Inhaltsquelle ist der Index und nicht HEAD). Außerdem denke ich, dass das in diesem Fall überhaupt keinen Unterschied macht - mit dem spezifischen Problem, das die Frage stellte. Hast du das versucht?
Kissaki

-4

Ich finde Git Stash sehr nützlich für die zeitliche Behandlung aller "schmutzigen" Zustände.


4
Wenn Sie es nützlich finden, geben Sie bitte eine Erklärung, wie es in diesem konkreten Fall helfen würde. Wie würden Sie es hier verwenden?
Kissaki
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.