Github(Git)の各機能を理解するための図解

Github(Git)の各機能を理解するための入門編として、それぞれ簡単な図を書いて使い方を説明してみます。

まずはじめにGithub の リモートリポジトリ に以下のようにmaster、hoge1、hoge2というブランチがあるとします。

Github
リモートリポジトリ
master
hoge1
hoge2

クローン(Clone)

Github
リモートリポジトリ
master
hoge1
hoge2

 ↓ クローン(Clone)する

自分のPC
ローカルリポジトリ
リモートブランチ ローカルブランチ
master master
hoge1
hoge2

クローン(Clone)すると自分のPCにローカルリポジトリが作成され、
リポジトリ内にリモートブランチ、ローカルブランチというグループが出来ます。

リモートブランチにはリモートリポジトリにあったブランチが全て作成され、
ローカルブランチにはリモートリポジトリにあったmasterが作成されます。

ブランチの作成

ブランチはローカルリポジトリの中にあるブランチならどこからでも作成できます。

例えばリモートブランチのmasterから認証機能を実装するためのadd_authというローカルブランチを作成したとします。

自分のPC
ローカルリポジトリ
リモートブランチ ローカルブランチ
master master
hoge1 └→ * add_auth
hoge2

ブランチの移動

Gitではローカルブランチを切り替えることで、作業をする環境を切り替えます。

ユーザ一覧画面を作成するためのローカルブランチを作成したとします。

自分のPC
ローカルリポジトリ
リモートブランチ ローカルブランチ
master master
hoge1 add_auth
hoge2 └→ * user_list

* の付いた場所が現在の位置で、add_authのソースコードを修正したい場合はadd_authブランチに移動します。
そうするとソースコードがadd_authのものに切り替わります。

自分のPC
ローカルリポジトリ
リモートブランチ ローカルブランチ
master master
hoge1 ┌→ * add_auth
hoge2 └─ user_list

このローカルブランチの移動をGitではチェックアウト(checkout)と呼びます。 ※SubversionSVN)を知っている方だとこのあたり少し違和感があります

プッシュ(Push)

Github
リモートリポジトリ
master
hoge1
hoge2
add_auth
←┐
 ↑
 ↑
 ↑
 ↑
 ↑
 ↑
 ↑
 ↑
─┘
自分のPC
ローカルリポジトリ
リモートブランチ ローカルブランチ
master master
hoge1 * add_auth
hoge2 user_list

プッシュ(Push)とは、修正を施したローカルブランチをリモートリポジトリへ送ることです。

プルリクエスト(Pull request)

プルリクエストとは、Github上でソースコードのレビュー(&マージ)依頼をすることです。

Github
リモートリポジトリ プルリクエス
master ←┐ add_authからmasterへのマージをするプルリクエス
hoge1  ↑
hoge2  ↑
add_auth ─┘

プルリクエストを出したあとにレビューを依頼して、依頼された人はGithub上でソースコードの差分を確認します。 問題があれば差し戻し、問題がなければそのままマージしたり(依頼者に戻してマージを促したり)します。

フェッチ(Fetch)

フェッチ(Fetch)とは、リモートリポジトリの最新をローカルリポジトリのリモートリポジトリに反映することです。
master、hoge1、hoge2の最新ソースと、先程プッシュ(Push)したadd_authがローカルリポジトリのリモートブランチへ反映されます。

┌─











└→
Github
リモートリポジトリ
master
hoge1
hoge2
add_auth
自分のPC
ローカルリポジトリ
リモートブランチ ローカルブランチ
master master
hoge1 * add_auth
hoge2 user_list
add_auth

マージ(Merge)

マージ(Merge)とは、他のブランチに加えられた変更をローカルブランチへ反映させることです。

先程、フェッチ(Fetch)をしたので最新のソースコードがローカルリポジトリのリモートブランチに反映されています。
例えば、最新のmasterブランチのソースコードをローカルブランチのadd_authへ反映させたい場合は以下のようにマージします。

自分のPC
ローカルリポジトリ
リモートブランチ ローカルブランチ
master master
hoge1 └→ * add_auth
hoge2 user_list
add_auth

プル(Pull)

プル(Pull)とは、フェッチ(Fetch)を行ったあとにマージ(Merge)を行う手順を1つにしたものです。

┌─











└→
Github
リモートリポジトリ
master
hoge1
hoge2
add_auth
自分のPC
ローカルリポジトリ
リモートブランチ ローカルブランチ
master master
hoge1 └→ * add_auth
hoge2 user_list
add_auth

スタッシュ(Stash)

ローカルブランチで開発をしていると開発途中で別のブランチへ移動したいことが度々あるかと思います。
その際、コミットしてから別ブランチへ移動するのがGitの流儀のようなのですが、コミットしたくない場合はスタッシュ(Stash)を使います。

以下、add_authで修正中のソースコードをスタッシュ(Stash)すると、スタッシュに修正中の内容が移動し、ローカルブランチでは変更ファイルがない状態になります。

自分のPC
ローカルリポジトリ
リモートブランチ ローカルブランチ スタッシュ
master master ┌→ edit_add_auth
hoge1 * add_auth
hoge2 user_list
add_auth

アンスタッシュ(UnStash)

アンスタッシュ(UnStash)とは、スタッシュに保持したファイルをローカルブランチへ戻したい場合に使います。

自分のPC
ローカルリポジトリ
リモートブランチ ローカルブランチ スタッシュ
master master  ┌ edit_add_auth
hoge1 * add_auth ←┘
hoge2 user_list
add_auth

フォーク(Fork)

フォーク(Fork)とは、リモートリポジトリを自分のアカウントのリモートリポジトリとして複製することです。

Github
リモートリポジトリ 自分のアカウントのリモートリポジトリ
master master
hoge1 hoge1
hoge2 hoge2

フォーク(Fork)を使う場合は、フォークした自分のアカウントのリモートリポジトリからクローン(Clone)し、自分のアカウントのリモートリポジトリへプッシュ(Push)して、そこからフォーク元のリモートリポジトリへマージするプルリクエストを出すことになります。

Github
リモートリポジトリ 自分のアカウントのリモートリポジトリ
master ←┐ master
hoge1  │ hoge1
hoge2  │ hoge2
 └ add_auth
↑↓
自分のPC
ローカルリポジトリ
リモートブランチ ローカルブランチ
master master
hoge1 * add_auth
hoge2 user_list
add_auth

コミット(Commit)

そもそもコミットの説明をしていませんでしたが、コミット(Commit)とは現在のローカルブランチへ修正を反映させることです。

例えば以下のようにuser_listブランチへ
2018/04/01 12:00:00 に 「基礎機能の追加」 をコミットし、
2018/04/02 12:00:00 に 「機能Aの追加」 をコミットし、
2018/04/03 12:00:00 に 「機能Bの追加」 をコミットし、
2018/04/04 12:00:00 に 「機能Cの追加」 をコミットしたとします。

すると以下のようにuser_listブランチのコミットログへ追加されます。

自分のPC
ローカルリポジトリ
リモートブランチ ローカルブランチ コミットログ
master master
hoge1 add_auth
hoge2 * user_list 2018/04/04 12:00:00 - 機能Cの追加
2018/04/03 12:00:00 - 機能Bの追加
2018/04/02 12:00:00 - 機能Aの追加
2018/04/01 12:00:00 - 基礎機能の追加
add_auth

リバート(Revert)

リバート(Revert)とは、既にコミットした内容を戻したい場合に使用します。

例えば先程追加したコミットログで機能Bの修正を戻したい場合に使用し、元に戻した修正として新たにコミットし、コミットログへ追加されます。

自分のPC
ローカルリポジトリ
リモートブランチ ローカルブランチ コミットログ
master master
hoge1 add_auth
hoge2 * user_list 2018/04/05 12:00:00 - Revert 機能Bの追加
2018/04/04 12:00:00 - 機能Cの追加
2018/04/03 12:00:00 - 機能Bの追加
2018/04/02 12:00:00 - 機能Aの追加
2018/04/01 12:00:00 - 基礎機能の追加
add_auth

リセット(Reset)

リセット(Reset)とは、特定のコミットのタイミングまで遡りたい際に使用します。

例えば先程のコミットログで、「機能Aの追加」をコミットしたタイミングに遡りたい場合は、リセット(Reset)を使用してそのタイミングまで遡ったソースコードに戻すことが出来ます。

自分のPC
ローカルリポジトリ
リモートブランチ ローカルブランチ コミットログ
master master
hoge1 add_auth
hoge2 * user_list 2018/04/02 12:00:00 - 機能Aの追加
2018/04/01 12:00:00 - 基礎機能の追加
add_auth

チェリーピック(Cherry Pick)

チェリーピック(Cherry Pick)とは、別のブランチへコミットされている内容を今いるローカルブランチへ反映させることです。

例えばリモートブランチのmasterからuser_list_newブランチを新たに作成し、
user_listブランチから「基礎機能の追加」をチェリーピック(Cherry Pick)してコミットすると以下のようにuser_list_newブランチへ別のブランチからコミットを移すことが出来ます。

自分のPC
ローカルリポジトリ
リモートブランチ ローカルブランチ コミットログ
master master
hoge1 add_auth
hoge2 user_list 2018/04/02 12:00:00 - 機能Aの追加
2018/04/01 12:00:00 - 基礎機能の追加
hoge2 └→ * user_list_new 2018/04/05 12:00:00 - 基礎機能の追加
add_auth
─┐
 ↓
 ↓
←┘

リベース(Rebase)

リベース(Rebase)とは、コミットした内容を変更したり、コミット順を入れ替えたり、複数のコミットを1つにまとめたりすることです。
要はコミットの整理整頓をすること。

自分がよく使うのは、コミットメッセージの修正や、細かくコミットしていた複数のコミットを1つにまとめる際に使います。

GitHub実践入門 ~Pull Requestによる開発の変革 (WEB+DB PRESS plus)

GitHub実践入門 ~Pull Requestによる開発の変革 (WEB+DB PRESS plus)

【改訂新版】Gitポケットリファレンス

【改訂新版】Gitポケットリファレンス

わかばちゃんと学ぶ Git使い方入門〈GitHub、Bitbucket、SourceTree〉

わかばちゃんと学ぶ Git使い方入門〈GitHub、Bitbucket、SourceTree〉