Gitコマンド入門::restore(commit,log)「第九回」

6 min read読了の目安(約5700字

git log コマンド

みなさん、こんにちは! ここまで、restore コマンドの動作、引数、オプションを調べなら理解してきましたけど、いかがでしょうか? 学習の仕方、解き方は、いろいろあると思いますが、ポイントになるコマンドには、多くの有益な情報が詰まっているものですね。ということで、今回は、前回の続き、--source=<tree>を、更に深堀して行きましょう。ちなみに、前回のrestoreのマニュアルの翻訳は、みなさん覚えていますか?

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

https://zenn.dev/shiozumi/articles/86b348786f1038

Google翻訳:
-s <tree>、--source=<tree>
指定されたツリーのコンテンツを使用して、作業ツリーファイルを復元します。 ソースツリーに関連付けられているコミット、ブランチ、またはタグに名前を付けてソースツリーを指定するのが一般的です。

HEAD以外、--source=<tree>には、以下も指定できるようです。

  1. コミット // --source=<commit>
  2. ブランチ // --source=<branch>
  3. タグ // --source=<tag>

では実際に、git logコマンドで出力してみましょう!

コミットのハッシュ値や、ブランチ名などが分かりますね!

  1. commit = a467fbdd7e989b224f388e048823068a0f122d51
  2. branch = main
  3. tag = 現在は不明ですね。
[shiozumi@ovs-009 test]$ git log
commit a467fbdd7e989b224f388e048823068a0f122d51 (HEAD -> main, origin/main)
Author: shiozumi makoto <shiozumi@ovs-009.e-smile.local>
Date:   Wed Feb 10 15:28:42 2021 +0900

    first commit

まだ、一回しかコミットしていないので、Git Repogitory の履歴は、ひとつだけですね。
git commit -m "first commit" を実行のみです。
初期化の手順は、以下の通りです。

初期化コマンド例 [1]

初期化コマンド
rm -rf .git or mkdir <folder> してください。

echo "# test" >> README.md
git init
git add README.md
git commit -m "first commit"

コミットは、commit = a467fbdd~ とハッシュ値が表示されますね。

git restore --source=a467fbdd7e989b224f388e048823068a0f122d51 --worktree README.md を実行し、cat README.md でファイルの中身を確認してみましょう!

HEAD -> main と表示されますので、ブランチ名は、main です。

git restore --source=main --worktree README.md を実行し、cat README.md でファイルの中身を確認してみましょう!

各領域、README.mdの初期状態

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

このような状態から、Git Repository から、Working tree に、README.md を移動しても、内容は、各領域で保持しているファイルの中身が同じなので変わりませんね。なので、ちょっとわかりづらくなっているので、一度、rm README.md などでファイル削除してから、git restore を実行すると、少しは、ファイルをリストア出来た感じの雰囲気は出ますね。(苦笑)

では、毎度の作図を、ご覧ください!

  1. HEAD での指定 // --source=HEAD
  2. コミット値での指定 // --source=<ハッシュ値>
  3. ブランチ名での指定 // --source=main

これで、3種類の --source=<tree> 指定での実行イメージが掴めたと思います。※ tag は、後日、説明しますね。

それでは、README.md を変更して、更にコミット!

[shiozumi@ovs-009 test]$ echo "# (^^)" >> README.md
[shiozumi@ovs-009 test]$ cat README.md
# test
# (^^)

それでは、README.md を変更して、更にコミット!

git add README.md
git commit -m "2nd commit"

そしてもう一度、git log コマンド実行!

[shiozumi@ovs-009 test]$ git log
commit b8c6432555dcffd05d0973179add7bbb19d39d5d (HEAD -> main)
// ~ 省略
    2nd commit

commit a467fbdd7e989b224f388e048823068a0f122d51 (origin/main)
// ~ 省略
    first commit

いよいよ、Repogitory に履歴が追加されました!

これで、1st コミットと、2nd コミットとは、README.md の内容に差異があることになります。もう少し、本格的になってきましたよ!(笑)

ということで、現状は、こんな感じです!

各領域 Working Tree Staging Area Git Repository 2nd Git Repository 1st
ファイル名 README.md README.md README.md README.md
内容 test (^^) test (^^) test (^^) test

git commit を入力する毎に、Git Repogitory には、履歴が増えて行きます。まあ~、当たり前ですけど、そうすることによって、過去のどの時点にでも、ファイルの状態を戻すことが出来るようになりますね。[2]

尚、現状の状態が、表のようになっているのか、Git Repository 2nd と、Git Repository 1st の差分を、git diff で確認して置きましょう!

[shiozumi@ovs-009 test]$ git diff a467fbdd7e989b224f388e048823068a0f122d51 HEAD
diff --git a/README.md b/README.md
index 83c831f..208ce1e 100644
--- a/README.md
+++ b/README.md
@@ -1 +1,2 @@
 # test
+# (^^)
[shiozumi@ovs-009 test]$

1st = a467fbdd7e989b224f388e048823068a0f122d51
2nd = HEAD

前回と今回の差分は、予想通り、+# (^^) となりましたね。 緑色の背景色なので、追加行として、表示されています! ちなみに、コマンドでの引数を反対してやってみると、また、差分表示が変化するので、是非、一度、お試しくださいね。
git diff HEAD a467fbdd7e989b224f388e048823068a0f122d51

[shiozumi@ovs-009 test]$ git diff HEAD a467fbdd7e989b224f388e048823068a0f122d51
diff --git a/README.md b/README.md
index 208ce1e..83c831f 100644
--- a/README.md
+++ b/README.md
@@ -1,2 +1 @@
 # test
-# (^^)
[shiozumi@ovs-009 test]$

当然の結果出力ですね。引数の順序を入れ替えたら、差分表示も真逆になります!

それでは、早速、以下の2つのコマンドを実行!

git restore --source=a467fbdd7e989b224f388e048823068a0f122d51 --worktree README.md[3]
git restore --source=b8c6432555dcffd05d0973179add7bbb19d39d5d --worktree README.md[4]

HEADやブランチ名に、^を付けることで、ひとつ前のコミットを選択することが可能!
ここでは、HEAD^ main^ の指定が可能です![4:1]

--source=a467fbdd7e989b224f388e048823068a0f122d51
$ rm -rf README.md // 一応、削除して分かりやすく!
$ git restore --source=a467fbdd~省略 --worktree README.md

$ cat README.md
# test
--source=b8c6432555dcffd05d0973179add7bbb19d39d5d
$ rm -rf README.md // 一応、削除して分かりやすく!
$ git restore --source=b8c64325~省略 --worktree README.md

$ cat README.md
# test
# (^^)

これで、任意のコミットの時点から、ファイルをリストアーできるようになりましたね!
ファイルの中身を更新することも、思い通りに操作できる事でしょう!

それでは、まとめの作図を、ご覧ください!

git commit する毎に、Repogitoryには、ファイルの差分情報が追加されていく。それが更に分岐するので、木の幹と枝の関係に似ているので、木<tree>という表現をしているんですね。

この作図では、Staging Area に戻すコマンドに置き換えてみましたので、git restore --source=HEAD^ --staged README.md + git restore --worktree README.md と2つ実行しないと、README.md のファイルがリストアーされませんので、ご注意ください。

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

https://zenn.dev/shiozumi/articles/f6b4f05a1185bb/
https://twitter.com/esmile2013
脚注
  1. 環境が異なっている場合は、一度、gitフォルダーを消すなり、別ディレクトリーを作成して、git init から初めて下さい。 ↩︎

  2. 俗に、gitは、ファイルバックアップなんて言われてますけど、つまるところ、履歴を全て保持していますし、しかも複数ファイルですから、そう例えるのも的を得ています。 ↩︎

  3. git restore --source=HEAD --worktree README.md HEAD指定も勿論可!
    git restore --source=main --worktree README.md ブランチ名の指定も可! ↩︎

  4. git restore --source=HEAD^ --worktree README.md ^は、ひとつ前の指定!
    git restore --source=main^ --worktree README.md ^は、ひとつ前の指定! ↩︎ ↩︎