Ich mache etwas sehr einfaches falsch. Ich versuche, eine normale Patch-Datei vorzubereiten, damit ich einige Änderungen erneut anwenden kann:
$ git diff > before
$ git diff something_here > save.patch
$ git checkout .
$ patch < save.patch
$ git diff > after
$ diff before after
$
Mit something_here
leer funktioniert es fast, aber die Dateinamen sind nicht richtig. Ich glaube, ich vermisse nur eine Option.
Im wirklichen Leben werde ich nach dem Auschecken eine Zusammenführung durchführen, sodass der Patch dort möglicherweise fehlschlägt, aber Sie sehen, worauf ich hinaus will.
Bearbeiten Sie
meine Schuld hier, weil Sie die falsche Frage gestellt haben. Die eigentliche Frage lautet: Ich möchte meine Änderungen speichern, zusammenführen und die Änderungen nach Möglichkeit erneut anwenden. Ich habe es falsch gefragt, weil ich es gewohnt bin , Patches zur Lösung dieser Art von Problemen zu verwenden, und es git diff
sah so aus, als wollte ich das tun.
Charles Baileys Kommentar hatte die richtige Antwort. Für mich ist Git-Apply das Richtige (Git-Stash sieht schwerer aus als ich brauche und Rebasing und Bundles liegen definitiv über meinem derzeitigen Kenntnisstand.) Ich werde die Antwort akzeptieren, die Charles gegeben hat (weil Sie kann keinen Kommentar annehmen). Vielen Dank für alle Vorschläge.
Bearbeiten, 6 Jahre später
Wie jeder weiß, der mit dem Thema vertraut ist, habe ich die Schwierigkeit von überschätzt git stash
. Fast jeden Tag oder so werde ich die folgende Sequenz verwenden:
$ git stash
$ git merge
$ git stash pop
patch
anstattgit apply
?git stash
oder andere Git-Tools?git stash
nach die einfachste Lösung für das, was Sie versuchen, aber es gibt viele Ansätze, die funktionieren.git-svn
.Antworten:
Wenn Sie Patch verwenden möchten, müssen Sie die
a/
b/
Präfixe entfernen, die git standardmäßig verwendet. Sie können dies mit der--no-prefix
Option tun (Sie können dies auch mit der Option des Patches tun-p
):Normalerweise ist es jedoch einfacher, Straight zu verwenden
git diff
und dann den Ausgang zum Einspeisen zu verwendengit apply
.Die meiste Zeit versuche ich, die Verwendung von Textpatches zu vermeiden. In der Regel sind ein oder mehrere temporäre Commits in Kombination mit Rebase
git stash
und Bundles einfacher zu verwalten.Für Ihren Anwendungsfall halte ich das
stash
für am besten geeignet.quelle
git diff --no-prefix master > diff.patch
und danngit checkout master
patch -p0 < diff.patch
patch --dry-run < diff.patch
vor der Ausgabe des letzten Befehls zu verwenden.patch
außerhalb von git (möglicherweise unter Verwendung einer von generierten Patch-Dateidiff
) in einem allgemeineren Anwendungsfall verwenden möchten .Einfach verwenden
-p1
: Sie müssen-p0
in dem--no-prefix
Fall sowieso verwenden, so können Sie einfach das weglassen--no-prefix
und verwenden-p1
:quelle
git diff
gibt eine Zeile aus, diepatch
ignoriert wird.git apply
ist der Weg zu gehen.Den Git-Diffs ist den Dateipfaden ein zusätzliches Pfadsegment vorangestellt. Sie können diesen Eintrag im Pfad entfernen, indem Sie -p1 mit Patch wie folgt angeben:
quelle
save.patch
Datei an einen beliebigen Ort transportieren (einschließlich Binärdateien).git apply <file>
quelle
git diff > save.patch
undgit checkout .
anstelle eines Resets verwenden, aber ja ...git apply
, der den Diff für Ihren Status und den Zeiger auf das letzte verfügbare Commit verwendet oder relevant macht. Tun hat einfachgit diff
überhaupt nichts getangit apply
. Die Sache mitgit diff
ist (glaube ich) von der Verwendunggit reset
- die Beziehungen zwischen dem Repo, dem Index und dem Arbeitsbereich sind das Problem.Ein nützlicher Trick, um das Erstellen temporärer Patch-Dateien zu vermeiden:
quelle
git stash show -p stash@{3} | patch -p1 -d [dst-dir]