【未経験エンジニア】Gitを用いたチーム開発の雰囲気をざっくり掴む

# はじめに
「Gitは勉強していたはずなのに...」とならないようにするために最低限の開発フローをまとめていきます。タイトルには**ざっくり**と書いていますが、できるだけ丁寧に説明していきますので、これからエンジニアとして働く方の力に少しでもなれれば幸いです。

# 対象読者
* 実務未経験でこれからエンジニアとして働く方
* Gitを勉強中でチーム開発でどのように活用するのか雰囲気を掴みたい方

# <font color="lightgreen">開発フロー</font>
## <font color="green">プロジェクトのクローン</font>
まずはプロジェクトをクローンしてきます。開発用のディレクトリを作成し、以下のコマンドを実行します。
```shell:shell
$ git clone <リポジトリURL>
$ cd <クローンしてきたディレクトリ名>
```

## <font color="green">ブランチ情報の確認・ブランチの作成</font>
リモートリポジトリのブランチ情報を確認します。
```shell:shell
$ git branch -r
  origin/HEAD -> origin/main
  origin/bug-fix
  origin/main
```

ここで注意しておきたいのが、これから取り組むタスクが
* **自分が先行して開発するのか / 自分だけで完結する作業なのか**
* **誰かの続きから作業を開始するのか**

上記どちらかなのかをしっかり確認することです。

:::note info
前者の場合、例えばバックエンド開発が既に終わっていて、これからフロントエンド開発を進める場合などがあります。
:::

前者の場合は、以下のコマンドでローカルにブランチを作成し、作成したブランチに移動しましょう。
```shell:shell
$ git branch <ブランチ名>
$ git switch <ブランチ名>
```
:::note
`git switch -c <ブランチ名>`で上記のコマンドを一発で実行可能です。
:::
後者の場合は、誰かが事前に作業ブランチをリモートにプッシュしてあるはずです。例えば、先ほど`git branch -r`の実行結果で`origin/bug-fix`というブランチが既にありました。このブランチから作業を始める場合、以下のコマンドでリモートブランチの情報をローカルブランチに持ってきましょう。

```shell:shell
$ git branch <ブランチ名> <リモートブランチ名(origin/bug-fix)>
$ git switch <ブランチ名>
```

## <font color="green">プルリクエスト(マージリクエスト)の作成</font>
これでどちらの場合でもローカルに作業ブランチを用意することができました。作業を始める前に、作成したブランチをリモートにプッシュしておきましょう。

```shell:shell
$ git push origin <ローカルブランチ名>
```
これでリモートにも作業ブランチを用意することができました。GitHub / GitLabのリポジトリ画面に行き、作業ブランチがあるか確認してください。また、この段階でプルリクエスト(マージリクエスト)を作成しておきましょう。作成方法は公式ドキュメントなどを参考に、最初は先輩エンジニアに聞きながら作成することを勧めます。
[【GitHub】pull request の作成](https://docs.github.com/ja/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/creating-a-pull-request)
[【GitLab】マージリクエストの作成](https://gitlab-docs.creationline.com/ee/user/project/merge_requests/creating_merge_requests.html)

:::note info
チームによるかとは思いますが、作業前にプルリクエスト(マージリクエスト)を作成しておくことで、作業準備が適切にできているか確認することができます。この段階で差分が見受けられた場合、ブランチの作成方法に何らかミスがありますので、先輩エンジニアにヘルプを求めましょう。
:::

プルリクエスト(マージリクエスト)作成後はローカルでの作業に戻ります。作業ブランチにいることを確認します。
```shell:shell
$ git branch
```
確認後、作業を進めていきましょう。作業後、`add`、`commit`していきます。それぞれで`git status`コマンドを実行し、ステージング、コミットされた変更が正しいか確認することを勧めます。
```shell:shell
$ git add .
$ git status
$ git commit -m "<コミットメッセージ>"
$ git status
```
コミットが問題なく行えていたら、プッシュしていきます。
```shell:shell
$ git push origin <ローカルブランチ名>
```
この段階でプルリクエスト(マージリクエスト)にて差分が確認できます。作業内容がしっかりと反映されているか確認しましょう。どのブランチをどのブランチにマージするのかも要チェックです。セルフチェック後、問題がなければプルリクエスト(マージリクエスト)をレビュアーに確認してもらいましょう。レビューでボコボコにされてOKが出ましたら、レビュアーにマージしてもらってください。

## <font color="green">作業ブランチの片付け</font>
マージ後、ローカルでの作業に戻ります。チームのルールによってはリモートの作業ブランチが削除されていると思います。リモートの情報が更新されていますので、`git fetch`コマンドを実行してからリモートブランチを確認しましょう。
```shell:shell
$ git fetch
$ git branch -r
  origin/HEAD -> origin/main
  origin/main
```
削除されていることが確認できたら、mainブランチに戻ります。
```shell:shell
$ git switch main
```
mainブランチの情報もリモートと差分ができているため、`git fetch`コマンドを実行してからマージしましょう。
```shell:shell
$ git fetch
$ git merge origin/main
```

:::note
`git pull`と同じですが、最初は`fetch`と`merge`それぞれの仕様を覚えるためにも`pull`は使わないことを勧めます。 
:::

これでローカルのmainブランチも最新の状態になりました。ローカルの作業ブランチを削除しておきましょう。
```shell:shell
$ git branch -d <ブランチ名>
```
これで一連の作業が完了しました。お疲れ様でした！
新しい作業を始める際は、これの繰り返しです。ブランチの作成から始めてください。ただし、作業を始める前は`git fetch`を忘れないように注意しましょう。

# おわりに
ここまで読んで頂きありがとうございました。私自身いざ実務に入るとコマンドが不安になったり、フローの理解に自信がなくなったりしていました。何なら練習用リポジトリのmainブランチでやらかして、先輩エンジニアに迷惑をかけてしまいました。本記事で最低限の作業フローは網羅したつもりです。後は細かいテクニックでより便利に効率的に開発を進められるように私も勉強していきます。
何か誤りや質問等がありましたら遠慮なくコメント頂ければと思います。これからはQiitaにも投稿していこうと思いますので、皆様どうぞよろしくお願いいたします！