初めてのGitは電車で例えて学ぼう！初学者向け基本Gitコマンド入門


## Gitを学びたての人へ

Gitを学びたての皆さん、こんにちは！今年の4月よりエンジニアとして新卒入社した [k_uki512](https://qiita.com/k_uki512)です！🎉
会社の新人研修や、プログラミングスクールでGitを初めて触り始めた方もいらっしゃるのではないでしょうか。そんな方が「分からない」という状態に陥りやすいのが <b>"Git"</b> のコマンドだと思います。

### 分からない理由を分析してみた
Gitのコマンドが分かりづらい理由として以下のような原因があると考えました。
- データをコマンドでやり取りすることがなかった
- 用語いっぱい。違いが分からない、、（add,commit…）
- データ（変更履歴）の流れが見えづらい

<b>つまり変更履歴という概念が抽象的かつ、pushまでのステップが多いことが原因だと考えました。</b>

そこで、この記事では<b>Gitの一連の流れを、わかりやすく電車に例えて解説していきます！</b>

この記事を通じてGitの流れを学び、会社での開発プロセスや新人研修に乗り遅れないようにしましょう！
本記事で、プログラミング初学者の方が少しでもGitについての理解を深めていただければ幸いです。

## 本記事の対象者
- Gitをはじめたての初心者
- 研修・カリキュラムでGitを学んだが何をしているか理解できていない方
- pushはできるけど、各コマンドの意味を理解しきれていない方
:::note info
本記事では、Gitで出てくる用語・要素を以下のように例えています。
- ローカル・リモートリポジトリ ⇒ 駅
- 変更履歴・データ ⇒ 荷物
- ステージングエリア ⇒ 改札内ホーム
- コミット ⇒ 電車
:::

# Gitを電車で例えてみた
## 全体像
Gitを電車で例えると、このようになります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2341225/d1a9f83c-4a51-3365-0dc2-a4f6f9e436f5.png)
これだけだとよくわかりませんね笑
これから各ステップを一つ一つ見ていきましょう。

## Git init ⇒ ローカルリポジトリ駅を作る
`git init`は地元駅（自分のPC上の駅）を作るコマンドになります。

自分の書いたソースコードをGitで共有するためには、gitの管理下である<b>リポジトリ</b>を作ってあげる必要があります。

`git init`をしてあげることによって、ここが駅（リポジトリ）だということを示す`.git`というフォルダが作成されます。

`.git`が存在するフォルダ配下が、ターミナル駅（GitHub）へデータを送るための開始点にもなる駅<b>「ローカルリポジトリ駅」</b>となるわけです。

駅の構内に入っている荷物（データ）がGitの管理下に入り、これが開発環境となります。ただし、まだ荷物は改札外にある状態です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2341225/63e7d347-e3dd-e368-6408-4907b25f0bc0.png)


次章からは、送る荷物を実際に改札内に通していきます。

:::note warn
警告
Ruby on Rails、Spring Bootなどのフレームワークでプロジェクトを作成した場合、デフォルトで.gitが作成されている場合があります。その場合、再度の`git init`は<b>不要です。</b>
.gitが作成されているかはターミナル上で `ls -a`とすることで確認可能です。
:::

## Git add ⇒ 送りたい荷物を改札に通す

それでは早速、荷物（変更履歴）を送りたい！となりますが、ちょっと待ってください。荷物を電車に乗せるためにはまず、<b>改札を通る必要がありますよね？</b>

この改札内に荷物を通す作業を担っているのが、`git add`となります。

ではなぜ、このコマンドが存在するのでしょうか？
ローカルリポジトリ内は、以下のような状態のファイルが混在している状態となります。

- 開発が完了したファイル（コミットしたい）
- 開発途中のファイル（コミットしたくない）
- 共有する必要のないデータ（エディタ独自の設定ファイルなど）

混在したファイルから<b>「コミットしたいもの」と「コミットしたくないもの」の仕分けを行うことが`git add`の役割となります。</b>

電車に例えると<b>梱包済みの荷物と未梱包の荷物を整理し、梱包済みの荷物のみを改札内に通す工程となります。</b>

`git add`が存在することで以下のようなことが可能になるのです。

- タスクAの変更履歴とタスクBの変更履歴を別々に分けてコミット（保存）する
- 特定の上げたくないファイル（個人データ）のみを除外する

また、仕分け後の荷物が置かれる改札内ホームのことを、<b>ステージングエリアと呼びます。</b>

改札内にある荷物は、`git status`コマンドで確認が可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2341225/d1d76870-30bf-e29e-ab97-c0642755bfb6.png)

## Git commit ⇒ 荷物を電車（commit）に乗せる
それでは、改札内ホーム（ステージングエリア）にある荷物を実際に電車に乗せてコミットとして保存していきましょう。
 `git commit`は、各車両にデータ（変更履歴）を乗せて、コミットとして保存するコマンドです。
 
 それぞれの電車（コミット）には車両の名前をコミットメッセージとして命名する必要があります。
また、電車を発車（プッシュ）するまでは、自分のローカルリポジトリ駅内で電車（コミット）は待機します。

- 荷物を積み込んだ車両（コミットの履歴）は、`git log`コマンドで参照することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2341225/482a1d7e-04f0-2273-ad49-53e6b929bb4c.png)

## Git push ⇒ 電車（commit）をリモートリポジトリ駅に送る
最後に、いよいよ荷物を積み込んだ電車（コミット）をGitHub駅に発車させていきます！

 `git push`で、電車（コミット）をリモートリポジトリ駅（GitHub駅）に向けて発車させます。
 
 電車は１本だけとは限らず、<b>蓄積されたコミットをまとめて送ることもできます。</b>
 
 また、GitHub駅では、他の駅から来た電車を受け取ることもできます。（`git pull`, `git clone`など）
 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2341225/4800ffc4-b840-1586-2db8-40e195acc12c.png)

## コマンドをもう一度見てみる
- `git init`: 現在のディレクトリをGitリポジトリとして初期化します。
⇒ <b>自分のPCに新しい駅（ローカルリポジトリ駅）を作る。</b>

- `git add`: ファイルや変更をステージングエリアに追加します。
⇒<b> 送りたい荷物（変更履歴）を仕分けして改札に通す。</b>

- `git commit`: ステージングエリアに追加された変更をコミットして、リポジトリの履歴に記録します。
⇒<b> 仕分けした荷物（変更履歴）を電車（コミット）に積み込む。</b>

- `git push`: ローカルの変更をリモートリポジトリにアップロードして共有します。
⇒ <b>自駅に止まっている電車をリモートリポジトリ駅（GitHub駅）に発車させる。</b>

Gitのコマンドも現実世界のものに例えてみると少しわかりやすく感じるのではないでしょうか。

## 最後に
今回は、Gitでデータを管理しGitHubに変更履歴を送信するまでの一連の流れを電車に例えて解説してみました！🙌

このGitの一連の流れは電車以外でも例えられると思うので、ぜひ皆さんの分かりやすい例え方を見つけてみてください！👍

この記事でちょっとでもGitへの恐怖心が減ってくれたら幸いです。開発の流れにスムーズに乗り遅れることなく参加していきましょう！