gitとは？gitを知るための基礎知識用語集

この記事ではgitとは何か，から`branch`の分け方`checkout`,`fetch`,`pull`,`add`,`commit`,`push`,`pullrequest`,`merge`とは何かについて簡単に記載する．

>gitでのプロジェクト管理方法は以下の記事から
>https://qiita.com/tarakokko3233/items/076e662aa7c93921a9a4

> conflictが起きた時，変更履歴を戻したいときの対処法は以下の記事から
> https://qiita.com/tarakokko3233/items/38de3bf197fc2a262d4b

# gitとは？
Git は，分散型バージョン管理システム（DVCS：Distributed version control system）の一つであり、ソフトウェア開発におけるソースコードの変更を追跡および管理するために広く使用されている．個人の開発からオープンソースプロジェクト、大規模な商用プロジェクトまで、あらゆる規模のソフトウェア開発で使用されています。また、GitHubやBitbucketなどのホスティングサービスと連携することで、リモートリポジトリの管理やコラボレーションがより便利になる．

:::note info
**バージョン管理システム（VCS: Version Control System)とは**
ファイルやプロジェクトの変更履歴を記録，追跡，および管理するためのソフトウェアツール．
>まあ噛み砕いて言えば開発時に色々な機能を実装すると思うが，ある機能が実装できて，新しいバージョンにしたいとき，変更をしたバージョンでのソースコードを保存でき，いつでもそのバージョンに戻せたり，他の人と共同作業するときにデータに整合性を保つこと(つまり，保存された履歴や変更内容が改ざんされていないことを保証すること)ができるということ

:::

# gitを使うための基本用語
### リポジトリ
VCSにおいて，プロジェクトのファイルや変更履歴を保存する中央の保管場所を指す．リポジトリは，プロジェクトの全てのバージョンと，それらの間の差分を含んでいる．

:::note info
あるリポジトリにある`.gitディレクトリ`にリポジトリのメタデータと履歴が保存される．
:::

リポジトリには2種類あり,GitHubのようなリモート上にあるリポジトリとローカルにあるリポジトリで区別できる.

**リモートリポジトリ**
GitHubやGitLabなどのホスティングシステムのサーバー上に存在し,インターネットを介してアクセスできるため,チームメンバー全員がアクセスでき,変更を共有できる.

**ローカルリポジトリ**
開発者のコンピュータ上に存在し、直接アクセスできるため,開発者自身のみがアクセスできる.開発者が個々の作業を行い,変更をコミットして更新する.この変更をリモートリポジトリにプッシュして更新する.



### クローン（clone）
リモートリポジトリのコピーをローカルに作成するコマンド．

![スクリーンショット 2024-05-02 22.23.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3757442/08203925-c3a6-ccdb-d670-9d133bf638b0.png)



クローンしたいディレクトリで以下のコマンドを実行してクローンする．

```
git clone <cloneしたいリモートリポジトリのgitURL>
```

:::note info
gitURLは大抵はホスティングサービス(GitHubなど)でリポジトリにアクセスするときのURLを入れれば良い．
:::


### ブランチ(branch)
メインの開発ラインから独立して，**新機能の開発やバグ修正**などを行うために使用される機能．ブランチを使用することで，複数の開発者が同時に異なる作業を行うことができ，それらの変更を後でメインラインにマージすることができる．個人開発の時も機能を分割して整合性を高めるためにブランチを分けることをお勧めする．

![スクリーンショット 2024-05-03 3.02.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3757442/086eb08a-52bf-9c3a-9228-6577db61577a.png)


Gitプロジェクトでは以下の3つの主要なブランチが使用されることが多い．

**main(master)ブランチ**
プロジェクトの主要なブランチで，製品版(本番環境)のコードを含む．**通常，直接このブランチに変更を加えることはない．**

**developmentブランチ**
開発用のブランチで，mainブランチから作成される．開発者は，このブランチで**新機能(featureブランチ)の統合**を行う．

**feature/--ブランチ**
新機能の開発やバグ修正のために，developmentブランチから作成される．各機能やバグ修正ごとに個別のfeatureブランチを作成する．開発が完了したら，featureブランチの変更はdevelopmentブランチにマージされる．**--は，その機能の名前をつける．**
> 機能名がEXAMDEV-001ならブランチ名はfeature/EXAMDEV-001とすると良い．


branchを作成するコマンドは以下の通りである．
```
git branch <branchの名前>
```
作業ブランチを切り替えるには以下のコマンドを実行する．
```
git switch <branchの名前>
```

リモートブランチをチェックアウトするならば
```
git checkout origin/<ブランチ名>
```

:::note info
現在存在するリモート&ローカルブランチを閲覧するには
```bash
git branch -a
```
:::


![スクリーンショット 2024-05-03 3.03.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3757442/11137d08-b911-760c-d3f3-d552d1b54430.png)

:::note info
上記の2つのコマンドを同時に実行するコマンドは以下の通りである．
```
git checkout -b <branchの名前>
```
特定のブランチ(またはコミット)をもとに新しいブランチを作成する方法は以下のコマンド．
```
git branch <新しいbranchの名前> <元のブランチ(コミット)>
```
:::
### プルリクエスト(Pull Request)
開発者が自分のブランチで行った変更を，mainブランチや他のブランチに統合してもらうために使用する．そして，他の開発者(プロジェクト管理者など)はその変更をレビューし，コメントやフィードバックを提供することができる．必要に応じて，プルリクエストの作成者は，フィードバックに基づいて変更を修正し，ブランチを更新(プッシュ)する．
> 一度あるブランチのプルリクエストを作成したらそのブランチにプッシュすればプルリクエストの内容が更新される．

>プッシュについては後ほど説明するのでブランチを現在の変更に更新するコマンドだと思ってほしい

プルリクエストはGitHubなどホスティングサービス上で行う．具体的には以下のように行う．
1．GitHubのリポジトリページに移動し，プルリクエストしたいブランチに移動する．
![スクリーンショット 2024-05-03 3.15.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3757442/2f95241b-198f-0b64-11c2-738b408ebdf8.png)

2．"Pull requests"タブをクリックする．
![スクリーンショット 2024-05-03 3.16.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3757442/6df09fa1-b3b0-1353-618d-91314264d709.png)

3．"New pull request"ボタンをクリックする．
![スクリーンショット 2024-05-03 3.21.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3757442/acbef093-974c-6494-6c54-bb09800963d5.png)

4．"base"ブランチ（通常はmainまたはdevelopment）と"compare"ブランチ（プルリクエストを作成するブランチ）を選択する．
![スクリーンショット 2024-05-03 3.18.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3757442/a51d84b6-6ae7-68f2-fa56-c1f004560ab2.png)
>今回は`feature/EXAMDEV-001ブランチ`から`developmentブランチ`にプルリクエストを作成する．

5．プルリクエストのタイトルと説明を入力する．
![スクリーンショット 2024-05-03 3.20.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3757442/2c70040c-1425-3bd4-029d-929a2cafdfba.png)


6．必要に応じて，レビュー担当者やラベルを割り当てる．
![スクリーンショット 2024-05-03 3.21.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3757442/e56e88a6-7795-e907-575b-07df8665da19.png)


7．"Create pull request"ボタンをクリックする．
![スクリーンショット 2024-05-03 3.51.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3757442/f596162d-2256-8498-e96f-550bfc1fbd8e.png)


これでプルリクエストが作成できた．

### マージ(merge)
あるブランチの変更を別のブランチに統合するプロセス．プルリクエストがレビューされ，承認された後，そのブランチの変更はメインブランチ（または指定されたブランチ）にマージすることとなる．マージが完了すると，プルリクエストのブランチは通常，削除される．マージをすると基本マージコミットが作成され，そのコミットをマージ先のブランチにてプッシュすることで統合が完了する．
>プッシュについては後ほど説明する．

![スクリーンショット 2024-05-03 3.04.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3757442/883b9a90-b7ff-22b3-d5d1-4ab8146e7ae8.png)

マージはGitHubなどホスティングサービス上で行う．

1．レビューが完了し，プルリクエストが承認されたら，"Merge pull request"ボタンをクリック．

![スクリーンショット 2024-05-03 3.27.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3757442/dbf6ff62-925b-cdb5-2273-bc760f545604.png)

マージの際には三種類の方法がある．

**Create a merge commit**
マージ時に新しいコミット（マージコミット）を作成し，両方のブランチの履歴を保持する．履歴が複雑になるが，マージの経緯を追跡できる．
コマンドでは以下の通りでできる．作業ブランチをマージ先のブランチにする．

```
git merge <統合したいbranch名>
```

**Squash and merge**
マージ元のブランチのすべてのコミットを1つのコミットに圧縮（スカッシュ）してから，マージ先のブランチにマージする．つまり，マージ元のブランチの個別のコミットは失われ，すべての変更が1つのコミットにまとめられる．履歴がシンプルになるが，マージ元のブランチの個別のコミットを追跡できなくなる．
コマンドでは以下の通りでできる．作業ブランチをマージ先のブランチにする．
```
git merge --squash <統合したいbranch名>
git commit
```

**Rebase and merge**
マージ元のブランチの変更をマージ先のブランチにリベース（再配置）してから、マージを行う．マージ元のブランチのコミットは，マージ先のブランチの先頭に順番に追加されることで，履歴がマージ先のブランチにまとまり，マージコミットは作成されない．
コマンドでは以下の通りでできる．作業ブランチをマージ先のブランチにする．
```
git rebase <統合したいbranch名>
git merge <統合したいbranch名>
```

2．"Confirm merge"ボタンをクリックし，プルリクエストをマージする．

![スクリーンショット 2024-05-03 3.59.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3757442/09ab9502-5015-1614-8e42-8a184a156d53.png)


3．マージが完成したので`feature/EXAMDEV-001ブランチ`は削除して良い．

![スクリーンショット 2024-05-03 3.52.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3757442/32c97230-2e1d-cbf3-9ef6-1dbe98bd7aa0.png)


### プル(pull)
プルはリモートリポジトリから変更を取得し，現在のブランチに統合するためのGitコマンド．
リモートリポジトリから最新の変更を取得し(fetchコマンド)，あるリモートブランチの変更を現在のローカルブランチに統合する(mergeコマンド)の二つを同時に実行するコマンド．

:::note info
他の人の変更を反映するのによく使う
:::

fetchコマンドは
```
git fetch origin
```

mergeコマンドは
```
git merge origin/<統合したいリモートブランチ名>
```

>**originとは**
>リモートリポジトリを表すデフォルトの名前．`git clone` コマンドを使用してリポジトリをクローンすると，クローン元のリポジトリが自動的に `origin` という名前で設定される．
>>つまり，`origin`は，リモートリポジトリの gitURLのことで，`origin/main`とはリモートリポジトリの main ブランチのこと 

プルのコマンドは以下の通りである．
```
git pull origin <統合したいリモートブランチ名>
```
![スクリーンショット 2024-05-04 0.06.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3757442/f8c594ab-afbc-9909-f916-63ec0ca1697c.png)

:::note info
***リモートブランチとローカルブランチの違い***
リモートブランチとローカルブランチは連携して機能し，リモートブランチは，リモートリポジトリの状態を表し，他の開発者との共有や同期に使用される．ローカルブランチは，実際の開発作業を行うために使用され，必要に応じてリモートブランチと同期される．
:::

### addとコミット(commit)
ワークディレクトリの変更をステージングエリアに追加(addコマンド)し，リポジトリの履歴に変更を記録する操作(commitコマンド)のこと．

addコマンドは
ワークディレクトリの全ての変更をステージングエリアに追加
```
git add *
```
ワークディレクトリのあるファイル，またはディレクトリをステージングエリアに追加
```
git add <ファイル名またはディレクトリ名>
```

commitコマンドは
```
git commit -m "コミットコメント"
```

:::note info
コミット時は何について変更したのか明示するためコメントは必ず書くこと
:::

**ワーキングディレクトリ**
プロジェクトのファイルが配置され，開発者が実際に作業を行う場所．

**ステージングエリア**
コミットする前の変更を一時的に保持する場所．

![スクリーンショット 2024-05-04 0.31.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3757442/3064eaf8-8a07-2785-3353-7610a3c29462.png)

### プッシュ(push)
ローカルの変更をリモートリポジトリのあるリモートブランチに送信するために使用される．

pushコマンドは
```
git push origin <プッシュしたいリモートブランチ名>
```

![スクリーンショット 2024-05-04 0.41.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3757442/0e55808d-a09e-d431-fce0-5dae010f0309.png)

:::note warn
例でmainブランチにpushしているがmainブランチにプッシュすることは基本ないのでfeatureブランチにpushすること
:::

以上の基礎知識を知った上でさらに便利なコマンドを知っていくと良い．さらにgitを用いたプロジェクトの進め方も学ぶと良い．