Gitコマンド入門::restore(HEAD,tree)「第八回」

5 min read

大発見?! --source=tree を解明!

こんにちは! 今回は、前回、前々回の続きですね。 いきなり大発見なんてタイトルですけど、初心者、経験者、そしてプログラマー30年以上の経歴の私でさえも、知らない事は山ほどありますよ~というか、、、いまでも毎日勉強中ですね。(苦笑)

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

https://zenn.dev/shiozumi/articles/2a8f632ca243a3

git restore --help で、マニュアルを再確認!

[shiozumi@ovs-009 mygit]$ git restore --help

OPTIONS
-s <tree>, --source=<tree>
Restore the working tree files with the content from the given tree.
It is common to specify the source tree by naming a commit,
branch or tag associated with it.

If not specified, the default restore source for the working tree is the index,
and the default restore source for the index is HEAD.
When both --staged and --worktree are specified,
--source must also be specified.

私も含めて、初心者の方は、まずは、マニュアルの確認からですね! 最近は、google 検索がとても便利なので、ついつい検索に先走ってしまいますが、基本は、やっぱり、マニュアルを読むところから始めましょう!

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

指定しない場合、作業ツリーのデフォルトの復元ソースはインデックスであり、インデックスのデフォルトの復元ソースはHEADです。 --stagedと--worktreeの両方が指定されている場合、--sourceも指定する必要があります。

マニュアルには、しっかり記載されていました!

--stagedと--worktreeの両方が指定されている場合、--sourceも指定する必要があります。

コマンド実行時には何も警告文が出ないので気づきませんでしたが、マニュアルには、しっかり記載されていましたね。ハハハ、、、(^^;; 勝手に想像をしないで、真っ先に、--helpを読むべきでしたね~ これも結構、ついつい焦っていると、やってしまいガチな失敗ですね。

新しい単語の置き換えは、以下のようになります。

  1. 作業ツリーは、Working tree
  2. インデックスは、Staging Area
  3. HEADは、Git Repogitory[1]

ソースツリー、--source=<tree> の説明

ソースツリーには、コミット、ブランチ、タグなどを指定、そして指定しないデフォルトの復元ソースは、HEADとなる! つまり、HEAD ≠ Repogitory ですね。[1:1]

では、省略しないで、コマンドを整理してみましょう!

  1. git restore --worktree README.md
    // 省略形:git restore README.md
    // Staging Area から、Working tree へREADME.mdを複製する。
    // 理想完全系(笑)git restore --source=--staged --worktree README.md[2]

  2. git restore --source=HEAD --staged README.md
    // 省略形:git --staged README.md
    // Git Repogitory から、Staging Area へREADME.mdを複製する。

さあ~、皆さんも、なんとなくイメージ出来て来ましたか? 作業ツリーとか、Working tree とか、ソースツリーとか、木木木・・・と、たくさん出てきて頭が混乱してしまいますけどね。

作図をドン!・・・更に理解度UP!

省略形コマンドと、全てを記載したコマンドの差を明確にしてみました。これら、それぞれの2つを比較することによって、git restore コマンドの動作のイメージが、明確になってきますね。

もう一度、git restore --help で、概要の再確認

[shiozumi@ovs-009 mygit]$ git restore --help
DESCRIPTION

Restore specified paths in the working tree with some contents from
a restore source. If a path is tracked but does not exist in the restore source,
it will be removed to match the source.

The command can also be used to restore the content in the index with --staged,
or restore both the working tree and the index with --staged --worktree.

By default, the restore sources for working tree and the index are the index
and HEAD respectively. --source could be used to specify a commit as
the restore source.

See "Reset, restore and revert" in git(1) for the differences between
the three commands.

順序が反対になってしまいしたけど、概要も併せて翻訳して、一読しておきましょう!

Google翻訳:
復元ソースからのコンテンツを使用して、作業ツリー内の指定されたパスを復元します。
パスが追跡されているが、復元ソースに存在しない場合、ソースと一致するように削除されます。

このコマンドを使用して、--stagedを使用してインデックスのコンテンツを復元したり、
--staged --worktreeを使用して作業ツリーとインデックスの両方を復元したりすることもできます。

デフォルトでは、作業ツリーとインデックスの復元ソースは、それぞれインデックスとHEADです。--sourceを使用して、コミットを復元ソースとして指定できます。

3つのコマンドの違いについては、git(1)の「リセット、復元、および元に戻す」を参照してください。このコマンドは実験的なものです。 動作が変わる可能性があります。

概要を一読してみると、さらに分かってきますね。

あとは、ソースツリーとなる、HEAD以外、コミット、ブランチ、タグというワードが出てきますので、これらが明確になってくれば、もう自由自在にファイルのリストアーが出来るようになりそうですけど、、、ただ、今のところは、HEADのみで十分ですね。

さらに、その下のEXAMPLESに、やっと発見!

[shiozumi@ovs-009 mygit]$ git restore --help
SYNOPSIS
DESCRIPTION
OPTIONS
// 中略

EXAMPLES
$ git restore --source=HEAD --staged --worktree hello.c

or the short form which is more practical but less readable:
$ git restore -s@ -SW hello.c
// これは、さらに省略形ですね! @=HEAD S=--staged W=worktree(笑)

git restore --source=HEAD --staged --worktree README.md
HEAD「Repogitory」リポジトリーから、[Staging Area] インデックスと、[Working tree] 作業ツリーの両方に、ファイルをリストアーする。という動作になるんですね。

もう一度、作図で理解してみましょう!

  1. git restore --source=HEAD --staged README.md[3]
  2. git restore --source=HEAD --worktree README.md[4]
  3. 1と2をまとめて、git restore --source=HEAD --staged --worktree README.md

結論:--staged --worktree 同時にファイルを戻すときは、その元のソースツリーを指定すること、ここでは、--source=HEAD と指定して、Git Repogitory からとなります。尚、Repogitory では勿論、ファイルの履歴を管理していすので、HEAD 以外の指定も可能です。詳細な解説は、また次回以降、順を追って説明して行きます。

さあ~、やっと謎が解けましたね~ それにしても時間が掛かってしまいましたが、これによって、理解度も更に深まったと思います。まあ~、コマンド操作も省略形を意識しないで使ってると、実作業でもトラブルになりがちです。実際のところ深く理解していないと、ちょっとでも変化させたり応用したりすると、実際の動作とイメージにズレが生じるんですよね。特にリストアー操作で間違ったところからファイルを持ってきてしまい、それに気づかずに編集を始めたら、さらに泥沼化します。是非、gitの各作業領域を完璧に把握するためにも、リストアー操作は、しっかり覚えて置きましょう。備えあれば患いなしですね!

今回「第八回」は、ここまで! みなさん長い時間お付き合いいただきありがとうございます。お疲れ様でした!

https://zenn.dev/shiozumi/articles/c770c2435b00ab
https://twitter.com/esmile2013
脚注
  1. 実際のRepogitoryは、ファイルの履歴を管理していますので、HEADの他もあります。 ↩︎ ↩︎

  2. 本来、このように明示して見ると、理解もしやすくなるんですけどね~ ↩︎

  3. --source=HEAD の省略は可能 ↩︎

  4. --source=HEAD を省略すると、Staging Area からの複製となります。 ↩︎