質問
git stashに小さなパッチが保存されています。 git stash apply
を使用して作業コピーに適用しました。ここで、パッチを逆に適用してこれらの変更をバックアウトしたいと思います( git revert
が行うのと同じように、隠し場所に対して)。
これを行う方法を知っている人はいますか
明確化:作業コピーには他にも変更があります。私の特定のケースを説明するのは困難ですが、スタッシュにあるデバッグまたは実験的なコードを想像できます。今、それは私の作業コピーに他のいくつかの変更と混合されており、スタッシュからの変更の有無にかかわらず効果を見てみたいです。
現在、stashがこれをサポートしているようには見えませんが、 git stash apply --reverse
は素晴らしい機能です。
解決
git-stashマンページによると、"スタッシュはツリーが作業ディレクトリの状態を記録し、その最初の親がスタッシュ作成時の HEAD
でのコミットであるコミット、" git stash show -p
は、" stashに記録された変更を、stashed状態と元の親の間の差分として提供します。
他の変更をそのまま保持するには、 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
編集:
これに対する軽い改善は、パッチの代わりに 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]
は以前の(ポップ前)状態に戻ります。
git checkout -f
コミットされていない変更は削除されます。
git manページからの直接貼り付け 明確に表現されており、エイリアスも含まれています。
隠し場所の適用解除 ユースケースシナリオによっては、スタッシュされた変更を適用し、いくつかの作業を行ってから、スタッシュから最初に発生した変更を適用解除したい場合があります。 Gitはそのようなstash unapplyコマンドを提供しませんが、stashに関連付けられたパッチを取得して逆に適用するだけで効果を達成することができます。
$ git stash show -p stash@{0} | git apply -R
繰り返しますが、スタッシュを指定しない場合、Gitは最新のスタッシュを想定します:
$ git stash show -p | git apply -R
エイリアスを作成し、stash-unapplyコマンドを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]
は、現在の変更を保存し、現在のブランチを「クリーンな状態」に設定します
git stash list
は次のようなものを提供します: stash @ {0}:開発時:保存されたテスト用のもの
git apply stash @ {0}
は、現在のブランチを before stash [save]
git checkout。
現在のブランチを after stash [save]
stashに保存されたコードは失われません。 git apply stash @ {0}
で再度見つけることができます。
Anywhay、これは私のために働いた!
@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
}
- 名前(メッセージ)でスタッシュを作成
$ git stash save&quot; my stash&quot;
-
$という名前を適用するには、&quot; my stash&quot;
を適用します
- 名前付きスタッシュを削除するには
$ remove&quot; my stash&quot;