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?

mklhmnn
quelle
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
Igor Zevaka
quelle
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
Steffi
quelle
14
git checkout origin/[branch] .
git status

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

Joe Hyde
quelle
-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.

zed_0xff
quelle
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.

Takeshin
quelle
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