Git入門

~「TDD Boot Camp 東京 for C++」向け ~





■はじめに

2011年10月8日に「TDD(テスト駆動開発) Boot Camp 東京 for C++」向けを開催させていただくこととなりました。
この勉強会を開かせていただいたのは、私が参加させていただいた、「TDD Boot Camp 東京 1.6」が大変に面白く、ゲームの開発でももっと広く実践してほしいという気持ちがあったからです。
もちろん、TDD(テスト駆動開発)は、専用のデバイスや画面表示を行うゲーム開発では難しいところも多いのですが、 モデルの部分には十分に適応でき、行っていれば出ないバグもあったなぁと、感じます。
ということで、今回の勉強会でも、それ以外でも、一度はTDDを体験していただいて、確実性を増す開発スタイルについて考えてみるきっかけとなればと思います。

さて、私がTDDBCを受けた前日に「SCM Boot Camp in Tokyo」という勉強会にも参加しました。この勉強会は、分散バージョン管理システムの概念・思想・パターンを勉強する会で、私はGitについてまながせていただきました。
バージョン管理システムは、多くの現場で使われていると思いますが、その中でも分散バージョン管理システムは容易にブランチを作成することができ、細かい単位でソフトウェアを作り上げるのに適しています。 これはTDDに合っていると思いますし、分散バージョン管理システムを使うことで、よりアジャイルな開発が実現できるものと考えています。

ということで、TDDBC 東京 for C++では、Gitで進行を管理することにチャレンジしようと考えました。
といっても、コンフリクトが起きるような状況も発生しませんし、うまくいかなくても、 GitHubから普通にダウンロードして作業できる設計にしました。


■Gitとは

Gitはリーナス・トーバルズによって開発された分散型バージョン管理システムです。Linuxのカーネルを始め、多くのプロジェクトで使われています。
GitHubはgit のプロジェクトホスティングサービスで、railsの管理などで使われています。 オープンなプロジェクトなら無料で300MBのディスクスペースをもらうことができます。


■Gitのインストール

GitHubを使うには、ローカルにGitの環境を用意する必要があります。
Windowsの場合は、msysgitというオールインワンのパッケージがありますので、これをインストールするのが楽でしょう。
msysgitのプロジェクトページ(http://code.google.com/p/msysgit/)から、 ダウンロードページに行きます。


ダウンロードページから最新のインストーラーをダウンロードして実行します。


インストーラーを起動すると、いつものいろいろな「次へ」ボタンを押す項目の後に、コンポーネントの選択画面になります。
この項目は対して重要ではないので、問題がなければディフォルトのままで、クリーンな環境が良ければなるべく外してインストールしましょう。


また、その後にコマンドプロンプトなどでもGitを使うかという質問が来ますが、一番上にするのがシンプルでしょう。


その後、改行コードをどうするか聞いてきます。 GitHubでは、改行コードにLFを使うので、一番上を指定しておくのが面倒が少ないのではないでしょうか。


以上がインストール時の気になるポイントかと思います。 無事にインストールはできたでしょうか?
うまくインストールできれば、プログラムメニューからGit Bashを立ち上げれば次のようなウィンドウが開くと思います。


Git Bashが立ち上がったら、上記でも入力されている通り、 Gitの管理で使われる名前とメールアドレスを下記のように設定してください。

git config --global user.name "名前"
git config --global user.email "メールアドレス"

お疲れ様でした。


■GitHubのアカウント作成

GitHubに上がっているファイルをダウンロードするには、アカウントを作成しなくてもよいのですが、 バージョン管理にチャレンジするにはアカウントを取得しましょう。
GitHubのページ(http://github.com/)に行って、「Plans, Pricing and Signup」のボタンからアカウント作成に入ります。


ページに入ったら、有料プランを横目に見ながら「Create a free account」ボタンを押します。


すると、「ユーザー名」、「Emailアドレス」、「パスワード」、「パスワードの確認」の入力をします。
「ユーザー名」、「Emailアドレス」は、すでに使われていたら、駄目と言われます。
パスワードは、1文字以上は小文字と数字を含んだ、7文字以上のものを用意して下さい。


無事に登録できれば、Login/Log outタブからGitHubに出入りできます。


なお、GitHubのチュートリアルをみると、GitにGitHubの設定を登録するようにすすめられているので、 Git Bashから打ち込んでおきましょう。

git config --global github.user "GitHubのアカウント名"
git config --global github.token "GitHubのAccount AdminにあるAPIトークン"

「TDD Boot Camp 東京 for C++」では、ここまでのアカウントの作成が終了しましたら、 Imagireにユーザー名を連絡いただけたらと思います。今回のプロジェクトの共同開発者に登録させていただきます。


■公開鍵暗号の作成・登録

さて、Git BashからGitHubに安全にアクセスするには、SSHを使ってアクセスします。 GitHubでは公開鍵暗号のRSA暗号を使ってSSHでアクセスするようになっています。

公開鍵はGit Bashから「ssh-keygen」と入力して作成することができます。 この時、ファイルの保存場所を聞かれた後に、パスフレーズ(パスワード)を聞かれます。
ファイルの保存場所は自分のユーザーディレクトリ以下の「.ssh」というフォルダがディフォルトの場所になります。 とくに何もなければそのままでよいでしょう。
パスフレーズは、SSHでアクセスする使うときに聞かれるパスワードで、GitHubのパスワードと違っていて大丈夫です。

ssh-keygenがちゃんと終わると、.sshフォルダに秘密鍵「id_rsa」と公開鍵「id_rsa.pub」が作られます。
秘密鍵「id_rsa」は、誰にも中身を見られないように厳重にファイルを管理してください。


この公開鍵の情報をGitHubに登録します。
GitHubのページから、「Account Settings」タブを指定して、その後「SSG Public Keys」を選択してください。


その後、「Add another public key」で、公開鍵を登録します。


この登録には、.sshフォルダのid_rsa.pubをテキストエディタやメモ帳で開きます。


id_rsa.pubの中身を登録画面の「Key」の項目にコピペします。
「Title」の項目には、作業しているPCを識別する名前を入力します。
入力したら、「Add key」で鍵を登録してください。


登録されたら、追加した名前の項目が表示されていると思います。
この鍵が登録された状態になると、SSHを使ってプロジェクトにアクセスできるようになります。



■自動パスフレーズの設定

この後、Githubに頻繁にアクセスするようになるのですが、この際にファイルの変更などのアクセスでパスフレーズが求められます。
いちいちパスフレーズを入力するのは面倒なので、自動でパスフレーズを入力する設定をしましょう。

ホームディレクトリ(c:\Users\「ユーザー名」)に、「_netrc」というファイルを作成します。
「_netrc」の内容は、次のようにして下さい(パスフレーズが平文で書かれるので、他の人に見られないように注意してください)。

machine github.com
login GitHubのアカウント名
password SSHのパスフレーズ

お疲れ様でした。


■プロジェクトの初期化

それでは、いよいよソースコードを取り寄せましょう。
Git Bash を立ち上げると、ホームディレクトリで立ち上がるので、 プロジェクトのソースコードを置くフォルダ("My Documents"など)に移ります。
プロジェクト名のフォルダはのちほど掘られるので、ここではその上位となるフォルダに移動してください。

その後、「git clone」命令を使って、ファイルを引っ張ってきます。
複雑ですが、下の図のコマンドのように入力してください。


GitHubでプロジェクトを持ってくるときは、持ってくるプロジェクトの「Source」ページにリポジトリのアドレスが書かれています。
しかし、先ほど「_netrc」でパスフレーズを登録したために、アドレスに書かれている自分のユーザー名は省略してcloneすることができます。


ちなみに、cloneに失敗する場合は、共同開発者に登録されていないので、TDDBCではスタッフにお声掛けください。

成功すれば、プロジェクトフォルダが作成され、その中にVCのソリューションやソースコードが格納されます。


ここで、ディレクトリ名の後に、「(master)」と書かれているのが見えるかと思います。 「master」というのは、現在の作業のブランチ名で、 Gitで管理されているフォルダをGit Bashで見ると現在作業をしているブランチの名前を見ることができます。

■チームのブランチの作成

さて、ここは「TDDBC 東京 C++」だけの話題です。
今、「git clone」で持ってきたファイルは、今からのTDDの雛型となります。 このプロジェクトを自分で書き換えて課題をクリアーしていくことになります。
したがって、その結果は各チームごとに異なります。そのチームの結果を保存しておく場所として、 チーム専用のブランチを切りましょう。

Gitでプランチを切る(プロジェクトファイルを分岐させて、他の人に迷惑かけずに自分達の新たな作業スペースを確保する)には、 「git branch」コマンドを作成します。
「git branch master***」で、自分達のブランチを元のmasterブランチから分岐して作成してください。 (「master***」は「master」の後に自分達のチーム名を被らないように入れてください。)


次に、「git checkout "チームのマスター名"」で、ブランチを切り替えます。
ディレクトリ名の後のブランチ名を確認してください。

その後、「git push origin "チームのマスター名"」と入力してください。
これで、作成したブランチがGitHubの方に登録されます。 これで、この後の作業を、今後、いつでも見ることができるようになります。
ちなみに、「origin」は、GitHub上のリポジトリ(Gitで管理されているプロジェクト)を指します。

うまくいった場合には、GitHubのプロジェクトに新しいブランチが作成されたことが表示されます。 https://github.com/imagire/TDD-Boot-Camp-Tokyo-for-CPP/network



■作業のブランチの作成

Gitで作業するときの作業パターンの1つをここで紹介させていただきます。

Gitを使って作業するときには、masterのリポジトリ(チームのマスターでも)では、作業をしません。
developmentなどの別のプランチを作成して、そちらで新しい実装をして、 それをmasterでマージした後に大本のoriginを更新します。
このmasterでmergeする直前には、originから最新の状態を取りこんでからdevelopmentの更新をするようにします。
こうすることで、originでコンフリクトを発生させることなく(他の人に迷惑をかけることなく)、 masterの時点でmergeによるコンフリクトを発見できます (mergeでコンフリクトが起きればdevelopmentに戻って、コンフリクトが起きないように修正できます)。

mergeした後は、developmentに移って、development側でもmergeして、originの結果を取りこんでからdevelopmentの作業を続けます。


実際にこれを行うには、先ほどと同じようにして、「development」ブランチを作成します。
その後、チェックアウトして、「development」ブランチに移行した後、作業開始です。


なお、ここで説明した方法は、1つの開発ポリシーにしかすぎず、 他の(もっと進んだ)運営の仕方をしているチームはたくさんあると思いますので、 今後、いろいろと調べていっていただければと思います。


■実装プロセス

さて、ここでプログラミングです。
TDDですから、テストから実装を始めていきましょう!

たとえば、引き算関数を作るなら、期待されるテストを書きます (下の青く選択された部分が、今、追記した部分です)。


これではビルドが通らないので、引き算関数を作成しましょう。
中身は、まずはビルドが通るでたらめを書きます。

そしたら、main関数の最後にブレークポイントを設定して (下の図で赤丸が付いているように、そのポイントをクリックして、プログラムがそこで止まるようにします)、 プログラムを実行します。


うまくいけば、テストが赤く失敗するので、実装の中身を書く準備が整ったことになります。


さて、sub関数の中身も追加して、切りが良いところまで実装したら(TDDなら、[テスト作成]-[コード実装]-[リファクタリング]のループが終わったところがよいでしょう)、更新をGitに格納します。

具体的には、Gitで「add」コマンドを使用して更新ファイルを伝えて、「commit」コマンドで更新内容を記録します。
このタイミングでは、更新情報はdevelopmentブランチのみに格納され、masterやoriginには記録されません。


なお、「add」コマンドを使うときには、下記にあるように、ファイル名として「.」を指定して、更新した全てのファイルをGitに伝えることが多く行われます。 今回の場合には、自動更新されるファイルもいろいろとあるので、あえてファイル名を指定しました。

git add .

■GitHubを更新する

さて、何度かのコミットをへて、作業が一通り終了したら(ストーリーが一つ完了したら)、GitHubにあげましょう。
以下のようなコマンドを入力して、GitHubに更新を反映させます。


最初に、「checkout」コマンドで、作業場所をマスターに移します。

git checkout master名

マスターに移ったところで、「pull」コマンドでGitHubの最新のソースを持ってきます。
次に、「merge」コマンドで、作りこんだ修正をGitHubのコードと統合します。 ここで、エラーが起きたら、developmentに移ってうまくmergeできるように修正しましょう。
うまく統合できたら、「push」コマンドでGitHubのリポジトリを更新します。

git pull origin master名
git merge development
git push

その後は、再びdevelopmentブランチに戻って、マスターの内容を取りこんでから作業を進めましょう。 (といっも、今回は他のチームの人が触ることはないでしょうから、マージする内容はありませんが…)

git checkout development
git merge master名

以上のサイクルが終了すると、GitHubのサイトでは、作業が更新したことが見て取れます。



■最後に

以上で、かなりはしょったものになりますが、Gitでの一連の作業の流れを説明させていただきました。
Gitには、まだまだ多くの機能があります。今回の説明をきっかけにGitに興味を持っていただいて、 使いこなしてもらえれば嬉しいです。


もどる

imagire@gmail.com