2009-04-21 5 views
78

Gibt es einen Befehl, mit dem Sie die Änderungen an einer Datei (oder Dateien) im Arbeitsverzeichnis teilweise rückgängig machen können?Änderungen an einer Datei in Git selektiv zurücksetzen oder auschecken?

Angenommen, Sie haben eine Datei sehr oft bearbeitet, aber Sie wissen, dass Sie einige der Änderungen wieder in den Committed-Zustand zurückversetzen möchten, nicht aber die anderen Änderungen.

Ich stelle mir eine Option für git checkout, die viel wie git add -p funktioniert, d.h. es geht durch die Datei Stück für Stück und fragt, ob Sie es behalten wollen oder nicht.

Antwort

74

könnten Sie verwenden

git add -p <path> 

die Stücke auf die Bühne, die Sie in einer bestimmten Datei behalten möchten, dann

git checkout -- <path> 

die Arbeits Baum Änderungen zu verwerfen, die Sie wollen nicht halten , indem Sie die gestaffelte Version der Datei auschecken.

Schließlich können Sie

git reset -- <path> 

verwenden, um die inszenierte Version der Datei auf die letzte festgeschriebene Version der Datei zurückkehren Sie zu verlassen mit Ihren Änderungen unstaged.

+0

Ich denke, das ist, was ich suche danke –

+0

Für diesen einfachen Anwendungsfall, den jedes andere Versionskontrollsystem nur "Zurück" nennt, warum ist der Git-Befehl so obskur? –

+5

@Jan Können andere Versionskontrollsysteme mit dem Befehl 'revert' auswählen, welche Änderungen innerhalb einer Datei rückgängig gemacht werden?Echt fragen, da ich nur Erfahrung mit CVS und Git habe. In Git ist 'git checkout - path/to/file' ein einzelner Befehl, der alle Änderungen in dieser Datei zurücksetzt, aber das ist nicht dasselbe wie oben. – spacemanaki

8

git checkout $file kehrt den Status der Datei $file in den letzten festgeschriebenen Status zurück. Ich denke, dass Sie git checkout SHA-1 -- $file verwenden können, um die Datei auf das Festschreiben zurückzusetzen, das von SHA-1 identifiziert wird.

+1

ja, nicht genau das, was ich will, da ich einige der Änderungen behalten möchte, die ich in der Datei gemacht habe und die anderen –

1

Wie viele Commits benötigen Sie, um zurückzugehen und auszuwählen? Wenn es nur eine ist, nehmen Sie vielleicht eine Verzweigung direkt davor, checken Sie die Datei, die Sie festgelegt haben, und verwenden Sie dann git add -p, um es hinzuzufügen, wie Sie es wollten. Dann können Sie zurückgehen, wo Sie waren, und die Datei aus Ihrem temporären Zweig auschecken.

das ist:

git checkout -b temp troublesome-commit^ 
git checkout troublesome-commit -- path/to/file 
git add -p path/to/file 
git commit -c troublesome-commit 
git checkout @{-1} 
git checkout temp -- path/to/file 
git commit path/to/file 
git branch -D temp 

Andere Alternativen beinhalten zurück und Bearbeitung der mit git rebase -i commit (Kennzeichnung der als edit begehen, dann eine git reset HEAD^ tun und redoing die begehen, wenn wieder in die Schale fallen gelassen).

Wenn die Änderungen, aus denen Sie auswählen müssen, über eine Reihe von Commits verteilt sind, ist es möglicherweise besser, sie als Patches (oder einen Patch für alle) zu extrahieren und den Patch manuell zu bearbeiten wollen behalten und den Rest in git apply --reverse einspeisen.

+0

zurückverwandeln möchte ich eigentlich nichts, das begangen wird, möchte ich Änderungen rückgängig machen sind nur in meiner Arbeitskopie –

99

Mit git Version> = 1.7.1 Ich kann

git checkout -p 

Ich bin nicht sicher, wenn diese Funktion eingeführt wurde.

+8

Es ist erwähnenswert, dass Sie auch 'git reset -p' verwenden können, um Änderungen selektiv vom Staging-Bereich/Index zu entfernen. Ich weiß auch nicht von Anfang an, in welcher Git-Version das eingeführt wurde. –

+0

Dies ist die richtige Antwort, warum sie nicht akzeptiert wird. – wukong

+0

@wukong, weil diese Antwort 2 Jahre nach der Frage veröffentlicht wurde. In diesem Moment (2009) war Charles 'Antwort die beste Lösung – pomeh

Verwandte Themen