1. ホーム
  2. ギット

[解決済み】スタッシュを逆向きに貼るには?

2022-03-31 19:50:39

質問

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

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

明確にしてください。 私の作業コピーには他の変更点があります。 私の特別なケースを説明するのは難しいのですが、隠し場所にあるデバッグ用のコードや実験的なコードを想像していただければと思います。 今、私の作業コピーに他の変更と混ざっているので、隠し場所からの変更の有無による効果を見たいと思います。

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

解決方法は?

によると git-stash マニュアルページ stash は作業ディレクトリの状態をツリーに記録したコミットとして表され、その最初の親となるコミットは 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

編集する

これを軽く改良したのが git apply をpatchの代わりに使用します。

git stash show -p | git apply --reverse

あるいは git apply -R への省略形として git apply --reverse .

最近、これが本当に便利なんです......。