実践的なGitの使い方

## はじめに
この記事は、Gitの実践的な使い方をまとめています。
Gitを初めて使う方が実際に手を動かしつつ、基本を学んでいただければ幸いです。

## Gitとは
最初にGitそのものについて少しお話します。

Gitは**バージョン管理システム** の一つです。
バージョン管理システムとは、成果物（コードやファイル）に加えられた変更を**リポジトリ**と言われるデータベースに記録するシステムです。

この記録を遡ることで、成果物の種々の変更が「いつ」「誰によって」「どんな理由で」加えられたのか確認できます。
バージョン管理システムが無い場合、変更履歴を確認するために、古い成果物を一緒に常に管理しなければいけなくなってしまいます。
結果、膨大な数のファイルを管理することでストレージが圧迫されたり、変更内容・理由が把握しづらくなったり、チーム作業が困難になったりするなど種々の問題が発生します。:point_down:

![Qiita用画像1_バージョン管理システム説明用.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3871207/a0bf3e9c-5609-46c4-a059-513d91b5f3cf.png)


バージョン管理システムには**中央集中型システム**と**分散型システム**があります。
前者はユーザーが一つのサーバーに接続することで、最新の成果物を取得できます。
後者は各ユーザーがリポジトリを持ち、お互いに同期し合うことで成り立ちます。
Gitは後者にあたります。
## Gitの環境構築
ここからは実際にGitを使うための準備を行います。

### Gitインストール
Gitをインストールしていない場合、以下からダウンロード・インストールを行ってください。
上からGit for Windows, Git for macの順にリンクを載せています。

自分のOSがWindowsなので、以降の説明はWindows向けになります。ご了承ください。

https://git-scm.com/downloads/win

https://git-scm.com/downloads/mac

### Gitホスティングサービスへの登録
次に、**Gitホスティングサービス**のアカウントを作成します。

Gitホスティングサービスは、後述のGitリポジトリをオンラインで管理し、アクセスできるようにするサービスです。`GitHub`や`GitLab`・`Amazon Commit`等様々な種類があります。

### Gitの初期設定
Gitのインストールが完了したら、ユーザー情報を設定します。
これはバージョン管理において「いつ」「誰が」「どんな理由で」を記録するために利用されます。

コマンドプロンプトを開き、以下のコマンドを入力してください。
```
git config --global user.name `user_name` #user_nameにはGitホスティングサービスに登録したユーザー名を入力
git config --global user.email `user_email` #user_emailにはGitホスティングサービスに登録したメールアドレスを入力
```
`global`オプションででPCのどこでGitを利用してもこのユーザー情報を付与できます。
以下のコマンドで、きちんと登録されたか確認することができます。
自分が登録したユーザー名・メールアドレスが表示されれば成功です。
```
git config user.name
git config user.email
```
以上で環境構築は終了です。お疲れ様でした。
## ブランチについて
実際にGitを使って資材管理をする前に、「ブランチ」という重要な概念を説明します。

ブランチは、特定のコミットの状態を保持するポインタのような存在です。
ある時点でのコミット（保存された変更履歴）から新しいブランチを作成する（**ブランチを切る**といいます）ことで、独立した作業領域を確保できます。
現在いるブランチは**HEAD**というものによって決定されています。

下の画像は`main`ブランチで最初のコミットを行った例です。
個人でGit管理しているファイルの初期状態は大抵このようになっています。
プロジェクトによりますが、最初のブランチ名は`main`・`master`・`develop`のいずれかであることが殆どです。

![Qiita用画像9_branchMain.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3871207/80f10c4b-cd77-4453-9f59-c9bc5a5be708.png)

コマンドラインで`git branch`を実行して、現在存在するブランチ一覧を確認します。
先頭にアスタリスクが付いたブランチが、現在いるブランチです。
現時点では`main`のみが存在していますね。

![Qiita用画像11_gitBranch確認.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3871207/55e4b536-9653-4c3f-a0dc-49e9774cb5f6.png)

ここでブランチを切ってみます。以下のコマンドをコマンドラインで実行してください。
```
git checkout -b <作成したいブランチ名>
```
今回は`feature-1`というブランチを作成しました。
`git checkout -b`コマンドを使うと、新たにブランチを作成すると同時に作成したブランチへ移動します。
もう一度`git branch`を実行すると、`feature-1`ブランチの作成・移動が行われていることが分かります。

![Qiita用画像12_gitCheckOut確認.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3871207/c78fa2f8-f10f-4e4a-8aba-e816fe967331.png)

HEADが指し示すブランチが`main`から`feature-1`へ変わっています。
以下のようなイメージです。

![Qiita用画像13_feature-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3871207/431698d1-de9d-45e3-bf33-4c87f9ff925c.png)

この状態で、`Greetings2.txt`を編集・保存し、コミットします。

![Qiita用画像14_Greetings2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3871207/ac10a6db-5fd1-4670-b67b-17a7349e5789.png)

![Qiita用画像15_Greetings2Committed.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3871207/5b2150d0-04ef-4b4d-b158-222ad0963a04.png)

以下画像のようなイメージです。

![Qiita用画像16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3871207/ea8ae16c-3341-404d-a1c4-999d21fe7ec5.png)

現時点では、`feature-1`ブランチで行われたコミットは他のブランチからは見えません。
以下コマンドのいずれか実行して`main`ブランチに移動し、`Greetings2.txt`を開きます。
```
git checkout main
```
または
```
git switch main #git 2.23以降を使用している場合
```

![Qiita用画像17_gitSwitch.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3871207/8e71b765-6378-4f8a-9e9d-f9625068a4ac.png)

![Qiita用画像18_Greetings2OnMainBranch.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3871207/b1512e55-0e37-4d1e-b7f2-6bf14665be0a.png)

`feature-1`ブランチで追加した「Hello!」の文言がありませんね。
これは、`main`ブランチの状態がは`feature-1`でコミットを行う直前であるためです。
このようにブランチを適切に切ることで、複数人での開発が可能になります。

ブランチ同士は以下のコマンドで統合することができます。
```
git merge <統合したいブランチ名>
```
これは**マージ**と呼ばれ、コマンドの引数で指定したブランチの変更を現在いるブランチに反映することができます。

`main`ブランチにいる状態で、`feature-1`ブランチをマージする場合は以下のようになります。

![Qiita用画像19_gitMerge.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3871207/db38ae2c-ee8f-4145-972d-bbd2e73fbab6.png)

マージ後に`Greetings.txt`を開いてみます。

![Qiita用画像20_Greetings2AfterMerge.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3871207/76237aac-302e-4b6f-8d4c-7d493a2a5cab.png)

`feature-1`ブランチで行われた変更が`main`ブランチに反映されています。
最後に、必要なくなったブランチを削除しましょう。
```
git branch -d <削除したいブランチ名>
```

![Qiita用画像21_DeletingBranch.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3871207/c2fe62c1-483a-46dd-8164-2cd157f6404a.png)

Gitにおいては、このようにブランチを切ってマージすることが開発の基本になります。
## Gitを使ったファイル管理
ここからは、実際にGitを使ってプロジェクトファイルを管理する流れを説明します。
個人開発と複数人開発の場合で若干流れが異なるので、順に説明していきます。
### 個人開発の場合
#### 1. ファイル作成と編集
まず、Git管理したいファイルを作成します。
今回は`Qiita`というフォルダを作り、そこへGit管理する資材を格納します。
ここで見せているフォルダの場所・フォルダ名・資材名は任意に変更してください。

![Qiita用画像2_Git管理するフォルダの画像.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3871207/247caf46-6c48-4a35-86aa-f943613b5aea.png)

今回はこのフォルダ配下で`Greetings.txt`というテキストファイルを作成・Git管理します。
`右クリック→新規作成（W）→テキストドキュメント`または以下コマンドをコマンドラインで入力してください。
```
echo. > "C:\Qiita\Greetings.txt"
```
* `C:\Qiita\`は保存したいディレクトリのパスに置き換えてください。
* `Greetings.txt`は作成したいファイル名にしてください。
:point_down:のように新規ファイルが作成できれば成功です。

![Qiita用画像3_Git管理するファイルの画像.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3871207/285f5a58-da9f-47d7-9beb-3e54cbf882a3.png)

### 2. git init
このステップでは、ディレクトリ`Qiita`がバージョン管理対象フォルダであることをGitに認識させます。
同じディレクトリでコマンドラインを起動し、以下コマンドを入力してください。
```
git init
```
すると、同じディレクトリに`.git`という隠しファイルが作成されます。

![Qiita用画像4_git隠しファイル確認.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3871207/1d92ab36-7896-40e2-8e48-6ec9c545ff1c.png)

このファイルが表示されない場合は、エクスプローラー→「表示」タブ配下「表示/非表示」→「隠しファイル」のチェックボックスにチェックが入っていることを確認してください。

![Qiita用画像5_隠しファイルの表示非表示確認.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3871207/f43b47fc-13b1-4db6-95bc-43818eaddbce.png)

これでこのステップは完了です。
#### 3. 差分のステージング
ステップ３で`git init`を実行すると、`Greetings.txt`に「？」が表示されたことにお気づきでしょうか。

![Qiita用画像6_gitinit後のはてなマーク.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3871207/06b823fa-f909-4793-a863-3684c456394f.png)

これはGitが`Greetings.txt`をバージョン管理対象としてまだ認識していないことを表しています。
このディレクトリをコマンドラインで開き、`git status`と入力すると`Greetings.txt`が`Untracked Files`になっていることが確認できます。

![Qiita用画像7_Untracked_Files.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3871207/e523a2f4-d7be-4a0a-91a1-4f3674e6f916.png)


Gitはバージョン管理対象フォルダ内の資材を自動で追跡するのではなく、指定された資材のみ追跡するのですね。
では、`Greetings.txt`が追跡対象であることをGitに認識させましょう。
このディレクトリのパスをコマンドラインで開き、以下コマンドを入力してください。
```
git add Greetings.txt
```
`git add 資材名`でコミット（変更をデータベース上に正式に保存すること）の前段階である**ステージング**が完了します。
資材名の代わりに「*」を入力すると、追跡されていない資材を一意にステージング可能です。
入力後にもう一度`git status`と入力し、先程ステージングした資材が`Changes to be committed`一覧に表示されていれば成功です。

![Qiita用画像8_changestobecommitted.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3871207/139a0566-aac1-4c2c-ac95-d42bf41e070e.png)

以下のコマンドを入力して、ステージングしたファイルのコミットを行いましょう。
```
git commit Greetings.txt -m "Greetings.txtをコミット"
```
以上が個人開発におけるGit操作の一連の流れになります。
### 複数人開発の場合
次に、複数人開発でのGit操作の流れを紹介します。個人開発に比べて手順が増えます。
文章量を減らすため、個人開発の場合との重複部分は省略します。

#### 1. リポジトリのクローン
プロジェクトを初めて取得する場合のみ、ローカルにリモートリポジトリ全体をダウンロードする必要があります。
以下コマンドを実行してください。
```
git clone <リモートリポジトリのURL>
```
#### 2. 作業ブランチの作成
クローンしたリポジトリの`main`ブランチや`develop`ブランチから、作業用の新しいブランチを作成します。
以下コマンドを実行してください。
```
git checkout -b <作成したい作業ブランチ名>
```
クローンしたリポジトリのどのブランチにいるか分からない場合は、`git branch`で確認できます。今いるブランチには先頭にアスタリスクが付けられます。
#### 3. 作業ブランチで編集・コミット
個人開発における`3.差分のステージング`と同様の内容です。
#### 4. リモートリポジトリへコミットをプッシュする
先程のコミットはローカルで行ったものなので、他の開発者からはコミットの内容を見ることができません。
以下のコマンドで、ローカルで行ったコミットをリモートリポジトリへ反映します。この操作は***プッシュ***と呼ばれます。
```
git push origin main
```
`origin`と`main`は以下のように読み替えてください。
* **origin:** プッシュ先のリモートリポジトリ名
* **main:** プッシュするブランチ名

以上が複数人開発におけるGit操作の流れになります。
ここまで完了したら、レビュアーにレビュー依頼を出しましょう。
## 最後に
Gitは、個人開発から大規模なチーム開発まで、多くの場面で活躍する強力なツールです。
出来ることが多い分、はじめは慣れるのに苦労するツールでもあります。
この記事でまずは基本的な操作を覚え、少しずつ出来ることを増やしていきましょう。