🗝️

Gitコマンド入門::restoreの動作解明中!「第七回」

6 min read

シナリオその3が正しいとなると・・・

こんにちは~ 前回は謎のまま、クラッシュした状態で終わってしまいましたけど、みなさんは大丈夫でしたか? まあ~、そもそもですが、同時オプション設定時に2通りの結果が予測される時点で、疑問が湧いてくるぐらい謎だったんですよね~(苦笑)つまるところ、私がgitを開発する立場なら、オプションの優先順位を明確にすると思いますからね。例えば、--working --staged と記載したら、シナリオ1、前後を入れ替えて、--staged --working と書いたらシナリオ2 このように使い分けれるような仕様にするとかしないと、gitツール側でも処理フローに矛盾が残ったままになってしまいますからね~[1] ><

ちなみに前回の記事は、こちらです!

https://zenn.dev/shiozumi/articles/081244e7fb9256

私が予測したいた動作は、以下の2通りですが、結果は3番でした。

README.md の初期状態

各領域 Working Tree Staging Area Git Repository
ファイル名 README.md README.md README.md
内容 test add (^^) test add test
  1. git restore --worktree --staged README.md --> 1番の結果へ
  2. git restore --staged --worktree README.md --> 2番の結果へ

1番の結果:--worktree --staged の順番で処理

各領域 Working Tree Staging Area Git Repository
ファイル名 README.md README.md README.md
内容 test add test test

2番の結果:--staged --worktree の順番で処理

各領域 Working Tree Staging Area Git Repository
ファイル名 README.md README.md README.md
内容 test test test

本来なら、このように動作の使い分けができるような仕様にしますね。[2]

実際は3番目のシナリオ! --staged 無視される!

各領域 Working Tree Staging Area Git Repository
ファイル名 README.md README.md README.md
内容 test add test add test

結局のところは、--staged は、スルーされて無効ですね。

いくつか、他のサイトなども調べたりしていましたが、おそらく間違って理解しているサイトの情報もありましたので、少しご注意ください。これから調べていくので、私が間違っている可能性もありますけど、、、現時点では、どうやっても、--worktree と、--staged の同時指定は、無視されます。[3]


ここまでを、振り返った感想!

急いでいる方は、読み飛ばしてOKですよ!

Git2.23から導入された、restoreコマンドをここまで調べて来ましたけど、私自身が、そもそも、gitの熟練者ではありませんから、そのアプローチ、調べ方も独自になっています。その結果が、読者の皆さんには、ご迷惑をかけているかも知れませんね。もしそうだとしたら、ごめんなさい。私の狙いとしては、なるべく分かりやすく、少しずつ理解が深まるようにと、初心者の方が躓きそうなところ、疑問に思う点なども想像して、ここまで進めてきましたが、実際のところどうでしょうか? まあ~、つまるところ私自身の経験がゲームプログラマー上がりですから、もしかすると、普通の今時のプログラマーさんとは大きく異なる可能性もあるかな?!・・・なんて思っています。(苦笑)ということで、興味をもって頂いた方には感謝しておりますし、私の指向性を少しでも理解して頂き、お役に立てたなら本望ですね。それでは、引き続きをどうぞ!

git diff を使って再確認!

さあ~ Working / Staging / Repogitory がそれぞれの領域で認識している、ファイルの差分を簡単に調べるコマンド、diff も、これから使って行きましょう! git status だけだと、少し頭が混乱してしまう時もありますからね~

前回、完全に私自身が、statusの内容を読み間違ってしまったので、その反省の意味も含めて、diff を使わない訳にも行きません。(苦笑)[4]

では、この初期状態で、git diff を実行しましょう!

各領域 Working Tree Staging Area Git Repository
ファイル名 README.md README.md README.md
内容 test add (^^) test add test
[shiozumi@ovs-009 mygit]$ git diff
diff --git a/README.md b/README.md
index fd66901..0811606 100644
--- a/README.md
+++ b/README.md
@@ -1,3 +1,4 @@
 # test
 # add
+# (^^)

Working Tree と、Staging Area で認識している、README.mdの差分を表示します。

git diff これも省略系なので、本来なら、git diff [Working] [Staging][5]と意識しておきましょうね。

補足:一番下の行、薄い、緑色の網掛け[6]の部分が差分です。実データーは、(^^)です。他の部分は、ここでは、説明しませんが、また後ほど!

次に、git diff HEAD[7] を実行しましょう!

[shiozumi@ovs-009 mygit]$ git diff HEAD
diff --git a/README.md b/README.md
index fd7407f..0811606 100644
--- a/README.md
+++ b/README.md
@@ -1,3 +1,4 @@
 # test
-
+# add
+# (^^)

Working Tree と、Git Repogitory で認識している、README.mdの差分を表示します。
HEADは、commitした時の現在のブランチを指しています。
git diff HEADは、git diff Working[省略] Repository[HEAD]
こんな風に意識して置きましょう。

補足:下3行、薄い、赤色[8]と緑色の網掛けの部分が差分です。おそらく、Repogitory で認識している、README.mdでは、# test の下に、一行改行が入っているのでしょう!

最後に、git diff --staged を実行しましょう!

[shiozumi@ovs-009 mygit]$ git diff --staged
diff --git a/README.md b/README.md
index fd7407f..fd66901 100644
--- a/README.md
+++ b/README.md
@@ -1,3 +1,3 @@
 # test
-
+# add

Staging Area と、Git Repogitory で認識している、README.mdの差分を表示します。こちらも、HEADが、省略されてます。きちっと書くと、git diff --staged HEAD
git diff --staged HEADは、git diff Staging Repository[HEAD]
こんな風に意識して置きましょう。

補足:下2行、薄い、赤色と緑色の網掛けの部分が差分です。先ほどと同じ説明となります。

git diff を使うと、status よりも分かりやすい!

各領域で認識している、実際のファイルの中身、差分を明示してくれるので、これからは、こちらのコマンドもしっかり使って行きますよ!(笑)というか、もっと先に覚えるべきだったかな?

作図しました。更にイメージをしっかりと!

まとめ

  1. git diff は、[working] [staging] との比較、差分を表示
  2. git diff --staged は、[staging] [Repogitory] との比較、差分を表示
  3. git diff HEAD は、[working] [Repogitory] との比較、差分を表示

省略形の再認識

  1. git diff を、git diff --working[省略] --staged[省略] と意識する!
  2. git diff --staged を、git diff --staged HEAD[省略] と意識する!
  3. git diff HEAD を、git diff --working[省略] HEAD と意識する!

省略されている箇所を再認識すると、理解度も深まります!

さあ~、そろそろ、本題に戻りましょう!

まず、分かったことは、git restore --worktree --staged は同時にできない。
そして、--staged は、無視される。勿論、git restore --staged --worktree このように前後を入れ替えても、結果は同じ、--staged は実行されません。

では、どうして、help では、同時設定が出来るように表示されるのか?

[shiozumi@ovs-009 mygit]$ git restore --help
// 中略 ~
git restore [<options>] [--source=<tree>] [--staged] [--worktree] <pathspec>...

発見! --source=<tree> ってなんだ?

これは明らかに、最初に設定しろっていうこと?! 新しいオプションが見つかりましたよ~、いやあ~、それにしても今回は完全にスルーしていましたね。きっと、--source=<tree> を追加で指定すると、正常に動作するのでしょう・・・新しい未来が、またひとつ見えてきましたよ!

--source:ソースは情報元、tree:木ですね。でも、その木は、どこにあるのかな?
そもそも、木とは、なんだろう?!(笑)

次回は、restoreコマンドで指定する、HEAD,treeについて詳しく見ていきましょう!

今回「第七回」は、ここまで! お疲れ様でした!

https://zenn.dev/shiozumi/articles/86b348786f1038
https://twitter.com/esmile2013
脚注
  1. --staged --worktreeの同時指定は、--source==<tree>で実現できるようになります。 ↩︎

  2. 指向性としては、かなり脱線していますが、素の気持ちです。(笑) ↩︎

  3. 他の引数を追加で指定してあげると、同時処理ができるようになります。ただ、シナリオ1、2とは違う動作となりますので、ご注意ください。 ↩︎

  4. 始めて方は、少しだけでも使い方を覚えて置きましょう! ↩︎

  5. 実際には、Working の指定は、出来ないようです。 ↩︎

  6. +の記号は、ファイルとの比較で、追加されている部分となります。 ↩︎

  7. HEADについては、又、次回以降で説明しますね。現状では、最新のRepositoryと思っていただければ、特に問題ありません。 ↩︎

  8. -の記号は、ファイルとの比較で、不足している部分となります。 ↩︎

Discussion

ログインするとコメントできます