これだけ覚えるGit|技術情報

これだけ覚えるGit

これからのソース管理のスタンダード「Git」についてご紹介します。非常に多機能なツールですので、必要最低限のコマンドのみご説明します。

Gitを始めよう

ソースバージョン管理ツールには、「Subversion」「CVS」「VisualSourceSafe」など数多くあり、プロジェクトの特徴に合わせて使い分けられてきました。

近年、急速にGitが使われるようになり、今やソース管理のデファクトスタンダートとなりつつあります。今後新規案件でSubversionやCVSが使われることはなくなっていくと考えられます。

ただし、Gitは取っつきにくい点が多いのが難点です。Gitの考え方及び、コマンドラインでの使い方を習得しなければなりません。弊社でも多くのプロジェクトで採用されていますが、引き継ぎ時にGitがネックとなることがあります。

Subversionとの比較

ここでは、以前のデファクトである「Subversion」と「Git」を比較し、特徴を説明します。

Subversionの場合

チーム開発でSubversionを使うとき、中央リポジトリを用意するのが一般的な構成となります。コミットは中央リポジトリと接続(オンライン)されていないと行なうことが出来ません。

中央リポジトリへのコミットは他のメンバーに影響を及ぼすので、内容を十分に吟味してからコミットを行なう必要があります。作業中にとりあえずコミットするような使い方には向かず、手元で別ディレクトリにファイルを退避するなどの対応をすることもあります。

svnの特徴

Gitの場合

Gitでは、分散型という仕組みを使っています。下記の図のように、各人がリポジトリのコピーを所有し、リポジトリ同士で変更点を送り合って同期するという仕組みです。

このことにより、Subversionのように、いきなり中央リポジトリにコミットするようなことがなくなります。作業中のコミットを手元のリポジトリで行い、その後に複数のコミットを一つにまとめることで、コミットログを綺麗に保つことが出来ます。

gitの特徴

Gitを始める前に

Windowsの場合

Gitクライアントは、SourceTreeを使うのが現状最も無難と思われます。コマンドラインから使えるGit for Windowsなどもありますが、OS標準でないシェルを使うことになるため、Gitに慣れてからの方がいいでしょう。

Linux / OSXの場合

GUIのGitクライアントは利用せず、ターミナルから直にコマンドを実行することをおすすめします。これが面倒に思われる場合は、お使いのエディタにGitプラグインを導入してください。

OSXでは、homebrew経由でインストールすると良いでしょう。詳しくは:MacにHomebrewでgitをインストールする | e2esound.com業務日誌

GitHubに登録しよう

まず、GitHubにアカウントを作ることをおすすめします。GitHubはGitの最良の相方とも言うべきWebサービスです。以下のような恩恵を無料で受けることが出来ます。

Gitリポジトリを新規作成する

リポジトリを作成するには、下記の2つの方法があります。

リポジトリを用意したら、早速コミットを行ってみましょう。

コミットの基本的な流れ

コミットの基本的な流れは、下図の通りです。

commitの流れ

  1. まず、ファイルの編集を行います。
  2. コミットしたいファイルを git add ファイル名 コマンドで登録します。この操作を「ステージング」と呼びます。
  3. (オプション)git status コマンドを実行し、どのファイルがコミットされるかを確認します。
  4. (オプション)git diff コマンドを実行し、ファイルの差分を確認します。
  5. コミットを行います。コマンドは git commit -m "コミットメッセージ" です。

このように、コミットを積み重ねることで、変更点のログが出来上がっていきます。これをコミットログと呼びます。コミットログは、git log で確認することが出来ます。また、tigSourceTreeなどのツールを利用すると、よりグラフィカルにコミットログを閲覧することが出来ます。

2番目の手順「ステージング」は、やや独特な概念ですので、下記で説明します。

ステージングとは

Gitでは、コミットの前にステージングという段階があります。ステージングでは、次のコミットに何を含めるかを検討します。

このステージングによって、Gitでは複数の変更点が一つのコミット内に混じることを防いでいます。 git add . コマンドで全ファイルをコミットに含めることも出来ますが、意図しないファイルをコミットに含めないよう、実行後に git status で実行内容を確認してください。

実際のコミット例

では、コミットの流れを実例で見てみましょう。

g01

まず、AAA.txtBBB.txtという2ファイルがある状況を例にします。

編集中のフォルダの内容は、「ワークツリー」と呼ばれます。実ファイルのことと考えて問題ありません。

g02

ファイルをステージすると、「インデックス」という場所にファイルが登録されます。

登録にはgit addコマンドを使います。例では、すべてのファイルをaddするためにgit add .を実行しました。

g03

ファイルのコミットを実行します。コミットを行なうと、インデックスに登録されていたファイルの変更点がリポジトリに記録されます。

コミット時には必ず「コミットメッセージ」が必要です。後で誰かが見た時に、何の変更が行われたかわかりやすいよう、具体的に書いて下さい。

g04

さて、今度はファイルを変更して、もう一つコミットを作成してみましょう。

まず、AAA.txtを編集します。ここでgit statusコマンドを実行すると、AAA.txtはまだステージされていないため、これだけではまだコミットできません。

g05

次に、git add AAA.txtで変更点をステージしましょう。

ステージにより、インデックスにAAA.txtが登録され、コミット可能になりました。git statusを実行し、ステージされていることを確認してみましょう。

g06

コミットを行います。

このようにして、コミットログが積み重なっていきます。

リモートリポジトリとの同期

次に、他のユーザと変更点を共有するにはどうしたらいいか、ご説明します。

ここでは、GitHub(またはBitBucketやGitLab)を使っている前提として説明を行います。

まず、GitHub上に新規リポジトリを作成し、ローカルにそのリポジトリを予めcloneしておくとスムーズです。

Push

Pushは下記の手順で行います。

pushの流れ

  1. まず、コミットログを重ねます。コミットは一つ以上必要です。
  2. 次に、他のメンバーがコミットを行っていないかチェックしましょう。git fetch origin masterでリモートリポジトリの変更を取得します。
  3. git merge origin/master で取得してきた変更点のマージを行います。ここで変更点が衝突し「コンフリクト」が発生することがあります。コンフリクトの解消については、この記事が参考になります:Gitコンフリクト解消ガイド(git mergetoolの使い方) - Qiita
  4. ローカルの変更を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もぜひ使ってみてください。