Erzwingen Sie, dass Git Stash hinzugefügte Dateien überschreibt

223

Ich habe einige Dateien, die in Git nicht verfolgt wurden. Ich nahm einige Änderungen vor und wollte sie festschreiben, stellte jedoch fest, dass ich vergessen hatte, zuerst die unveränderten Dateien einzuchecken. Also habe ich die Dateien verstaut und dann die unveränderten Versionen hinzugefügt.

Wenn ich dann den Stash auf das Repository anwende, treten Konflikte auf, weil die Dateien bereits hinzugefügt wurden.

Wie kann ich den Stash anwenden und die Verwendung der Versionen im Stash anstelle der Originale im Repository erzwingen?

Vielen Dank

Stefan
quelle
7
Hässliche Lösung, bis jemand eine bessere findet: Entfernen Sie die neuen Dateien mit, git rmbevor Sie dies tun git stash apply.
Tom
Wird das nicht die Geschichte verlieren? Der Grund für das Hinzufügen der unveränderten Versionen bestand darin, den Verlauf beizubehalten.
Stefan
1
Nein, es wird die Geschichte nicht verlieren. Wenn Sie eine Datei entfernen, sie mit einer kleinen Änderung wieder hinzufügen und dann festschreiben, gitwird sie nur als kleine Änderung behandelt.
Tom

Antworten:

365

Verwenden Sie git checkoutanstelle von git stash apply:

$ git checkout stash -- .
$ git commit

Dadurch werden alle Dateien im aktuellen Verzeichnis auf ihre versteckte Version zurückgesetzt.


Wenn Änderungen an anderen Dateien im Arbeitsverzeichnis vorgenommen werden sollten, ist hier eine weniger umständliche Alternative:

$ git merge --squash --strategy-option=theirs stash

Wenn sich der Index ändert oder die Zusammenführung Dateien mit lokalen Änderungen berührt, lehnt git die Zusammenführung ab. Einzelne Dateien können mit aus dem Vorrat ausgecheckt werden

$ git checkout stash -- <paths...>

oder interaktiv mit

$ git checkout -p stash
Tom
quelle
Keines davon hat in meinem Anwendungsfall funktioniert. Die Ergebnisse und meine Lösung finden Sie hier stackoverflow.com/a/26685296/496046 - dies sollte auch Ihre Situation lösen, @AlexanderBird
tremby
2
git checkout stash -- .Dieser Befehl hat buchstäblich nichts getan, als ich ihn ausgeführt habe.
Rotsiser Mho
3
@RotsiserMho Git ist nicht sehr gut darin, Bestätigungsnachrichten bereitzustellen. Bist du sicher, dass es nichts getan hat? Hat gut für mich funktioniert.
Sinjai
5
Ich musste git checkout stash -- .im höchsten übergeordneten Ordner ausgeführt werden, der meine Änderungen enthielt, andernfalls wurden nur Änderungen auf den Ordner angewendet, von dem aus ich den Befehl ausgeführt habe.
Leo
1
@Leo: Richtig, das liegt daran, dass .das aktuelle Verzeichnis angegeben wird (Sie können es durch einen anderen Pfad ersetzen, anstatt das Verzeichnis zu wechseln). Ich habe meine Antwort aktualisiert, um dies klarer zu machen.
Tom
13

git stash show -p | git apply

und dann, git stash dropwenn Sie die verstauten Gegenstände fallen lassen möchten.

Hasan TBT
quelle
2
Hinweis: Sie sollten sich im Stammverzeichnis des Repositorys befinden, damit dies ordnungsgemäß funktioniert. Andernfalls wird dies angezeigt .
Ruslan
@PengheGeng Wie Sie sehen können, antwortete ich ungefähr ein Jahr vor NetEmmanuel
Hasan TBT
@ Ruslan Ich bekomme das, während ich in der Wurzel meines Repos bin
Leo
6

Um git stash popdiesen Befehl zu erzwingen, führen Sie ihn aus

git stash show -p | git apply && git stash drop
NetEmmanuel
quelle
1

TL; DR:

git checkout HEAD path/to/file
git stash apply

Lange Version:

Sie erhalten diesen Fehler aufgrund der nicht festgeschriebenen Änderungen, die Sie überschreiben möchten. Machen Sie diese Änderungen mit rückgängig git checkout HEAD. Sie können Änderungen an einer bestimmten Datei mit rückgängig machen git checkout HEAD path/to/file. Nachdem Sie die Ursache des Konflikts beseitigt haben, können Sie sich wie gewohnt bewerben.

User12547645
quelle