Git GitHub 基礎知識

###gitとは?
ソースコードを始めとするファイルの変更履歴を管理するためのシステム。
変更履歴を記録するシステムのことをバージョン管理システムと言う。

###「git」をなぜ使う必要があるのか? 「git」を使う上での利点は?
ファイルの変更履歴を管理するため。
何か問題があったときに過去のファイルに戻れるようにしておくため。

###githubとは?
gitの仕組みを利用したwebサービスのこと。
gitの機能に対してチーム開発に便利な機能と付け加え、gitにおけるリモートリポジトリの役割も担っている。
github上にチームで共有のプロダクト（ソースコード）を配置し、開発者はgithub上からソースコードをコピーしたり、ソースコードをgithub上のリポジトリに反映させることが出来る。

###github desktopとは?
gitを扱うためのGUIツールの一つ。
GUIツールとは、グラフィカルユーザインターフェースのことで、gitを扱う際に直感的な操作が出来るツールのことです。
githubdesktopは、githubが提供しているGUIツール。

###リポジトリとは?
変更履歴を管理しておくための入れ物。
このリポジトリにファイルやディレクトリの変更履歴を記録しておく。

###ローカルリポジトリとは?
自分のPC上（ローカル環境）に置くリポジトリのこと。
自分のPC上にあるファイルやディレクトリのバージョン管理を行いたいときに使う。

###リモートリポジトリとは?
外部のサーバなどのネットワーク上に置くリポジトリ。
複数人で管理下のファイルやディレクトリを共有することができる。

###リモートリポジトリのメリットは?
ネットワーク上に置くことで、複数人で管理下のファイルやディレクトリを共有することが出来る。
ローカル環境下で問題が起こったとしても、またリモートリポジトリからダウンロードを行うことで元に戻すことが出来る。

###クローンとは?　
リモートリポジトリを複製してローカルリポジトリを作成すること。
クローンを行うとリモートリポジトリの内容をそのままダウンロードすることが出来る。

###インデックスとは?
コミットをするファイルを登録するための場所。
ファイルをコミットすると、インデックスに登録されているファイル群の変更が記録される

###インデックスを使用するメリットは?
一度に多くのファイルを変更した際に、どのファイル単位でコミットするかを選択するために使用する。
インデックスに登録したファイル単位が一つのコミットとなるために、どのファイルをインデックスに登録するかを決める必要がある

###コミットとは?
ディレクトリやファイルの状態を記録するための操作。
コミットすることで現在の状態が、日時や変更を加えた人の情報を含めて一緒に保存することが出来る。

###コミットメッセージを書く目的は?
コミットメッセージとは、一つのコミットに対してつけるコメントのこと。
そのコミットでどのような作業をしたのかということを記録しておくために記述する。

###コミットする際に気を付けるべきこと
- コミットはなるべく細かく行うべき。1機能1コミットをするのがベター。
なぜなら、基本的にファイルを元に戻したいと思ったときには、コミットごとでしかファイルを元に戻すことが出来ないため。
- 余計なものはcommitするファイルに入れないこと
後から見た人が「これ編集してあるみたいだけど、どう関係してるファイル？」となってしまうため、
グループ開発だと、周りに多大な迷惑&手間をかけてしまうことがある

###pushとは?
ローカルリポジトリで加えた変更とリモートリポジトリに同期させること。
ローカルでコミットが終わり、リモートに変更を同期させたい場合には必ずプッシュを行う必要がある。

###ブランチとは?
リポジトリで管理をしているプロジェクトの履歴の1つで、自分の作業をしている場所のこと。
ブランチ同士は独立しているために、それぞれのブランチ干渉しあってはいない。

###ブランチのメリットは?
開発者ごとに担当する機能を明確に分けることが出来る。
完成途中や問題のあるソースコードをリリースしないで済む。

###プルとは?
リモートリポジトリの変更履歴をローカルリポジトリに反映させる操作のこと。
他の開発者による変更がリモートリポジトリに反映された後や、自分でマージを行った際には必ずこのプルの作業を行う必要がある。

###プルリクエストとは？
作成したブランチをmasterブランチにマージをするときの確認作業のこと。
ブランチ間の差分を他の開発者から確認やレビューを貰うということを行う。
そのコードに問題が無いかどうかを他の開発者や上司に確認を行うためにプルリクエストを見て貰う。

###LGTMとは?
Looks good to meの略であり、
「コードに問題が無いので、マージをして大丈夫ですよ！」ということ。
※LGTMを貰ったら、マージをしてプルを忘れずに行いましょう！

###マージ
機能実装のために作成したブランチを、master ブランチに統合する作業。
ブランチとブランチを結合すること。
結合する側のブランチを結合される側のブランチにマージを行うと、結合する側のブランチの内容が結合される側のブランチに反映される。

###デプロイとは?
ソースコードをAWS等の本番環境に設置し、稼働させること。
アプリケーションをサーバー上で利用可能な状態にすること。

###コンフリクトととは? どのような状況？
複数の人が同じ箇所を編集してしまい、変更箇所を自動では判断できすにマージできなくなること。

競合が起きる条件をしては、
2つのブランチで同じ箇所のソースコードを編集している。
片方のブランチをマージし、もう片方のブランチを同じブランチにマージをする。
という2つの条件が起こったときに、競合は発生する。

###「.gitignore」とは何のために存在しているファイル?
gitの管理対象から管理を外すためのファイルやディレクトリを指定するためのファイル。
.gitignoreにファイルやディレクトリを指定すると、管理対象から外すことができる。

###「.gitignore」の主な使用用途
管理対象から外れるということは、githubにコードやファイルを同期させ無くて済むということ。
・アプリケーションのlogファイル
・画像ファイル pulic/uploads 以下
・secrets.yml 等のセキュリティ上問題があるファイル
上記にあげたようなファイルを主にgitignoreに指定します。
これ以外にも、自分でgithubで公開したくないファイルも自分で指定をすることができます。

###/log/* という記述が.gitignoreのファイルにあった場合
logファイル以下のファイル、ディレクトリをgitの管理下から除外を行う指定を行っている。

###Github Flowの開発フローに乗っ取って開発を行うときの処理の流れ
1.masterブランチは常にデプロイできる状態とする
2.新しい作業をするときはmasterブランチからの記述的な名前のブランチを作成する
3.作成したローカルリポジトリのブランチにコミットする
4.GitHubのリポジトリ（リモートレポジトリ）に定期的にプッシュする
5.開発にあたり疑問点が生じた時やフィードバックがほしいときはプルリクエストを作成し、プルリクエストでやりとりする
6.他の開発者がレビューし、作業終了を確認したらmasterブランチにマージする
7.masterブランチへマージしたら、直ちにデプロイする