はじめに
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さえ指定することでブロブの中身を確認可能です。
任意のファイルのある時点の内容を確認したいケースにてサクッと利用できる便利な手法なので覚えておくと役立つと思います。
以上、ご参考になれば幸いです。