Git概要

# はじめに
はじめに、山浦清透氏の「Git： もう怖くないGit！チーム開発で必要なGitを完全マスター」というUdemyの講義を受けましたので、学習内容を整理したいと思います。
私は2年目のエンジニアですが、なんとなくGitを使っていましたが、再学習を兼ねて本講義を受講しました。分量もちょうど良いので、気になる方はぜひ受講してみてください。

# Gitとは
そもそもGitとは、バージョン管理ツールです。バージョン管理とは、チームで1つのドキュメントを編集している時に、誰がどのような変更を加えたかを管理することを言います。

Gitには大きく2つの領域が存在します。
![outline.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693671/cdb00700-aec6-be5c-8db2-86cbc018a587.png)

① : ローカルリポジトリ
→自分のPC上に存在するリポジトリ
* ワークツリー : ファイルを変更する領域
* ステージ：コミットする変更を準備する領域
* リポジトリ：コミットによりスナップショットを記録する領域

:::note information
スナップショット : Gitリポジトリ内の全ファイルの状態
:::

② : リモートリポジトリ
→オンライン上に存在するチーム全員の変更履歴を反映するためのリポジトリ



# データ管理
Gitリポジトリ内でのデータ管理方法をコマンドと一緒に説明します。今回はindex.htmlというファイルをコミットする際のデータ管理を例とします。

1. git addコマンドの実行
→index.htmlのファイル内容を圧縮した圧縮ファイルAが作成されます。そして、インデックスにindex.htmlと圧縮ファイルAが記録されます。
1. git commitコマンドの実行
→インデックスのファイル構成をもとにツリー1が作成される。ツリー1が作成されたらコミット1が作成されます。コミット1には作成者や日付、親コミットなどの情報が記録されます。

![commit.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693671/0650f147-52b2-6c6d-0d58-dde01f4773e0.png)


# フェッチ
フェッチとは、リモートリポジトリからデータをローカルリポジトリに取り込む操作のことです。


![fetch.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693671/18fb1519-f0fe-5fcb-328b-4a15fb9e4bd8.png)

ただし、フェッチで取得してきたデータはローカルリポジトリの`remotes/リモート/ブランチ`というブランチに取り込まれるため、別途`merge`コマンドで所望のブランチにマージする必要があります。

# プル
プルもフェッチと同様にリモートリポジトリからデータをローカルリポジトリに取り込みます。フェッチとの違いは、プルでは、ローカルリポジトリの作業ブランチにマージする処理まで実施します。つまり、プルで取得する内容が`hoge`ブランチで、ローカルの作業ブランチが`master`の時、変更内容を`merge`ブランチに取り込まれます。

# ブランチとは
ブランチとは、コミットを指したポインタのことです。以下の例は、コミット1,2,3という順でコミットされた状態を示しています。コミット3の時点では、`master`ブランチのみだったが、`feature`ブランチを作成した場合、それぞれのブランチはコミット3を指し示します。
さらに、HEADとは、現時点のブランチを指し示す役割を担います。

![branch.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693671/969a6424-17f8-6c4d-1b92-d037c76c6a87.png)


つまり、ブランチを切ると、ブランチを切った時点の最新のコミットから派生してコミットを記録していきます。

# マージとは
## Fast Foward
Fast Fowardとは、ブランチが枝分かれしてなかった時はブランチのポインタを前に進めるマージ方法のことです。
![ff.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693671/3232afd6-2260-0ee7-0f32-37657dd33959.png)

![ff1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693671/3fcee4b8-15e4-8b6e-768a-9837603a5ac0.png)

## Auto Merge
Auto mergeとは、ブランチが枝分かれして開発していた場合、マージコミットという新しいコミットを作る方法のことです。
![automerge.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693671/a47d92cd-6cce-0de7-c5ca-8904ec4403fc.png)

![automerge1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693671/5359f7b7-abc7-8b4c-d18c-a51d00c03651.png)

# リベース
リベースとは、変更を統合し、履歴をきれいに整えるための機能です。

![rebase.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693671/33a1a08c-7864-24b6-e04b-a3fa7507a90e.png)


マージとの違いはマージコミットの有無で、リベースではマージコミットが作成されないため、履歴がスッキリします。

# タグ
タグとはコミットを参照しやすくするためのものです。

* 注釈付きタグ : 特定のコミットオブジェクトのハッシュ値 + コメントを含んだタグ

* 軽量タグ : 特定のコミットオブジェクトのハッシュ値を含んだだけのタグ

# スタッシュ
コミットしたくない変更を一時的に非難する領域のこと

![stash.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693671/1ccad3c0-d1a0-045d-4425-edaf4cb34683.png)

ワーキングツリーやステージに変更を加えた後に、ブランチを切り替える時などに一時的に避難する時などに用います。![fetch.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693671/3a63532d-3cce-da3d-bf8a-43cd5ab1bddc.png)


# Tips
## コマンドにエイリアスを設定
エイリアスとは、コマンドの別名のことです。コマンド自体の文字数はそれほど多くないですが、頻繁に使うと入力が面倒です。そのため、Gitでは短い文字数のエイリアスを設定することができます。
以下コマンドを実行してください。
```
git config --global alias.<エイリアス> <コマンド>
```

ちなみに以下コマンドでconfigの状況を確認できます。
```
git config -l
```

## .gitignore
.gitignoreとは、Gitでファイル管理をしたくないファイルを設定するファイルのことです。Gitでは、リポジトリ内のスナップショットを記録するため、大きいファイルを極力管理から外すべきです。