この記事について
- Gitを使用した開発の一連の流れを説明します
- 「これを知っていれば基本的な開発は行える!」というレベルの内容を記載しており、「コミットを取り消したい」「Gitの設定内容を変更したい」などより詳細な内容は本記事では扱っておりません
対象読者
- Gitを使用して開発を始めたい方
- Gitの基本的な使い方を一通り学びたい方
Gitにおける2つのリポジトリ(リモートリポジトリとローカルリポジトリ)
Gitで使用するコマンドを説明する中でリモートリポジトリとローカルリポジトリという言葉を使いますので、まずはこの2つの言葉について説明します。
基本的な概念を説明しており、細かい点までは記載できておりませんので、ざっくりとこんな感じでGitでソースが管理されていると理解いただければと思います。
リポジトリの全体像
Gitではソースの履歴管理をサーバ上のリモートリポジトリと自分のPC上のローカルリポジトリに分けて行っております。(分散型バージョン管理システム)

リポジトリとは
Gitに限ったことではないですが、バージョン管理システムにおけるリポジトリとは、バージョン管理を行う対象のファイルやディレクトリを入れるための場所です。
(英語のrepositoryの直訳が収納場所であることからもこのイメージが付きやすいかと思います)
リモートリポジトリとは
あるサーバ上に作成・管理され、開発チーム全員が共有しているリポジトリです。
参考:リモートでの作業
ローカルリポジトリとは
各開発者のPC上(ローカル環境)で作成され、そのローカル環境でのみ管理されるリポジトリです。
自分が行ったソースの変更が他の開発者に影響を与えることなくまた他の開発者が行ったソースの変更で自分が影響を受けることなくソースの履歴管理を行えます。
ローカルリポジトリで変更した内容は、リモートリポジトリに反映(後述)しない限りはリモートリポジトリに反映されませんし、
リモートリポジトリで変更した内容は、ローカルリポジトリに取込(後述)をしない限りはローカルリポジトリに反映されません。
リポジトリがリモートとローカルで別れていることのメリット
- ローカルリポジトリでは自分が開発を行いやすいようにブランチ分けを行ったり、好きなタイミングでコミット・マージを行うことが可能です
(Subversionなど集中型バージョン管理システムでは、自分のコミットが即座にリモートリポジトリにも反映されるため、部分的にコミットなどが行いづらくなります) - リモートリポジトリ(サーバ)に接続していない状態でもコミット可能なため、開発環境の制約を抑えることもできます
(集中型バージョン管理システムでは、リモートリポジトリのサーバに接続していない限りはコミットが行えないため、開発環境に制約が生まれてしまいます)
Gitでの開発流れ
この画像の内容を以下の手順で説明します。
Gitはインストール済みとします。
- リモートリポジトリからローカルリポジトリを作成(コピー)
- ローカルリポジトリでブランチを作成
- ローカルの変更をステージング
- コミット
- ローカルリポジトリの変更をリモートリポジトリに反映
- リモートリポジトリの変更をローカルリポジトリに取込
- ブランチの削除(機能開発の終了後に行う)
リモートリポジトリからローカルリポジトリを作成(コピー)
サーバ上にあるリモートリポジトリを取得して、ローカルリポジトリを作成します。
ローカル環境でコマンドを実行したディレクトリの直下に、物理的にディレクトリが作成されます。
リモートリポジトリへの接続方法がhttpsの場合
git clone https://[ホスト名またはIPアドレス]/[グループ]/[リポジトリ].git
example.com上にグループsampleのリモートリポジトリtestが存在する場合
git clone https://example.com/sample/test.git
通常、画像のGitHubの例のようにリモートリポジトリ側でリポジトリのURLが表示されるため、そのURLをコピーして指定すると良いかと思います。

リモートリポジトリへの接続方法がsshの場合
(事前にSSH接続用の鍵を生成・登録してください。参考:Github使用時の例)
git clone ssh://git@[ホスト名またはIPアドレス]/[グループ]/[リポジトリ].git
ローカルリポジトリでブランチを作成
feature/#1ブランチを作成して、作成したfeature/#1ブランチに移動
git checkout -b feature/#1
git checkout -bは以下2つのコマンドを実行するのと同じ結果となります。
git branch feature/#1
git checkout feature/#1
リモートリポジトリを派生元のブランチとして指定する場合
(ここではリモートリポジトリのdevelopブランチを派生元とします)
git checkout -b feature/#1 origin/develop
以下コマンドによって現在のブランチ一覧(リモートリポジトリとローカルリポジトリのすべてのブランチ)を表示することができます。
git branch -a
ローカルで変更した内容をステージング
ローカルでファイルの内容を変更した際、以下のコマンドによってファイルをステージング(commit対象として扱うこと)することができます。
ステージング対象が複数ある場合は、ファイル名またはディレクトリ名の箇所を半角空白区切りで複数分指定します。
git add ファイル名またはディレクトリ名
以下ディレクトリの場合、test1-1.txt・text2-1.txt・test2-2.txtの3ファイルが(内容に変更がある場合は)ステージングされる
sample1
┗test1-1.txt
┗test1-2.txt
sample2
┗test2-1.txt
┗test2-2.txt
git add sample1/test1-1.txt sample2
git add .によって変更のある全ファイルをステージングすることもできますが、意図しないファイルがステージングされ得るため、基本的にはファイル名やディレクトリ名を指定する方が良いです。
以下コマンドによって現在のステージングの状況を確認することもできます。
git status
コミット

ステージング中のファイルをコミットします。
コミットコマンドのオプションの指定方法によって、コミットログの書き方が変わります。
※ローカルリポジトリでコミットしただけでは、まだリモートリポジトリ側では変更が反映されません。
vimでコミットログを記述したい場合
git commit
vimが立ち上がりログを記述することができます。
git commitコマンドのオプションで、コミットログを記述したい場合
git commit -m "doHogeメソッドを削除"
コミットログは1行で表示されます。
git commitコマンドのオプションで、複数行でコミットログを記述したい場合
git commit -m "doHogeメソッドを削除" -m "doHogeメソッドを使用していないため"
以下コマンドによって現在使用しているブランチの過去のコミットの内容を見ることができます。
git log
ローカルリポジトリの変更をリモートリポジトリに反映
git push origin feature/#1
リモートリポジトリにfeature/#1ブランチが存在しない場合は、feature/#1ブランチが新規作成されます。
リモートリポジトリにfeature/#1ブランチが存在する場合は、既存のfeature/#1ブランチの状態が変更されます。
リモートリポジトリの変更をローカルリポジトリに取込

「リモートリポジトリ上で、feature/#1ブランチからdevelopブランチへのpull requestがマージされるなどによりdevelopの状態が変更した。そのリモートリポジトリのdevelopブランチの状態をローカルリポジトリに反映したい。」などのケースで使用します。
(ローカルリポジトリではgit checkout developによりdevelopブランチに移動しているとします)
git pull origin develop
git pull origin developは以下2つのコマンドを実行するのと同じ結果となります。
git fetch origin develop
git merge origin/develop
origin developはリモートリポジトリ、origin/developはリモート追跡ブランチを指しています。
参考:Git のブランチ機能 - リモートブランチ
ブランチの削除(機能開発の終了後に行う)
ローカルリポジトリの削除

ローカルリポジトリのfeature/#1を削除します。
自分が使用しているブランチがfeature/#1である場合にはエラーとなるため、git checkoutによって別ブランチに移動後に削除する必要があります。
git branch feature/#1 --delete
※リモートリポジトリのfeature/#1はこの段階では削除されません。
リモートリポジトリで削除したブランチをローカルリポジトリに反映
リモートリポジトリ側で削除されたブランチも含めて、最新のリモートリポジトリの内容をリモート追跡ブランチに反映します。
git fetch --prune
git branch -aによって、ブランチが削除されたことを確認できます。
参考
Git の基本
GitとSubversionの構造的な違い|GitのブランチはSubversionのブランチとは全く違うモノ
ガチで5分で分かる分散型バージョン管理システムGit
リモートでの作業
【初心者向け】git fetch、git merge、git pullの違いについて
Git のブランチ機能 - リモートブランチ


