Wie würde ich eine einzelne Datei (oder Änderungen an einer Datei) von einem git stash extrahieren?

StackOverflow https://stackoverflow.com/questions/1105253

  •  12-09-2019
  •  | 
  •  

Frage

Ich würde gerne wissen, ob es möglich ist, eine einzelne Datei oder diff einer Datei von einem git stash zu extrahieren, ohne das Versteck changeset weg zu knallen.

Könnte jemand in der Lage sein, einige Vorschläge / Ideen dazu bieten?

War es hilfreich?

Lösung

Auf dem git manpage bunkern Sie (in der „Diskussion“ Abschnitt, kurz nach „Optionen“ Beschreibung) lesen kann, dass:

  

ein Versteck ist als Commit, dargestellt, deren Baum zeichnet den Zustand des    Verzeichnis zu arbeiten, und sein erster Elternteil bei HEAD die Commit, wenn die    Stash erstellt wurde.

Sie können also versteck behandeln (zum Beispiel stash@{0} ist erste / oberste Stash) als eine Zusammenführung verpflichten, und die Verwendung:

$ git diff stash@{0}^1 stash@{0} -- <filename>

Erläuterung: stash@{0}^1 bedeutet die erste Mutter des gegebenen Stash, die wie oben in der Erklärung angegeben ist, an dem begehen Änderungen gebunkert wurden. Wir verwenden diese Form von „git diff“ (mit zwei Commits), weil stash@{0} / refs/stash eine Zusammenführung verpflichten, und wir haben git zu sagen, die Eltern wir gegen diff wollen. Mehr kryptisch:

$ git diff stash@{0}^! -- <filename>

sollte funktionieren auch (siehe git rev-parsen Manpage Erklärung von rev^! Syntax, im Abschnitt "Bereiche angeben").

Ebenso können Sie verwenden git checkout eine einzelne Datei zu prüfen, aus dem Versteck :

$ git checkout stash@{0} -- <filename>

oder unter einem anderen Dateinamen zu speichern:

$ git show stash@{0}:<full filename>  >  <newfile>

oder

$ git show stash@{0}:./<relative filename> > <newfile>

. ( Hinweis , das hier vollständiger Pfad einer Datei relativ zum Hauptverzeichnis eines Projektes (man denkt: in Bezug auf stash@{0}))


Sie müssen möglicherweise stash@{0} von Shell Expansion schützen, das heißt Verwendung "stash@{0}" oder 'stash@{0}'.

Andere Tipps

Wenn Sie git stash apply statt git stash pop verwenden, wird es das Versteck zu Ihrem Arbeits Baum gilt aber nach wie vor das Versteck halten.

Mit dies getan, können Sie add / commit die Datei, die Sie wollen, und dann die restlichen Änderungen zurückgesetzt.

Kurze Antwort

Um die gesamte Datei zu sehen: git show stash@{0}:<filename>

Um zu sehen, die diff: git diff stash@{0}^1 stash@{0} -- <filename>

Es gibt eine einfache Möglichkeit, Änderungen von jeder Filiale zu erhalten, einschließlich stashes:

$ git checkout --patch stash@{0} path/to/file

Sie können die Dateispezifikation weglassen, wenn Sie viele Teile patchen in möchten. Oder auslassen Patch (aber der Weg nicht), um alle Änderungen in einer einzigen Datei zu erhalten. Ersetzen 0 mit der Stash Zahl von git stash list, wenn Sie mehr als eine haben. Beachten Sie, dass dies wie diff ist, und bietet anzuwenden alle Unterschiede zwischen den Zweigen. Um Veränderungen von nur einem einzigen Commit / versteck, haben einen Blick auf git cherry-pick --no-commit.

$ git checkout stash@{0} -- <filename>

Weitere Informationen:

  1. Stellen Sie sicher, setzen Raum nach dem "-" und der Dateiname Parameter

  2. Ersetzen Null (0) mit Ihrer spezifischen Stash-Nummer. Um Stash Liste verwenden:

    git stash list
    

Basierend auf Jakub Narębski Antwort - Kürzere Version

Sie können die diff für ein Versteck mit „git show stash@{0}“ bekommen (oder was auch immer die Zahl des Vorrats ist, siehe „git stash list“). Es ist einfach, den Abschnitt des diff für eine einzelne Datei zu extrahieren.

Das einfachste Konzept zu verstehen, obwohl es vielleicht nicht die beste, ist Sie haben drei Dateien geändert und Sie möchten eine Datei beiseite zu schaffen.

Wenn Sie git stash sie alle beiseite zu schaffen, git stash apply sie wieder zurück zu bringen und dann auf die betreffende Datei git checkout f.c, um es effektiv zurückgesetzt.

Wenn Sie die Datei laufen unstash wollen eine git reset --hard tun und laufen dann git stash apply wieder, unter Ausnutzung OFTHE Tatsache, dass git stash apply klar nicht die diff aus dem Stash-Stack.

Wenn die verstaute Dateien müssen mit der aktuellen Version fusionieren, um die bisherigen Möglichkeiten nutzen diff verwenden. Ansonsten könnten Sie git pop für unstashing sie verwenden, git add fileWantToKeep Ihre Datei für die Inszenierung und ein git stash save --keep-index tun, für stashing alles außer dem, was auf der Bühne ist. Denken Sie daran, dass der Unterschied diese Art und Weise mit den vorherigen ist, dass es „knallt“, um die Datei von Stash. Die bisherigen Antworten halten es git checkout stash@{0} -- <filename> so geht es nach Ihren Bedürfnissen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top