Gitの基本まとめ〜仕組み〜

# はじめに
チーム開発において作業効率を高め、ファイルの管理を簡単に行うことができるGitですが、Gitのことをよく理解しないまま開発を進めると、誤ったコミットや変更をpushしてしまい、大きな事故につながる可能性があります。
今回はそんなGitの概念や基本操作を理解できるよう、まとめました。

# Gitとは？
分散型バージョン管理システムのことです。
分散型バージョン管理システムは、ユーザーに対して専用のファイルの保管場所を提供します。ユーザーは個人の保管場所で作業するため、複数人で開発を進めることができます。
また、ファイルのバージョンを管理することで、 ファイルの最新状態や、いつ・誰が・何を変更したのかわかる他、変更以前の状態に戻すことができます。

# GitHubとは？ その特徴について
コードのホスティングサービス。
Gitでは、ファイルの変更履歴を管理しており、そのファイルやファイルの変更履歴をオンライン上で預かるサービスを提供しているのがGitHubです。
プルリクエストで複数人開発ができ、世界中のチームがGitHub上で開発を行っているため他チームのソフトウェアを見ることが可能です。

# 使用頻度の高いコマンド
- cdコマンド: ディレクトリを移動する
- lsコマンド: ディレクトリの内容を表示する。ls -aコマンドで、隠しファイルを含めたディレクトリ前内容を表示する
- mkdirコマンド: ディレクトリを新規作成する
- rmコマンド: ファイルを削除する
- cpコマンド: ファイルをコピーする
- mvコマンド: ファイルの移動とファイル名を変更を行う
- catコマンド: ファイルの中身を表示する

# Gitの基本的な仕組み
Gitはデータをスナップショットとして記録（ファイルを丸ごと保存）しています。
スナップショットで記録することで、変更差分の計算をすることがないため複数人での開発スピードを上げることが可能となります。
バージョンを記録しておくと、以前の状態に戻すことができます。
最新のコミットが、直前のコミットも一緒に記録しているため、コミットを辿ることで以前の状態に戻すことが可能です。

# Git操作の流れ
ローカルでスナップショットを記録　→　GitHub(リモートリポジトリ)へアップ 
![Gitの操作1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3336600/9972c4b7-6e9e-e1d1-bf29-796473cd8a5b.png)

- ローカルリポジトリ: 自分のPC上の履歴データの保管場所
- ワークツリー: 自分の作業している場所

ローカルは３つのエリアに分かれています。
ワークツリー　→　ステージ　→　ローカルリポジトリ
![Gitの操作:ローカル.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3336600/7d87ac33-c371-7d81-f881-918be30b8dc6.png)

1. ワークツリー（手元の作業場）でファイルの変更を行う
1. その変更をステージに追加（ステージでは記録する変更を準備）
1. ステージに追加された変更をスナップショットとしてローカルリポジトリに記録

# Gitのデータ構造
Gitは変更履歴を保存するとき、圧縮ファイル、ツリーファイル、コミットファイルという形でスナップショットを記録しています。

##### Gitオブジェクト
git add や git commit をしたときに圧縮ファイル、ツリーファイル、コミットファイルが作成されます。これらのファイルのことをGitでは、Gitオブジェクトといい、.git/objects ディレクトリの下に保存されます。

##### 圧縮ファイル
圧縮ファイルはファイルの中身そのものを圧縮したファイルのことで、ファイル名はハッシュIDとなります。blob(ブロブ)オブジェクトといいます。

##### ツリーファイル
圧縮ファイルには、元々のファイル名の情報が残っていないため、ファイル名とファイルの中身の組み合わせ(ファイル構造)を保存するためにあるのがツリーファイル。コミットをするとツリーファイルが作成されます。
ツリーファイルは ‘treeオブジェクト’といい、ディレクトリの一つの階層ごとに一つのツリーファイルになっており、ツリーファイルには圧縮ファイルだけでなくツリーファイルも保存されます。
ツリーファイルは構造や名前を持たない圧縮ファイルに構造を与えるためのもので、圧縮ファイルやツリーファイルを保存しています。
※ファイルの中身が同じでファイル名が違う場合、圧縮ファイルはファイルの中身をベースに作成されるため、圧縮ファイルは同じものになります。

##### コミットファイル
いつ、誰が、何を、何のために変更したのかその情報を保存するためにあるのがコミットファイル。コミットファイルは ‘commitオブジェクト’といいます。
1. コミットファイルの中身を確認すると、コミットした時点のtree(プロジェクトの一番上のディレクトリのツリーファイル)が保存されています。一番上の階層のツリーをコミットファイルに保存することで、コミットした時点でのスナップショットを記録しています。
1. 次にparent、親コミット(直前のコミット)を保存しています。Gitはこのように親コミットを保存することでコミットの履歴を辿れるようにしています。
1. 後に、作成者の名前とメールアドレス、改行、コミットメッセージと続きます。これにより、変更者と変更理由がわかるようになります。

# ブランチとは
ブランチとは、並行して複数機能を開発するためにあり、履歴の流れを分岐して開発していくためのものです。
分岐したブランチは、ほかのブランチの影響を受けないので、同じリポジトリで複数の変更を同時に進めることができます。

# ブランチの仕組み
分岐することで複数の機能を同時並行で開発するための仕組みがブランチ。
ブランチとは、コミットを指すポインタです。Gitでは、コミットでスナップショットを記録しており、parentでコミットを時系列で辿ることができます。これにより、時系列順に連なり、ブランチの作成や切り替え、マージが他のバージョン管理ツールより高速となります。
その結果、Gitは大規模開発において最も使われるツールとなり、普及しました。

- ブランチ: コミットIDを記録したポインタ
- HEAD: 現在作業中のブランチを指し示したポインタ

# GitHub Flowの流れ
GitHub Flow： GitHub社のワークフロー

##### ローカル
- mainブランチを最新の状態に更新
- ブランチを作成 
- ファイルを変更
- ローカルリポジトリに変更をコミット
- GitHubへプッシュ

##### GitHub(リモートリポジトリ)
- プルリクエストを送る
- コードレビュー
- プルリクエストをマージ
- ブランチを削除

# 参考
サル先生のGit入門: https://backlog.com/ja/git-tutorial/intro/01/
Udemy: もう怖くないGit！チーム開発で必要なGitを完全マスター: https://www.udemy.com/share/101WYW3@YFS8q-SuYTXCBaD8t9xwGvS2GTE9hRgFYempxyFNuFp9qKZMZ_oDMiLMCvUjRLptBg==/
&アンドエンジニア: https://and-engineer.com/articles/Yt4s9BAAACEA700C
Qiita: Gitを使いこなしたい！〜仕組みとコマンド24選〜: https://qiita.com/satona-oinuma/items/97205ca0ce04dcae2adb