git stashに小さなパッチを保存しています。 私は git stash apply
を使って作業コピーにそれを適用しました。 今、私はパッチを逆適用して変更を取り消したいと思っています(git revert
が隠し場所に対して行うようなものです)。
どなたかこの方法をご存知でしょうか?
Clarification: 私の作業コピーには他の変更もあります。 私の特定のケースを説明するのは難しいのですが、隠し場所にあるデバッグや実験的なコードを想像してみてください。 現在、それは私の作業コピーに他の変更と混在しており、私は隠し場所からの変更の有無による効果を見たいと思います。
stashは現在これをサポートしていないようですが、git stash apply --reverse
は良い機能でしょう。
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 <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
編集:
これを軽く改良すると、patchの代わりにgit apply
を使うことができます。
git stash show -p | git apply --reverse
また、git apply -R
を git apply --reverse
の省略形として使用することもできます。
私は最近これをとても重宝しています...
git stash
[save]
は、作業ディレクトリの状態とインデックスの状態を取得して、それらを格納し、インデックスと作業領域を HEAD
バージョンにセットします。
git stash applyはそれらの変更を戻すので、
git reset --hard` はそれらを再び削除します。
git stash popはそれらの変更を戻し、一番上に隠した変更を削除するので、
git stash [save]` はこの場合、以前の(pop 前の)状態に戻ります。
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
長くなりましたが、もし私がこの問題を正しく解釈するならば、簡単な解決策を見つけることができました。
git stash [save]` は現在の変更を保存し、現在のブランチを "clean state" に設定します。
git stash listは次のような結果をもたらします。stash@{0}:開発中:testing-stuff を保存しました
。
git apply stash@{0}は、現在のブランチを **before** として設定します
stash [save]`
git checkout .
は現在のブランチを after stash [save]
として設定します。
stash に保存されたコードは失われることはなく、再び git apply stash@{0}
を実行すれば見つけることができます。
とにかく、これでうまくいきました!
@Greg Baconの回答に加えて、バイナリファイルがインデックスに追加され、使用しているスタッシュの一部であった場合。
git stash show -p | git apply --reverse
につながる可能性があります。
error: cannot apply binary patch to '<YOUR_NEW_FILE>' without full index line
error: <YOUR_NEW_FILE>: patch does not apply
--binary
を追加すると問題が解決しますが、残念ながらまだ理由がわかりません。
git stash show -p --binary | git apply --reverse
これは上記の回答に追加されますが、新しいスタッシュが保存されるとスタッシュ番号が変更される可能性があるため、メッセージに基づいて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"を削除します。