今更の5分でわかるGit

#はじめに
こんにちわ。普段はオンプレ環境のインフラ構築を行っているエンジニアです。
TerraformやAnsible等を使用したインフラのコード化に興味があり勉強しているのですが、
如何せん現在の案件ではGitやSVNといったバージョン管理ツールを使用する機会が無いため、1から学びまとめてみようと思います。
またGitを使用したことが無い方への情報共有にもなるように、概要をまとめていきます。

#目次
・Git（バージョン管理）とは？使用するメリットは？
・GitとGitHubの違い
・頻出用語
・Gitインストール




#Git（バージョン管理）とは？使用するメリットは？
Gitはテキストファイルなどのバージョン管理を行うためのソフトウェアです。

バージョン管理とは、ファイルの**変更内容**や**変更履歴**を保持しておいて、あとから古い状態に切り戻したりできるようにするためのものです。
バージョン管理ソフトを使用するメリットは大きく3つあり、


***1,ファイルの変更履歴が管理できる***
![https___qiita-image-store.s3.amazonaws.com_0_63338_0d0089c1-8a60-6d7e-85e3-cf57220e8070.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294638/cf51e1bf-4198-fc57-4c75-6ab3ab95ab90.png)
引用元：[【Git】オレならこう説明する！Git初心者への用語説明](https://qiita.com/nnahito/items/e546b27f73e7be131d4e)/@nnahito

上図だと、

・いつ
・誰が
・どのファイル
・どのように更新をかけたか

かがわからず、結局どのファイルが最新版なのかちんぷんかんぷんですよね。Gitであれば

12月9日 GNTさんがJavaコードに「Hello World」を追記

といった変更履歴を一元管理できます。
そのため、

・変更履歴を記載し忘れ、ファイルをどのように編集したかわからなくなる
・ファイル名に日付を付けて保存してたら大量のファイルができあがってしまう
・ファイル名に付ける日付を間違えてどれが最新のファイルかわからなくなった

といったケースを防ぐことができます。

**2,過去のファイルに戻せる**
誤ってファイルを消してしまった場合や上書き保存してしまった
場合でも、ファイルを過去の状態に戻すことができます。

「あ、間違ってファイル内容を更新してしまった、、」なんて青ざめた時にも、マザーテレサのような優しさで更新前の状態まで~~導いて~~復元してくれるのです。

**3,チーム共有できる**
1,2のメリットのおかげで、例えばチームで共同開発をしているアプリケーションのコードを管理するのに最適です。

![20180611172922.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294638/e881dbec-c168-184c-da34-f769081e9cc5.png)

また、上図のように世代管理されたコードの差異（diff）を表示することもできるので、
自身やチームでのレビュー時にも役に立ちます。

#GitとGitHubの違い
一言でいうと

**Git**→バージョン管理の仕組み
**GitHub**→Gitを利用したWebサービス


チームでファイルを共有するには、ファイルを置いておくためのサーバが必要です。
社内で共有サーバが有ればよいですが、複数拠点での跨いだ開発ともなると準備も大変です。
そこでGitHubはそのファイル置き場を用意し、WebベースでGitの機能を利用できるようにしてくれるのです。
（とても便利！）

更に、プルリクエストや作業項目管理機能（issue）といった便利な機能も多く用意されているため、全世界で1000万人以上の多くの人に利用されています。

要はGitだけでもコード管理はできるけど、GitHubがあるともっと便利！ということです。
このあたりは実際にGitを使用していくうちにすんなり理解できると思います。

#頻出用語

**リポジトリ**
ファイル置き場
ここにコードを書いたファイルなどを保存していく。
リモートリポジトリ（クラウド上やファイルサーバなど）とローカルリポジトリ（自身のPC）がある。

**プッシュ**
ローカルリポジトリをリモートリポジトリへアップロードすること。
あなたのPCからみてファイルを押しだす（Pushする）イメージ。

**クローン**
リモートリポジトリをローカルリポジトリへダウンロードすること
クローンはリポジトリにあるすべてのファイルをコピーしてくる。

**プル**
リモートリポジトリをローカルリポジトリへダウンロードすること。
あなたのPCからみてファイルを持ってくる（Pull＝引く）イメージ。

全てを持ってくるクローンに対し、プルは既にローカルリポジトリにあるファイルはダウンロードしない（=差分ダウンロード）

**ブランチ**
リポジトリのコピーのこと。
共同のアプリケーション開発では原則ブランチを作成（『ブランチを切る』とも言われる）し、
そこで開発を行うことが原則となる。
![https___qiita-image-store.s3.amazonaws.com_0_63338_31af2bb4-5e15-9dfd-e8c5-5a00fc8ccb3b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294638/c058466b-01b9-0727-a54e-81072d41cd2e.png)
引用元：[【Git】オレならこう説明する！Git初心者への用語説明](https://qiita.com/nnahito/items/e546b27f73e7be131d4e)/@nnahito
**マージ**
ブランチ同士を結合すること。
ブランチで作業を行い、それを元ファイル（『マスター』とも言われる）と結合させる。
![https___qiita-image-store.s3.amazonaws.com_0_63338_83ef9daa-3856-f10a-3f64-bc628d17acee.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294638/70cec94a-8f8a-adf6-8807-015d4a71bc16.png)
引用元：[【Git】オレならこう説明する！Git初心者への用語説明](https://qiita.com/nnahito/items/e546b27f73e7be131d4e)/@nnahito

##補足　何故リポジトリをリモートとローカルに分けるのか
まどろっこしいことしないで元からマスターで作業した方が良いんじゃない？とも思えますが、
複数人で作業するとこっちのほうが作業しやすいのです。

アプリケーション開発だと安易なシステム改修はシステム全体にバグなどの影響与えてしまいます。
その為原則ブランチで作業を行い、他メンバーのレビュー後にマージする。というのが普通です。

#Gitインストール
ここまで頭に入れておけば大丈夫。
あとは習うより慣れろです。

Git、GitHubチュートリアルとしては、以下の記事がとても丁寧に解説してくださっています。
[非エンジニアのためのGit(バージョン管理ツール)の使い方](https://qiita.com/shiraji/items/3ec8b8e2035c0a0310be)

チームだけでなく一人でもGitは利用できるので、
是非とも実際に手を動かしてみましょう。

#参考記事
[【Git】オレならこう説明する！Git初心者への用語説明](https://qiita.com/nnahito/items/e546b27f73e7be131d4e)
専門用語を極力使わずにGitの説明をしてくださっています。
とてもわかりやすい！

[サルでもわかるGit入門](https://backlog.com/ja/git-tutorial/)
プロジェクト管理ツールのBacklogでGitを使用するためのGit入門記事。
チュートリアルはBacklogを使用したものなので参考程度ですが、概要理解にはもってこいです。