🗝️

Gitコマンド入門::restore の謎解き!「第三回」

2021/02/05に公開

前回「第二回」は、restoreしたら、addできなくなってしまいましたけど、、、みなさんは、その原因を解明できましたか?

まあ~私も含めて、初心者は何をするにも、常に初めてですから、多少のトラブルはつきものですけどね。想像していたこと、一度でも、そう思ってしまったこと、その先入観をリセットするのって、本当に大変なんですよね~(苦笑)

とにかく、新しい情報を取り入れて考えないと、いつまで経っても新しい答えがでない。いつまでも、間違った情報で、間違った答えが出てくるんですよ! for(;;){ echo "><;;" }

ちなみに前回の記事はこちらから~

https://zenn.dev/shiozumi/articles/7eb29b3c673c37

それでは、git add コマンドの動作確認から!

Working Tree(linux file folder)
README.md


↓ git add README.md

Staging Area
README.md


↓ git commit -m "first commit"

Git Repository
README.md

次に、git restore コマンドの動作のおさらい!

Git Repository
README.md


↓ git restore --stage README.md

Staging Area
README.md


↓ git restore README.md

Working Tree (linux file folder)
README.md

まあ、こんなイメージを想像していますよね!

で、、、そうそう、初心者は、肝心な意識が足りていないんです。勿論、私も!!
そもそも、gitの役割は、ファイルバージョン管理ですから、差異を常に意識している。そこが抜けてしまうと思考の盲点になる。つまり、ファイルの差分管理をしっかりしていて、それをステータスとして表示してくるんですよね~

更に、add, retore は、move ではない。copy である。

で、、、そうそう、これも、ついつい、move しているように考えてしまうのですが、所詮は、file copy なんです。そもそも、そうでないと、間違ってファイルを消したら、簡単にファイルを復元できませんからね。(苦笑)まとめると、gitは、ファイルの差分を管理しながら、copy する。つまるところですね。add、restoreしたら、両者間のファイル差分は、なくなるんですよね。あたり前のことを言ってると、さらに謎に聞こえてしまうかもしれませんが?(爆笑)

restore って、実際にはファイルの差分を、copy しています。

restore すると、Working Tree にその差分がコピーされて、結果、linux file folderのローカルファイルに保存されます。嘘だと思ったら、ファイル消して、restore してください!

[shiozumi@ovs-009 mygit]$ rm README.md
[shiozumi@ovs-009 mygit]$ ll
合計 0
[shiozumi@ovs-009 mygit]$ git restore README.md
[shiozumi@ovs-009 mygit]$ ll
合計 4
-rwxrwxr-x 1 shiozumi shiozumi 27  25 18:14 README.md
[shiozumi@ovs-009 mygit]$ cat README.md
# note

結果3つ同じファイルがある? 実際には、差分を菅理!

Git Repository Staging Area Working Tree
README.md README.md README.md

結論は、差分が発生していないと、add できない!

ですから、restore したら、Working Tree と、Staging Areaとのファイル差が無くなるわけです。つまり同じ内容のファイルだから、addできないんです。そして、差分があるときだけ、git status に表示される。※もしくは、Staging Areaにファイルが存在しない時だけです。

README.md を編集して、add してみましょう!

[shiozumi@ovs-009 mygit]$ vi README.md
[shiozumi@ovs-009 mygit]$ cat README.md
# note
# add // <-- ここに一行追加!

ファイルの差分が発生したので、今度は、addも成功して、git status コマンドでも表示されましたよね~(笑)

[shiozumi@ovs-009 mygit]$ git add README.md
[shiozumi@ovs-009 mygit]$ git status
On branch main
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        modified:   README.md

これで、ローカルファイルの差分が、Staging Area に登録されて、今は、Git Repository との差がある状態となりました。つまるところ、git restore --staged コマンドを入力して、さらに、git restore を打てば、さっき変更した追加の一行は、また、消えるはずですね!

今回「第三回」は、ここまで! お疲れ様でした!(笑)

https://zenn.dev/shiozumi/articles/80b057ce7c77dd
https://twitter.com/esmile2013

Discussion