Ich muss Änderungen, die in einem Zweig eingeführt wurden, 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 das gesamte Commit auswählen. Wie geht das?
108
Antworten:
Sie haben verschiedene Möglichkeiten, je nachdem, was Sie erreichen möchten:
Wenn Sie möchten, dass der Inhalt der Datei mit dem des Zielzweigs übereinstimmt, können Sie ihn verwenden
git checkout <branch> -- <filename>
. Dies wird jedoch nicht die Änderungen "auswählen", die in einem einzelnen Commit vorgenommen wurden, sondern nur den resultierenden Status dieser Datei annehmen. Wenn Sie also eine Zeile in einem Commit hinzugefügt haben, die vorherigen Commits jedoch mehr geändert wurden und Sie diese Zeile nur ohne diese anderen Änderungen hinzufügen möchten, ist eine Kaufabwicklung nicht das, was Sie möchten.Andernfalls haben Sie mehrere Optionen, wenn Sie den in einem Commit eingeführten Patch nur auf eine einzelne Datei anwenden möchten. Sie können
git cherry-pick -n
das Commit ausführen , dh ohne es festzuschreiben, bearbeiten (z. B. alle Dateien mit zurücksetzengit reset -- .
und nur die Datei hinzufügen, die Sie tatsächlich mit ändern möchtengit add <filename>
). Oder Sie können das Diff für die Datei erstellen und das Diff dann anwenden:quelle
Erstellen Sie ein
patch file
und wenden Sie es an.BEARBEITEN:
Da Sie die Änderungen aus einem Commit übernehmen müssen, erstellen Sie den Patch wie folgt:
quelle
git diff sha1
(odergit diff branch
- es ist dasselbe, wenn der Zweig auf denselben Hash verweist) erzeugt nur einen Unterschied des aktuellen Arbeitsverzeichnisses in Bezug auf diesen Hash, nicht jedoch, was ein selbst eingeführtes Commit ändert.git checkout
mit einem Dateinamen ist der richtige Hammer für diesen Nagel. Beide Optionen sind unnötig komplex.checkout
funktioniert dies im Allgemeinen nicht, da dies möglicherweise andere unerwünschte vorherige Änderungen beinhaltet und möglicherweise keine Änderungen enthält, die im aktuellen Zweig vorgenommen wurden.Eine weitere praktische Möglichkeit besteht darin, den Patch lokal abzurufen und dann zu verwenden:
Das ist aber keine Kirschernte.
quelle
Git hat alles fertig :)
Benutz einfach
git checkout <sha> <path-to-file>
quelle
Dies funktioniert, wenn eine einzelne Datei aus einem anderen Zweig in den aktuellen Arbeitszweig kopiert werden soll
quelle
Das suchen Sie:
sha1 ist optional
quelle
Was ich dazu neige, ist zu benutzen
git ls-tree
mach einfach:
Dadurch werden alle Dateinamen gedruckt, die Ihrem grep entsprechen, und es werden SHA1-Schlüssel der Dateien im Commit angegeben.
Git Show kann auch für Dateien außerhalb Ihres Zweigs verwendet werden. Wenn
>
Sie die Ausgabe von Ihrer Shell aus in eine Datei leiten, erhalten Sie das gewünschte Ergebnis.quelle
Sie können dies versuchen:
Beispielsweise:
quelle
Verschiebt die Dateien in die Pre-Commit-Phase
wird aus dem Speicher entfernt
Jetzt ist Ihre Filiale ziemlich sauber (zurück zum vorherigen Commit)
quelle