スタッシュの逆貼り方法は?

git stashに小さなパッチを保存しています。 私は git stash apply を使って作業コピーにそれを適用しました。 今、私はパッチを逆適用して変更を取り消したいと思っています(git revertが隠し場所に対して行うようなものです)。

どなたかこの方法をご存知でしょうか?

Clarification: 私の作業コピーには他の変更もあります。 私の特定のケースを説明するのは難しいのですが、隠し場所にあるデバッグや実験的なコードを想像してみてください。 現在、それは私の作業コピーに他の変更と混在しており、私は隠し場所からの変更の有無による効果を見たいと思います。

stashは現在これをサポートしていないようですが、git stash apply --reverseは良い機能でしょう。

質問へのコメント (2)
ソリューション

href="http://git-scm.com/docs/git-stash">git-stash manpage によると、"スタッシュは作業ディレクトリの状態をツリーに記録したコミットとして表され、その最初の親はスタッシュを作ったときの HEAD にあったコミットであり、git stash show -p はスタッシュに記録されている変更とその元の親の差分で表示するそうです。

他の変更をそのままにするには、次のように git stash show -p | patch --reverse を使用します。

$ 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 ..." to update what will be committed)
#   (use "git checkout -- ..." 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

編集:

これを軽く改良すると、patchの代わりにgit applyを使うことができます。

git stash show -p | git apply --reverse

また、git apply -Rgit apply --reverse の省略形として使用することもできます。

私は最近これをとても重宝しています...

解説 (8)

git stash[save] は、作業ディレクトリの状態とインデックスの状態を取得して、それらを格納し、インデックスと作業領域を HEAD バージョンにセットします。

git stash applyはそれらの変更を戻すので、git reset --hard` はそれらを再び削除します。

git stash popはそれらの変更を戻し、一番上に隠した変更を削除するので、git stash [save]` はこの場合、以前の(pop 前の)状態に戻ります。

解説 (0)
git checkout -f

コミット以外の変更は削除されます。

解説 (3)

git man pageから直接カットnペーストします。 それは明確に表現されており、エイリアスも含まれています。

スタッシュの適用を解除。 一部のユースケースシナリオでは、隠し変更を適用したり、いくつかの作業を行ったりしますが、元々隠し場所にあった変更を適用しません。 Gitはそのようなスタッシュを適用しないコマンドを提供しませんが、スタッシュに関連付けられたパッチを取得して逆に適用するだけで効果を達成できます。

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

繰り返しになりますが、スタッシュを指定しない場合、Gitは最新のスタッシュを想定しています。

$ git stash show -p | git apply -R

エイリアスを作成し、隠しコマンドを効果的にGitに追加することをお勧めします。 例:

$ git config --global alias.stash-unapply '!git stash show -p | git apply -R'
$ git stash apply
$ #... work work work
$ git stash-unapply
解説 (1)

長くなりましたが、もし私がこの問題を正しく解釈するならば、簡単な解決策を見つけることができました。

git stash [save]` は現在の変更を保存し、現在のブランチを "clean state&quot に設定します。

git stash listは次のような結果をもたらします。stash@{0}:開発中:testing-stuff を保存しました

git apply stash@{0}は、現在のブランチを **before** として設定しますstash [save]`

git checkout . は現在のブランチを after stash [save] として設定します。

stash に保存されたコードは失われることはなく、再び git apply stash@{0} を実行すれば見つけることができます。

とにかく、これでうまくいきました!

解説 (1)

@Greg Baconの回答に加えて、バイナリファイルがインデックスに追加され、使用しているスタッシュの一部であった場合。

git stash show -p | git apply --reverse

につながる可能性があります。

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

--binaryを追加すると問題が解決しますが、残念ながらまだ理由がわかりません。

 git stash show -p --binary | git apply --reverse
解説 (0)

これは上記の回答に追加されますが、新しいスタッシュが保存されるとスタッシュ番号が変更される可能性があるため、メッセージに基づいてgitスタッシュの検索が追加されます。 私はいくつかのbash関数を書きました:

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。 名前(メッセージ) $ git stashで隠し場所を作成し、 "my stash"を保存します。 2。 appplyに「$」という名前を付けるには、「my stash」を適用します。 3。 名前付きスタッシュを削除するには$ "my stash"を削除します。

解説 (0)

隠し場所を逆に適用する方法?

他の人が述べたことは別として、最も簡単な方法は最初にすることです。

git reset HEAD

次に、すべてのローカル変更をチェックアウトします。

git checkout . 
解説 (0)