(O+P)ut

アウトプット



(O+P)ut

エンジニアのアウトプット

【Git】showコマンドによる特定ファイルの過去バージョンの確認方法

スポンサーリンク

はじめに

Gitではファイルの修正を適宜コミットすることでバージョン管理を行え、過去のコミット時に戻すことが可能です。

一方で、過去のバージョンに戻すのではなくて中身のみを表示したい場合があります。

本記事ではそれらの手法をハンズオン形式で説明しています。

事前準備

以下のようなテストファイルを作成して最初にコミットを行います。

$ echo "HelloWorld" > a.txt
$ git add a.txt
$ git status a.txt
On branch master

No commits yet

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)

        new file:   a.txt
$ git commit -m"First commit"
[master (root-commit) 667c967] First commit
 1 file changed, 1 insertion(+)
 create mode 100644 a.txt

次にテキストの文言を少し編集してコミットします。

$ sed -i -e "s/Hello/Goodbye/" a.txt
$ cat a.txt
GoodbyeWorld
$ git add a.txt
$ git commit -m"Hello>Goodbye"
[master a8f97bf] Hello>Goodbye
 1 file changed, 1 insertion(+), 1 deletion(-)

特定のコミット時点のファイルを確認する

コミット時点というところを明確にすべくコミットはせずにファイルを修正します。

$ sed -i -e "s/Goodbye/GoodBye/" a.txt
$ cat a.txt
GoodByeWorld

この状態である時点のファイル内容を確認するためにはgit show コミットID:ファイル名を利用します。

コミットIDを確認すべく以下コマンドでコミットのログを表示します。

$ git log
commit a8f97bfe6d96e9b6742afb1905a9ca4d018ea8a5 (HEAD -> master)
Author: Your Name <you@example.com>
Date:   ...

    Hello>Goodbye

commit 667c967e5e262a72adcbe96dfbf0045046d0c6bc
Author: Your Name <you@example.com>
Date:   ..

    First commit

このコミットIDを指定すれば以下のようにその時点のファイルを確認可能です。

$ git show a8f97bfe6d96e9b6742afb1905a9ca4d018ea8a5:a.txt
GoodbyeWorld

$ git show 667c967e5e262a72adcbe96dfbf0045046d0c6bc:a.txt
HelloWorld

git showは何を確認しているのか?

以下の記事でも記載しましたがGitはコミット時のファイル群をスナップショットとして全て保持しています。

最初のコミットをしたコミットIDに対してgit cat-fileを行うと以下のように新たな情報が確認でき

$ git cat-file -p 667c967e5e262a72adcbe96dfbf0045046d0c6bc
tree 49646d56dc6b68dc4f0246b8e7e867773221a429
author Your Name <you@example.com> 1584150130 +0900
committer Your Name <you@example.com> 1584150130 +0900

First commit

このtreeとして表示されているIDに対してさらに内容を確認していくとブロブと呼ばれるファイルの内容を格納している情報が確認でき

$ git cat-file -p 49646d56dc6b68dc4f0246b8e7e867773221a429
100644 blob 3da1ec26e9c8512eae062868a9ff9bae47e5625b    a.txt

ブロブを表示するとそのコミット時のファイルの内容が確認できます。

$ git cat-file -p 3da1ec26e9c8512eae062868a9ff9bae47e5625b
HelloWorld

これらの実体は.git/objects配下に格納されています。

$ tree .git/objects/
objects/
...
├── 3d
│   └── a1ec26e9c8512eae062868a9ff9bae47e5625b
├── 49
│   └── 646d56dc6b68dc4f0246b8e7e867773221a429
├── 66
│   └── 7c967e5e262a72adcbe96dfbf0045046d0c6bc
...

終わりに

Gitのコミットによりobjectsディレクトリ配下に情報をためていきますが、git showを利用すればそのような内部構造を考慮せずともコミットIDさえ指定することでブロブの中身を確認可能です。

任意のファイルのある時点の内容を確認したいケースにてサクッと利用できる便利な手法なので覚えておくと役立つと思います。

以上、ご参考になれば幸いです。