2013-04-17 4 views
67

Ich muss die in einem Zweig eingeführten Änderungen auf einen anderen Zweig anwenden. Ich kann Cherry Pick verwenden, um das zu tun. In meinem Fall möchte ich jedoch Änderungen anwenden, die nur für eine Datei relevant sind, ich muss nicht ganze Commits auswählen. Wie geht das?Wie man nur Änderungen für nur eine Datei auswählt, nicht das ganze Commit

+4

möglich Duplikat kopiert werden [Wie git-cherry-pick ändert sich nur bestimmte Dateien?] (Http: //stackoverflow.com/questions/5717026/how-to-git-cherry-pick-only-changes-to-certain-files) – Potherca

Antwort

95

Sie haben verschiedene Möglichkeiten auf, was Sie erreichen wollen:

Wenn der Inhalt der Datei dem Zielzweig entsprechen soll, können Sie git checkout <branch> -- <filename> verwenden. Dies wird jedoch die Änderungen, die bei einem einzelnen Commit passiert sind, nicht "herauspicken", sondern nur den resultierenden Zustand der Datei nehmen. Wenn Sie also eine Zeile in einen Commit eingefügt haben, aber vorherige Commits mehr geändert haben und Sie nur diese Zeile ohne diese anderen Änderungen hinzufügen möchten, ist ein Checkout nicht das, was Sie wollen.

Wenn Sie den Patch, der in einer Festschreibung eingeführt wurde, nur auf eine einzelne Datei anwenden möchten, haben Sie mehrere Optionen. Sie könnten git cherry-pick -n ausführen, d. H. Ohne es zu committen, bearbeiten Sie das Commit (z. B. setzen Sie alle Dateien mit git reset -- . zurück und fügen Sie nur die Datei hinzu, die Sie tatsächlich ändern möchten, indem Sie git add <filename> verwenden). Oder Sie könnten das Diff für die Datei erstellen und das diff gilt dann:

git diff <branch>^..<branch> -- <filename> | git apply 
9

Eine weitere praktische Sache zu tun ist, den Patch lokal und dann verwenden:

git checkout {<name_of_branch>, commit's SHA} <path to the file> 

Das ist keine Rosinenpickerei though.

+2

Warnung: Wie @poke in seiner Antwort sagt, werden die Änderungen nicht kopiert; Es kopiert den gesamten Status der Datei. Wenn Sie also die Änderungen eines Commits an die Datei anhängen wollen, dann enden Sie, indem Sie so auschecken, alle neueren Änderungen überschreiben, was nicht gut ist. –

1

Dies ist, was Sie suchen,:

git checkout target-branch sha1 path/to/file 

SHA1 ist optional

+7

nein, "pick * changes * in commit" ist nicht "pick whole file" – Abyx

11

ein patch file erstellen und anwenden.

git diff branchname -- filename > patchfile 
git apply patchfile 

EDIT:

Da müssen Sie die Änderungen von einem Commit, erstellen Sie den Patch so nehmen:

git show sha1 -- filename > patchfile 
+1

'git diff sha1' (oder' git diff branch' - es ist das gleiche, wenn die Verzweigung auf den gleichen Hash zeigt) wird nur ein diff von erzeugen das aktuelle Arbeitsverzeichnis in Bezug auf diesen Hash, aber nicht was einen selbst eingeführten Commit ändert. – poke

+0

Korrigieren. Bearbeitete die Antwort. Vielen Dank. – Sailesh

+1

-1 'git checkout' mit einem Dateinamen ist der richtige Hammer für diesen Nagel. Beide Optionen sind unnötig komplex. –

3

Git hat alles fertig :)

Verwenden Sie einfach git checkout <sha> <path-to-file>

+0

Das ist kein Cherry-Pick - der die Datei komplett auscheckt. Das Ziel ist eine bestimmte Änderung von einem Commit. Oft sind das die gleichen Dinge, aber manchmal nicht. – AndrewF

-6
git reset HEAD~1 

die Dateien in prä- bewegt Festschreibung Stufe

git stash 

entfernt aus dem Speicher

Jetzt ist Ihr Zweig ziemlich sauber ist (zurück zur vorherigen Festschreibung)

+2

Hat überhaupt nichts damit zu tun, dass Kirschen eine einzelne Datei auswählt. –

2

Die top-rated Antwort heißt es, dass git checkout <branch> -- <filename>. Dieser Ansatz funktioniert jedoch nur, wenn die Datei im aktuellen Zweig vorhanden ist.

+0

Das ist wahr. Erstellen Sie zuerst eine leere Datei, z. 'touch filename' – Fookiee

+0

Sie können jetzt kommentieren Sie haben 50 Punkte ... –

1

Was neige ich zu tun ist, git ls-tree

nur zu verwenden, tun:

git ls-tree -r <commit-id> |grep 'your filename' 
# there will be output that shows a SHA1 of your file 
git show ${SHA1 of your file} > 'your filename' 

Dadurch werden alle Dateinamen drucken Sie Ihre grep passende und gibt SHA1 Schlüssel der Dateien in der Commit.

Git Show kann auch auf Dateien außerhalb Ihrer Branche verwendet werden. Verwenden Sie > von Ihrer Shell, um die Ausgabe in eine Datei zu leiten, gibt Ihnen das Ergebnis, das Sie suchen.

1
git checkout the_branch_with_the_change the/path/to/the/file/you/want.extension 

dies funktioniert, wenn Sie eine einzelne Datei aus einem anderen Zweig wollen auf den aktuellen Arbeitszweig

+1

Seien Sie vorsichtig, Änderungen in der Datei, die nicht in der Version aus dem anderen Zweig sind, gehen verloren. –

+0

stimmte damit überein. Dies ist nützlich, wenn Sie nur eine Kopie der Datei benötigen und diese im aktuellen Zweig ändern möchten. –

+1

Man kann Globs (Pfad/*) verwenden und mehr als einen Pfad/Datei angeben – Todd

Verwandte Themen