🗝️

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

2021/02/10に公開

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

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

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

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

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

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

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

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


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

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

git diff を使って再確認!

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

では、この初期状態で、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
+# (^^)

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
+# (^^)

補足:下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

補足:下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 と意識する!

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

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

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

これは明らかに、最初に設定しろっていうこと?! 新しいオプションが見つかりましたよ~、いやあ~、それにしても今回は完全にスルーしていましたね。きっと、--source=<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