これだけ覚えるGit
これからのソース管理のスタンダード「Git」についてご紹介します。非常に多機能なツールですので、必要最低限のコマンドのみご説明します。
Gitを始めよう
ソースバージョン管理ツールには、「Subversion」「CVS」「VisualSourceSafe」など数多くあり、プロジェクトの特徴に合わせて使い分けられてきました。
近年、急速にGitが使われるようになり、今やソース管理のデファクトスタンダートとなりつつあります。今後新規案件でSubversionやCVSが使われることはなくなっていくと考えられます。
ただし、Gitは取っつきにくい点が多いのが難点です。Gitの考え方及び、コマンドラインでの使い方を習得しなければなりません。弊社でも多くのプロジェクトで採用されていますが、引き継ぎ時にGitがネックとなることがあります。
Subversionとの比較
ここでは、以前のデファクトである「Subversion」と「Git」を比較し、特徴を説明します。
Subversionの場合
チーム開発でSubversionを使うとき、中央リポジトリを用意するのが一般的な構成となります。コミットは中央リポジトリと接続(オンライン)されていないと行なうことが出来ません。
中央リポジトリへのコミットは他のメンバーに影響を及ぼすので、内容を十分に吟味してからコミットを行なう必要があります。作業中にとりあえずコミットするような使い方には向かず、手元で別ディレクトリにファイルを退避するなどの対応をすることもあります。
Gitの場合
Gitでは、分散型という仕組みを使っています。下記の図のように、各人がリポジトリのコピーを所有し、リポジトリ同士で変更点を送り合って同期するという仕組みです。
このことにより、Subversionのように、いきなり中央リポジトリにコミットするようなことがなくなります。作業中のコミットを手元のリポジトリで行い、その後に複数のコミットを一つにまとめることで、コミットログを綺麗に保つことが出来ます。
Gitを始める前に
Windowsの場合
Gitクライアントは、SourceTreeを使うのが現状最も無難と思われます。コマンドラインから使えるGit for Windowsなどもありますが、OS標準でないシェルを使うことになるため、Gitに慣れてからの方がいいでしょう。
Linux / OSXの場合
GUIのGitクライアントは利用せず、ターミナルから直にコマンドを実行することをおすすめします。これが面倒に思われる場合は、お使いのエディタにGitプラグインを導入してください。
- CentOSでは、
yum install git
を実行します。 - Ubuntuでは、
apt-get install git
を実行します。
OSXでは、homebrew経由でインストールすると良いでしょう。詳しくは:MacにHomebrewでgitをインストールする | e2esound.com業務日誌
GitHubに登録しよう
まず、GitHubにアカウントを作ることをおすすめします。GitHubはGitの最良の相方とも言うべきWebサービスです。以下のような恩恵を無料で受けることが出来ます。
- 無料でソースコードを保管することができます(ただし公開状態になることに注意)
- リポジトリごとにイシュートラッカー(バグやTODOなどをリスト管理することが出来る)を利用可能
- Wikiを利用可能
- プルリクエスト(コミットの取り込み依頼)を発行することが出来る
Gitリポジトリを新規作成する
リポジトリを作成するには、下記の2つの方法があります。
- フォルダを作成して、その中で
git init
を実行する。.git
というフォルダが作成されます。 - GitHub上でリポジトリを新規作成してから
git clone
を行なう。詳しくは、リポジトリ作成後に表示される操作手順に従って下さい。
リポジトリを用意したら、早速コミットを行ってみましょう。
コミットの基本的な流れ
コミットの基本的な流れは、下図の通りです。
- まず、ファイルの編集を行います。
- コミットしたいファイルを
git add ファイル名
コマンドで登録します。この操作を「ステージング」と呼びます。 - (オプション)
git status
コマンドを実行し、どのファイルがコミットされるかを確認します。 - (オプション)
git diff
コマンドを実行し、ファイルの差分を確認します。 - コミットを行います。コマンドは
git commit -m "コミットメッセージ"
です。
このように、コミットを積み重ねることで、変更点のログが出来上がっていきます。これをコミットログと呼びます。コミットログは、git log
で確認することが出来ます。また、tig
やSourceTree
などのツールを利用すると、よりグラフィカルにコミットログを閲覧することが出来ます。
2番目の手順「ステージング」は、やや独特な概念ですので、下記で説明します。
ステージングとは
Gitでは、コミットの前にステージングという段階があります。ステージングでは、次のコミットに何を含めるかを検討します。
このステージングによって、Gitでは複数の変更点が一つのコミット内に混じることを防いでいます。 git add .
コマンドで全ファイルをコミットに含めることも出来ますが、意図しないファイルをコミットに含めないよう、実行後に git status
で実行内容を確認してください。
実際のコミット例
では、コミットの流れを実例で見てみましょう。
まず、AAA.txt
とBBB.txt
という2ファイルがある状況を例にします。
編集中のフォルダの内容は、「ワークツリー」と呼ばれます。実ファイルのことと考えて問題ありません。
ファイルをステージすると、「インデックス」という場所にファイルが登録されます。
登録にはgit add
コマンドを使います。例では、すべてのファイルをaddするためにgit add .
を実行しました。
ファイルのコミットを実行します。コミットを行なうと、インデックスに登録されていたファイルの変更点がリポジトリに記録されます。
コミット時には必ず「コミットメッセージ」が必要です。後で誰かが見た時に、何の変更が行われたかわかりやすいよう、具体的に書いて下さい。
さて、今度はファイルを変更して、もう一つコミットを作成してみましょう。
まず、AAA.txtを編集します。ここでgit status
コマンドを実行すると、AAA.txt
はまだステージされていないため、これだけではまだコミットできません。
次に、git add AAA.txt
で変更点をステージしましょう。
ステージにより、インデックスにAAA.txtが登録され、コミット可能になりました。git status
を実行し、ステージされていることを確認してみましょう。
コミットを行います。
このようにして、コミットログが積み重なっていきます。
リモートリポジトリとの同期
次に、他のユーザと変更点を共有するにはどうしたらいいか、ご説明します。
ここでは、GitHub(またはBitBucketやGitLab)を使っている前提として説明を行います。
まず、GitHub上に新規リポジトリを作成し、ローカルにそのリポジトリを予めcloneしておくとスムーズです。
Push
Pushは下記の手順で行います。
- まず、コミットログを重ねます。コミットは一つ以上必要です。
- 次に、他のメンバーがコミットを行っていないかチェックしましょう。
git fetch origin master
でリモートリポジトリの変更を取得します。 git merge origin/master
で取得してきた変更点のマージを行います。ここで変更点が衝突し「コンフリクト」が発生することがあります。コンフリクトの解消については、この記事が参考になります:Gitコンフリクト解消ガイド(git mergetoolの使い方) - Qiita- ローカルの変更を
git push origin master
コマンドでリモートに送信します。
ここで出てくるorigin
とは、リモートリポジトリの名前です。普通はoriginという名前で登録しますが、別の名前で複数のリモートリポジトリを登録することもできます。
master
とは、デフォルトで選択されているブランチ名です。今回は解説しませんが、「プルリクエスト駆動開発」などを行う場合は、別のブランチを作る必要があります。
補足
git push / git fetch
ではなく、git push / git pull
の対応で紹介している入門記事もありますが、慣れるまではgit pull
は使わない方がいいでしょう。理由についてはこちらの記事が詳しいです:Git pullを使うべきでない3つの理由 · DQNEO起業日記
git push origin master
というコマンドを紹介しましたが、GitHub等ではmaster以外の「ブランチ」を作成して、プルリクエストで変更を取り込む手順が推奨されるようになってきています。本稿では紹介しませんでしたが、masterに直接コミットするのは危険という考えが一般的になってきています。gitに慣れたら、ブランチの使い方についても学習してみてください。
おわりに
Gitにはとっつきにくい点もありますが、現行ではベストのソリューションと考えられます。Gitがオープンソース文化の勢いの源となっていることは間違いありません。
単体で使うだけだと利点を感じにくいかもしれませんが、GitHubやGitLabと合わさると非常に開発効率向上に貢献します。プログラマーのモチベーションも高く保つことが出来るでしょう。ここでは紹介しませんでしたが、プルリクエストやIssue Trackerもぜひ使ってみてください。