Frage

Ich habe einen kleinen Patch in meinem git stash gerettet weg. Ich habe es auf meine Arbeitskopie mit git stash apply angewendet. Nun würde Ich mag diese Änderungen rückgängig zu machen durch reverse Anwendung des Patches (Art wie das, was git revert tun würde, sondern gegen den Stash).

Wer weiß, wie dies zu tun?

Zur Verdeutlichung: Es gibt noch andere Veränderungen in meiner Arbeitskopie. Mein Fall ist schwer zu beschreiben, aber man kann einige Debug oder experimentellen Code vorstellen, die im Stash ist. Jetzt ist es in meiner Arbeitskopie mit einigen anderen Änderungen gemischt und ich mag die Wirkung mit und ohne die Änderungen aus dem Versteck sehen.

Es ist nicht wie Stash sieht dies unterstützt derzeit, aber ein git stash apply --reverse wäre eine schöne Sache sein.

War es hilfreich?

Lösung

Nach dem git-Stash manpage „, ein Versteck ist als dargestellt begehen dessen Baum zeichnet den Zustand des Arbeitsverzeichnisses, und sein erster Elternteil ist die in HEAD begehen, wenn der Vorrat geschaffen wurde „und git stash show -p gibt uns“ die im Stash aufgezeichneten Änderungen als diff zwischen dem verstaute Zustand und seiner ursprünglichen Mutter.

Um die anderen Änderungen intakt zu halten, verwenden git stash show -p | patch --reverse wie im folgenden Beispiel:

$ git init
Initialized empty Git repository in /tmp/repo/.git/

$ echo Hello, world >messages

$ git add messages

$ git commit -am 'Initial commit'
[master (root-commit)]: created 1ff2478: "Initial commit"
 1 files changed, 1 insertions(+), 0 deletions(-)
 create mode 100644 messages

$ echo Hello again >>messages

$ git stash

$ git status
# On branch master
nothing to commit (working directory clean)

$ git stash apply
# On branch master
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#       modified:   messages
#
no changes added to commit (use "git add" and/or "git commit -a")

$ echo Howdy all >>messages

$ git diff
diff --git a/messages b/messages
index a5c1966..eade523 100644
--- a/messages
+++ b/messages
@@ -1 +1,3 @@
 Hello, world
+Hello again
+Howdy all

$ git stash show -p | patch --reverse
patching file messages
Hunk #1 succeeded at 1 with fuzz 1.

$ git diff
diff --git a/messages b/messages
index a5c1966..364fc91 100644
--- a/messages
+++ b/messages
@@ -1 +1,2 @@
 Hello, world
+Howdy all

Edit:

Eine leichte Verbesserung ist dies git apply anstelle von Patch zu verwenden:

git stash show -p | git apply --reverse

Alternativ können Sie auch git apply -R als Abkürzung verwenden, um git apply --reverse.

Ich habe das schon zu finden, wirklich praktisch in letzter Zeit ...

Andere Tipps

git stash [save] nimmt das Arbeitsverzeichnis Zustand und Zeigezustand und stashes sie weg, Version Einstellung Index und Arbeitsbereich HEAD.

git stash apply bringt diese Änderungen zurück, so sie git reset --hard würde wieder entfernen.

git stash pop bringt diese Änderungen zurück und ändert oben verstaute Entfernt, so git stash [save] zurückkehrt zum vorherigen (pre-pop) Zustand in diesem Fall.

git checkout -f

wird entfernen Sie alle Änderungen nicht begehen.

Direkt Schnitt n Paste aus dem git Mann Es ist klar formuliert und schließt sogar einen Aliasnamen;

Un-Anwendung eines Stash In einigen Anwendungsszenarien könnten Sie verstaute Änderungen zu übernehmen, einige Arbeit zu tun, aber diese Änderungen dann un-Anwendung, die ursprünglich aus dem Versteck kam. Git bietet keine solche einen Vorrat Unapply Befehl, aber es ist möglich, den Effekt zu erzielen, indem Sie einfach den Patch mit einem Stash zugeordnet abgerufen und in umgekehrter Anwendung:

$ git stash show -p stash@{0} | git apply -R

Auch wenn Sie nicht über einen Vorrat angeben, nimmt Git die jüngste Stash:

$ git stash show -p | git apply -R

Sie möchten einen Aliasnamen erstellen und effektiv ein Versteck-Unapply Befehl Git hinzufügen. Zum Beispiel:

$ git config --global alias.stash-unapply '!git stash show -p | git apply -R'
$ git stash apply
$ #... work work work
$ git stash-unapply

Das ist lange überfällig, aber wenn ich das Problem richtig interpretieren habe ich eine einfache Lösung gefunden, beachten Sie, dies ist eine Erklärung in meiner eigenen Terminologie:

git stash [save] wird die aktuellen Änderungen speichern weg und stellen Sie Ihren aktuellen Zweig zu dem „sauberen Zustand“

git stash list gibt so etwas wie: stash@{0}: On develop: saved testing-stuff

git apply stash@{0} gesetzt Stromzweig als vor stash [save]

git checkout . Wird Stromzweig als gesetzt, nachdem stash [save]

Der Code, der in dem Versteck gerettet wird, ist nicht verloren, kann es wieder von git apply stash@{0} finden.

Anywhay, das war für mich!

Neben @ Greg Speck Antwort, falls binäre Dateien wurden in den Index aufgenommen und wurde Teil des Stash mit

git stash show -p | git apply --reverse

kann in Folge

error: cannot apply binary patch to '<YOUR_NEW_FILE>' without full index line
error: <YOUR_NEW_FILE>: patch does not apply

Hinzufügen --binary das Problem behebt, aber leider noch nicht herausgefunden, warum noch.

 git stash show -p --binary | git apply --reverse

Dies ist zusätzlich zu den oben genannten Antworten, sondern fügt Suche nach dem git stash auf die Nachricht als Stash Zahl basiert, kann sich ändern, wenn neue stashes gespeichert werden. Ich habe ein paar bash Funktionen geschrieben:

apply(){
  if [ "$1" ]; then
    git stash apply `git stash list | grep -oPm1 "(.*)(?=:.*:.*$1.*)"`
  fi
}
remove(){
  if [ "$1" ]; then
    git stash show -p `git stash list | grep -oPm1 "(.*)(?=:.*:.*$1.*)"` | git apply -R
    git status
  fi
}
  1. Erstellen Stash mit dem Namen (Nachricht) $ git stash save "my stash"
  2. Um appply namens $ apply "my stash"
  3. Zum Entfernen namens Stash $ remove "my stash"
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top