初学者が覚えたいチーム開発でのGit操作

# はじめに
個人開発の場合はそんなに意識することがないGitですが、**チーム開発においては重要な役割を果たします**。

はじめのうちは構造が見えず混乱するかと思いますが、流れをイメージ出来ればそんなに難しいものではありません。

これを見れば**開発に必要なGitコマンドとリポジトリの構造、Githubでの管理手順を理解し開発の現場で実践できるようになります。**

# そもそもGitとは？

**変更履歴を記録・追跡するための分散型バージョン管理システム**である。

ざっくりいうとファイルのバージョン管理が簡単にできるツールといえます。


# 目次
[Gitを理解するための基本用語](#-Gitを理解するための基本用語)
[開発の流れ](#-開発の流れ)
[その他開発で覚えておきたい便利コマンドと注意点](#-その他開発で覚えておきたい便利コマンド)
[vscodeでのGUI操作について](#-開発の流れ)
[最後に](#-最後に)

# Gitを理解するための基本用語


# リポジトリ（repository）
**ファイルやディレクトリを入れて保存しておく貯蔵庫**

`リモートリポジトリ`...特定のサーバー上に設置して複数人で共有するもの。

`ローカルリポジトリ`...ユーザーごとに配置される手元のマシンで編集できるもの。


# クローン（clone）
**ファイルのダウンロードのようなもの**

**複数人で共有しているファイル（リモートリポジトリ）をまるごと自分のローカル環境（ローカルリポジトリ）に保存する機能**であり、ほとんどの場合Gitで最初に行う作業になります。


# ワークツリーとインデックス
`ワークツリー`...ユーザーが編集している作業中のディレクトリ
`インデックス`...ワークツリーと、ローカルリポジトリの中間領域


# コミット（commit）
**ファイルやディレクトリの編集作業をローカルリポジトリに記録するために必要な操作**

コミットを実行すると**編集した日時を記録したファイル**が生成されます。
コメントを付けることもでき、生成されたファイルは時系列順にならんで格納されるので、**ファイルを編集した履歴やその内容を確認することができる**わけです。


# プッシュ（push）
**ファイルのアップロードのようなもの**

リモートリポジトリに変更履歴がアップロードされて、**リモートリポジトリ内の変更履歴がローカルリポジトリの変更履歴と同じ状態**になります。


# ブランチ（branch)
**ファイルの編集履歴を分岐させて記録していく機能**

`mainブランチ`(画像のマスターブランチ)と、そこから分岐してバグの修正や、機能の追加を行っている`feacureブランチ`(作業ブランチ)を例に挙げると下記のようになります。
![Something went wrong](https://tcd-theme.com/wp-content/uploads/2019/12/branch-e1577097792246.png)

基本的にはこの`featureブランチ`で作業していくことになります。

# 追跡ブランチ
**リモートの変更を監視するブランチ**

リモートリポジトリをcloneした際に、ローカルリポジトリ上で作成される、**リモートリポジトリの更新を追いかける**（文字通り追跡する）ためのブランチです。

gitを確認してみると、ローカル上に存在する`「origin/main」`と表記されているものがあり、それが`リモート追跡ブランチ`です。作業ブランチとして切り分けたfeatureブランチにもそれぞれ追跡ブランチが存在します。


# プル（pull）

**fetchとmergeを一括に行う操作**

基本的にローカルのmainブランチを最新のものにする場合`git pull`を行います。

この後それぞれの操作の紹介はありますが簡単にまとめると
1.`fetch`で最新のリモートブランチを追跡ブランチに反映（ファイルの更新はまだ）
2.`merge`で追跡ブランチをローカルの`mainブランチ`へ反映
3.ローカルのmainブランチが最新のもに更新される(ファイルの更新が行われる)



# フェッチ（fetch）
**リモートリポジトリから最新情報をローカルリポジトリに持ってくる操作**　　

`fetch`はファイルが更新されるわけではなく、あくまでもローカルリポジトリが更新される(追跡ブランチが最新になる)だけの操作です。なので基本的にローカルのmainブランチを最新にするときはこのコマンドではなく、`git pull`を行います。　　




# マージ（merge）

**ブランチに最新の状態を統合する操作**　　

`git pull`で言うと追跡ブランチをローカルのmainブランチへ反映させる部分になります。
ブランチの履歴にないコミットのファイル変更を取り込むための操作です。


# 開発の流れ
- **mainブランチからスタート** 
  - ローカルリポジトリで`mainブランチ`に入る 
  - リモートリポジトリで`mainブランチ`の更新があるか確認
- **featureブランチ(作業ブランチ)で開発**
  - `featureブランチ`を切る
  - 開発
  - 変更箇所をローカルリポジトリで`commit`
- **レビュー**
  - リモートリポジトリへ`push`
  - `Pull Request`を出す
  - `PR`でレビューをもらう
- **mainブランチへマージ**
  -  `PR`のレビューが完了したら、`main`ブランチへ`merge`する

# mainブランチへ移動
```
$ git checkout main
```
# ローカルのmainに最新のリモートの状態を反映
```
$ git pull
```
コンフリクトを防ぐために必ずローカルのmainを最新の状態にする

# ブランチを切る
```
$ git checkout -b feature/new branch
```
ブランチ名はfeature/xxxとする

# 開発
**featureブランチの変更点はmainブランチには反映されないため**、バグや大事なファイルを消してしまっても再度mainブランチに戻ってfeatureブランチを切ればやり直すことができます。

# 追加・変更点をステージング
```
$ git add [指定]
```
# コミット
```
$ git commit -m "メッセージ"
```
コミットメッセージのフォーマットは、`"[コミット種別] #対応するPR番号 要約"`とする。コミット種別は以下の四種類を使う  

- fix (変更)
- add (追加)
- update (更新)
- remove (削除)

# リモートリポジトリへpushする
```
$ git push origin feature/new-branch
```

Githubのリモートリポジトリへ、ローカルリポジトリの変更を反映させます。
これでPRを出したり、他の人があなたの更新したコードを見えるようになります。

**masterブランチへ直接のpushはしないようにしましょう。**
`git push -f origin main`は絶対に使わないでください。

# プルリクエストを出す
Github上のリポジトリページに飛びます。
すると、pushしたブランチのPull Request (PR)を出せるようになっています。
画面上部の[Compare & pull request]を押し以下の手順で編集・作成してください。

![Something went wrong](https://camo.qiitausercontent.com/058c89ef06038b10ee25731879a45b85790c084c/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f3132373638302f61336536303765342d666165312d333935302d356266342d3463653366393238653930622e706e67)

①.レビュアーの指定
②.タイトルに`[ブランチ名]要約`と記載
③.概要や問題点などがあれば記載
④.[Create pull request]を押す

# レビューをもらう
修正箇所やバグがあればをコメントでレビューをもらい、**作業ブランチで対応したものを再度commit、push**します。これらを繰り返しmergeできる状態にしていきます。

# mainブランチへmerge
PRの[Conversation]タブを開き、一番下の[Squash and merge]をクリックしてください。[Squash and merge]がない場合は、▼を押してプルダウンから選択してください。

![Something went wrong](https://camo.qiitausercontent.com/d520f59dfdb067f7c1111b3ec0c7436a6c0be7b5/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f3132373638302f63626635663337342d633834642d313730362d646663312d6464323332653032376533332e706e67)

これでリモートのmainブランチにfeatureブランチで書いたコードが反映されます。


# その他開発で覚えておきたい便利コマンド

## 一時的にコミットせず退避させたい
作業中のブランチから別ブランチへ移動したいとなった時に、**作業が中途半端でコミットせずにブランチを移動したい**という状況で使えます。  
```
$ git stash
```
退避したものを戻す
```
$ git stash apply
```

移動先でのファイルの変更の対処など詳しい使い方は以下をご参照ください
[詳しい使い方はこちら](https://qiita.com/beanzou/items/7b8d3b7ca98855b1b37b)

# mergeしたけど取り消したい
**maergeを取り消して前の状態に戻したい**という状況で使えます
```
$ git merge --abort
```


# 最後に
自分自身の復習も兼ねて書きました。
チーム開発に初めて参加する方の参考になればと思います。

# 参考記事
[Gitとは何なのか。](https://www.google.com/aclk?sa=l&ai=DChcSEwj15aWYq-v5AhXOQ2AKHXHODvgYABAAGgJ0bQ&sig=AOD64_0l7wuBke6qo27u7zpTu0-SAARqvA&q&adurl&ved=2ahUKEwi9k5-Yq-v5AhUxzYsBHSjVC_wQ0Qx6BAgDEAE)
[Githubでチーム開発をするためのマニュアル](https://qiita.com/siida36/items/880d92559af9bd245c34)