- 作者: 岡本隆史,武田健太郎,相良幸範
- 出版社/メーカー: 技術評論社
- 発売日: 2012/07/10
- メディア: 単行本(ソフトカバー)
- 購入: 7人 クリック: 103回
- この商品を含むブログ (26件) を見る
こちらの書籍を著者様より献本いただきました。ありがとうございます!
本書は、GitHubなどの既存の共有リポジトリの使用を前提として、これから開発に参加しようという読者を想定しているため、「どういうシーンでどのgitコマンドを使えばいいのか」が明確で、わかりやすい構成になっています。実用面にフォーカスしたGitの解説書としては、今のところベストな1冊ではないでしょうか。
ところで・・・・
ちなみに私の場合は、ソースコードを書く時間よりは、読む時間の方がずっと長いのですが、実は「ソースを読むツール」としてもGitは有用です。
Gitリポジトリにはソースコードの過去の全ての変更履歴が残されていますので、
・「いまのコードがどうなっているのか」
だけではなく、
・「どんな歴史をたどっていまのコードができあがったのか」
を読み解くことができます。
これにより、ソースを書いてきた開発者たちが「何を考えて」「何のために」「何をめざして」いまのコードを作り上げたのかを明確に理解することができます。下手なドキュメントを読むよりは、ソフトウェアに対する理解が数倍は深まります。
Gitを利用したソースコードリーディングは、おおきくは次の流れになります。
(1)「git clone」でリポジトリからcloneしてきたコードを読む。
(2) ある部分の処理の意味(何のためにこの処理が入っているのか)が分からなくなる。
(3)「git blame」でその処理を書いた犯人(=commit)を特定する。
(4)「git show」で犯人の言い訳(=commit log)を聞いてみる。
(5)「git checkout」で犯人が悪さをする前のコードに時代を巻き戻して、コードを読み直す。
これを続けることで、現在から過去にさかのぼって、ソースコードの歴史をひもといていくことができます。
例えば、プロのための Linuxシステム・10年効く技術 (Software Design plus)の第4章で紹介した、次のLinuxカーネルソースのコメントの謎(カーネルのバージョン文字列部分が固定でないといけない理由)
1 /* 2 * linux/init/version.c 3 * 4 * Copyright (C) 1992 Theodore Ts'o 5 * 6 * May be freely distributed as part of Linux. 7 */ 8 ・・・ 40 /* FIXED STRINGS! Don't touch! */ ←ココ 41 const char linux_banner[] = 42 "Linux version " UTS_RELEASE " (" LINUX_COMPILE_BY "@" 43 LINUX_COMPILE_HOST ") (" LINUX_COMPILER ") " UTS_VERSION "\n"; 44 45 const char linux_proc_banner[] = 46 "%s version %s" 47 " (" LINUX_COMPILE_BY "@" LINUX_COMPILE_HOST ")" 48 " (" LINUX_COMPILER ") %s\n";
は、次のgitコマンドを駆使することで、解き明かされます。
$ git blame init/version.c $ git show c71551ad $ git checkout c71551ad^ $ git blame init/version.c $ git show 3eb3c740 $ git checkout 3eb3c740^ $ git blame fs/proc/proc_misc.c $ git show 8993780a
このコメントを書いた犯人(?)はLinusなのですが、彼の説明は、GitリポジトリのCommit Logで確認することができます。
というわけで、みなさんも早速「Gitポケットリファレンス」を購入して、まずは下記のページに目を通してみましょう。
・第1章 → 全体をよんでGitの考え方をざっくり理解する。
・第2章 → 次のコマンドを理解する。
p.53 「git clone」の説明
p.170 「git blame」の説明
p.168「git show」の説明
p.115「git checkout」の説明
これで、Gitを活用したソースコードリーディングの準備はばっちりです。
ちなみに、Mainlineカーネルのcloneはこちらからどうぞ。
$ git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git