最近、一緒に仕事をするメンバーの流動性が高くなってきた印象があります。様々な開発を経験してきた人とかかわることが出来るので非常に刺激的なのですが、なかにはgitにあまり触れてこなかった人もいるので、gitを使う際に最初に知っておいた方が良いことをまとめてみました。(ここではイメージを持つことを優先するので、正確性に欠ける説明をする場合がありますがご了承下さい。)
前提
gitのイメージを持ちやすくするために、以下の前提で説明させていただきます。
- 一つのプログラムを複数人で分担しながら開発する
- gitで管理する対象は、
共同開発中のプログラム
- 自分のコード実装は
個人用PC
で行う - リモートリポジトリ(ここでは「バックアップ場所」程度の認識で良いです)は
個人用PC
とは別のあらかじめ決められたサーバーマシン上に存在する
gitとは
gitとは分散型バージョン管理システム
と言われることが多いです。ただこの単語だとわかりずらいので、単語を分解して説明します。
バージョン管理:
バージョン管理機能として主に以下を実施します。
- 更新履歴が残る
- 古いバージョンに簡単に戻せる(新しいバージョンにも簡単に戻せる)
- 複数人が個々に実施した変更を一つに統合できる
分散型:
サーバー上で最新バージョンを含むすべてのバージョンと更新履歴が管理されるだけでなく、個人が操作するPC
上にも様々なバージョンのバックアップが作成されます。これにより、サーバー上のデータが破損したとしても、個々の環境上のデータを持ち寄ることで、履歴等も含めてある程度の復元が可能になります。
「3つのソースコード置き場」を区別する
gitのファイル置き場には「リモートリポジトリ」「ローカルリポジトリ」「作業ディレクトリ」があります。
名称 特徴 リモート
リポジトリ開発者のPCとは別のサーバー上に存在するフォルダのコト
更新履歴等も保存されている
他者と共有されているローカル
リポジトリ開発者のPC上にあるがgitコマンドを通してしかさわることが出来ないフォルダのコト
更新履歴等も保存されている
他者と共有されていない作業ディレクトリ 開発者のPC上で実際に開発者が変更するフォルダのコト
他者と共有されていない各ソースコード置き場の関係のイメージ図
ブランチによるコードの目的別管理
開発中のプログラムを管理するには、更新(バージョン)の管理が必要になります。更新の管理と言っても、「レビューが終わっているバージョン」「結合テストが終わっているバージョン」「まだコーディング途中でデバッグが出来ていないバージョン」等様々なバージョンが存在します。これらのバージョンをチームの共通認識のもと管理する際に使用するのがブランチです。
例えばdevelop
ブランチには「実装(デバッグ含む)+コードレビュー」が終わった状態のコードが入っているものとします。個人作業を行うときはdevelop
ブランチを元にfeature/****
ブランチと言うブランチを作成し、feature/****
ブランチ上で作業を行います(feature/
の後に変更内容
の名称を付けて開発用のブランチ名とするのが一般的です)。コードに変更を加える前はdevelop
ブランチとfeature/****
ブランチは一致していますが、変更を加えた後はfeature/****
ブランチのみが更新されます。そしてfeature/****
ブランチで「実装(デバッグ含む)+コードレビュー」が終わるとfeature/****
ブランチの更新内容を、develop
ブランチに取り込みます。この一連の流れで開発する場合、個々のブランチには以下のルールが存在します。
名称 | 特徴 |
---|---|
developブランチ | 機能実装が完了したコードを管理する 結合部分の開発に利用可能 レビュー済みのコードなので複数人の確認がされていることを保証する 万が一想定外の動作をする場合はバグなので修正が必要 |
featureブランチ | 機能実装中のコード 動作保証はない 実装者が実装完了した後にレビューも実施される レビュアーの指摘を受けて追加変更が発生する可能性がある |
ブランチの作成に制限はありませんが、「ブランチの使い方に関するルール」には一般的なものがいくつかあります。(ブランチ戦略
と呼んだりします。余裕がある場合は目を通してみてください。)
gitの操作
クローン
リモートリポジトリ
を用いて自分の開発環境にローカルリポジトリ
と作業ディレクトリ
を作成すること。(操作③&操作④(初回))- クローンにより作業ディレクトリにmainブランチの最新状態が作られる。
フェッチ
リモートリポジトリ
の最新状態をローカルリポジトリ
に反映すること(操作③)- 作業ディレクトリは変わらない。
- 他者が
リモートリポジトリ
にプッシュ
をすると、リモートリポジトリ
と自分のローカルリポジトリ
にズレが生じます。このずれを解消するのがフェッチ
です。
プル
リモートリポジトリ
の最新状態をローカルリポジトリ
と作業ディレクトリ
に取り込むこと。(操作③&操作④)
コミット
作業ディレクトリ
で行った機能追加などの変更をローカルリポジトリ
に反映すること。(操作①)
プッシュ
ローカルリポジトリ
の内容をリモートリポジトリ
に反映すること。(操作②)
チェックアウト
- ブランチを切り替えること。
マージ
- ブランチ間に差分がある時に、一方のブランチに加えられた更新をもう一方のブランチに取り込むこと。
- 例:
feature/****
ブランチで開発した内容をdevelop
ブランチに取り込むことを、「feature/****
ブランチをdevelop
ブランチにマージする」という。
- 例:
その他のgitに関するキーワード
プルリクエスト(プルリク)
gitを用いた開発を実施する中で、他者にコードレビューを依頼する手法の一つにプルリクエスト(プルリク)
があります。プルリクは「プル
をリクエスト
する」ことなのですが、背景には「私の開発中のブランチを(ローカル環境に)プルしたうえで、レビューして下さい。」という意味があります。そして開発チームごとのルールに依存しますが、「レビューの結果問題なけれ、developブランチへのマージとリモートリポジトリへのプッシュをしてください。」という依頼が含まれることが多いようです。
最後に
最初にgitに持った印象は「コマンドで操作しなければいけない」「操作が複雑」などの理由で「とっつきにくい」といった感じの人も多いのではないでしょうか?しかし現在はSourceTree
などのgitクライアントツールも普及し、最初に感じたハードルはかなり低くなっっていると感じます。今回は最初の一歩を踏み出す際に知っておくべき内容として、入門的な内容を記載しましたが、gitの機能のほんの一部でしかありません。まだまだ覚えるべき機能はありますが、今回記載した内容を知っているだけでも大きな恩恵を受けることができるはずです。少しづつ知っている機能・使える機能を増やしていけばよいので、まずはココから始めてみてください。(ちなみに私は「gitのすべての機能を使いこなしている人はいない」と思っています。)