github初めのいっぽ


##gitってなに
gitとはソースコードの変更履歴を保存して追跡できるようにするバージョン管理システムです。
もしファイルが壊れてしまったとか、新しい機能に挑戦したけどうまくいかないから元に戻したいっていう時に簡単に前のバージョンに戻ることができます。
gitを使わずにこれをやろうとするととても面倒です。webコースではこの面倒な方法でやってますが、、、
定期的にファイルを圧縮して自分のPCにとっておかないといけないのです。
gitのインストールはmacとwindowsで違うのでここでは説明を省きますが必須なのでやっておいてください。


##じゃあgithubって何？
githubはgitのシステムを利用して世界中の人がソースコードを保存、公開することができるようにしたウェブサービスです。
hubとは中心地という意味で、みんなのソースコードが集まる中継地点というわけです。
以下のメリットのおかげでチーム開発に適したサービス、もはやなくてはならないものになってます。
-分担作業ができる
-他人のコードをレビューできる


##リポジトリを作成しよう
前提としてgithubのアカウントは作成済みとして進めます。
まだアカウントを作ってない人は10分でできますので今やっちゃいましょう
github上にリポジトリを作成します。
リポジトリとは、ファイルやフォルダの状態を記録する保存場所のことです。

githubのマイページを開いて右上の New repository をクリックします
<img width="1410" alt="Screen Shot 2019-05-04 at 19.52.33.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294829/d89cf8ef-c6cd-c639-a896-6a8ce5c8a014.png">

Repository name 入力します。
管理したいアプリケーションの名前などわかりやすいものにするといいでしょう。
あとはCreate repository をクリックしたら完了です。
<img width="1410" alt="Screen Shot 2019-05-04 at 19.53.20.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294829/aafe5d70-a716-1cea-691c-52766dc3d967.png">

レポジトリを作成するとurlが発行されます。
あとで使うのでどこかにコピーしておきましょう。
<img width="1410" alt="Screen Shot 2019-05-04 at 19.53.33.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294829/af23f33f-5ad6-4c21-330a-b956a47d5d12.png">

###ローカルリポジトリとリモートリポジトリの説明
リポジトリにはローカルとリモート２種類あります。
ローカルリポジトリとは自分のPC上の保存場所です。
リモートリポジトリとはgituhubなどのwebサービス上の保存場所です。
上の作業ではリモートリポジトリをgithub上に作成しました。
<img width="816" alt="Screen Shot 2019-05-03 at 19.03.11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294829/1043b512-4d14-20e2-e8e3-10e1c2ed1cef.png">

リポジトリをチームメンバーと共有するためには「Collaborator」としてメンバーを登録します。
「setting」タグを開いて「Collaborator」を選択してください。
ユーザーネームかメアドで検索ができます。
<img width="1105" alt="Screen Shot 2019-05-08 at 12.14.56.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294829/fe38747a-e69a-9c0f-c8ff-50c9a06861eb.png">


##gitコマンドを使ってアプリケーションをgithubで管理しよう
まずはgithubで管理したいサンプルアプリケーションを作ります。

```
mkdir sampleapp
cd sampleapp
```

###git init 
gitでこのアプリケーションを操作しますという宣言のようなものです。
これによりローカルリポジトリの初期化が行われます。
一つのアプリケーションにつき一回行えばOKです。

```
git init
```

###add と commit
```
$ git add .
$ git commit -m "first commit"
```
addとはローカルリポジトリに変更履歴を渡すことです。
addだけでは変更したファイルは保存されていません。
コミットすることによりそれらのファイルをローカルレポジトリに保存します。
-m　はどういった変更をしたのかメッセージを残すオプションです。

`git status`でローカルリポジトリに変更したファイルが追加されてるか確認することができます


###originの設定
```
git remote add origin {リポジトリのurl}
```
ローカルリポジトリにコミットできたら次はリモートリポジトリにその内容をアップデートします。
しかし、リモートリポジトリはウェブ上にたくさん存在します。
そこでoriginという名前をつけてリモートの保存先を設定します
{リポジトリのurl} には先ほどリポジトリを作成した時にコピーしたurlが入ります。


##push
```
git push origin master
```
pushはローカルレポジトリに保存したファイルの追加、変更の履歴をリモートリポジトリにアップすることです。masterについては後述


##branchの説明
チーム開発で同時に作業するときに、同じファイルで作業をすると、コンフリクトが起こりやすくなります。
そこでブランチという仕組みを使います。Aさんは投稿機能の実装を担当、Bさんはcssファイル編集を担当などと作業ごとに分担することができます。
下図の一本一本の線がブランチです。
ブランチには大きくmaster,develop,featureの3種類があります。

###masterブランチ
gitは初めてコミットするとマスターというブランチを作成します。
以後他のブランチを作成しない限りプッシュするたびにマスターに追加していくことになります。
マスターはいわば本番環境で問題なく動く完成形です。
<img width="816" alt="Screen Shot 2019-05-03 at 19.03.25.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294829/970a1a31-65f6-b27a-2d96-697e3f84e793.png">

##developブランチ
チームメンバーがfeatureで開発したものを統合したブランチです。コードは常に安定した状態で、リリースする準備ができたら masterへマージします。リリース前はこのブランチが最新バージョンとなります。developブランチでは開発はしません。

##featureブランチ
developブランチからさらに切ったブランチです。実際にコードを書く作業ブランチになります。
作業が完了したらdevelopブランチにmergeします。


以下のコマンドでブランチを作成しましょう

```
git branch 　　　　　#今いるブランチを確認
git branch post 　　#postというブランチを新たに作成
git checkout post　　#postブランチに移動
```

postブランチに移動できたらファイルの中身を適当に変更をしてみましょう
変更したらその内容をコミットしてリモートにpushします。

```
git add .
git commit -m "投稿機能"
git push origin post
```

##ブランチをマージする
mergeとは他のブランチを統合することです。勝手にmergeしてしまうのはよろしくないので責任者にレビューしてもらってからmergeしましょう。github上で「pull　request」を送信します。「code」タブの中にプルリクエストボタンがあります。
責任者はコードレビューをして問題がなければマージします。

##git pull
マージしたことによりmasterが更新されました。最新版のmasterを「pull」コマンドで自分のローカルレポジトリに同期しましょう。
cloneでは全てのファイルを丸々ダウンロードしますが、一部のファイルや変更が加えられたファイルのみをリモートから取り込む時にはpullを使います。以下のコマンドはoriginというリモートリポジトリのmasterブランチから差分だけを取り込みます。

```
git pull origin master
```

##clone
他の人のソースコードを自分のローカルリポジトリに取り込みたい時に使います。

```
git clone {取り込みたいレポジトリのurl}
```


##リモートにブランチの情報を更新
ブランチを切ってもそれはローカルの中での変更
originにプッシュすることでブランチの情報も更新される


##いざ実践
Aさん
①アプリ作成
②githubにあげる

Bさん
①clone
②ローカルでブランチ作成
③add commit
④pushしてリモートにブランチを同期
⑤pullリクエスト

Aさん
③pullリクエストをレビューしてmerge
④ブランチ削除（リモートではボタンで、ローカルではコマンドで）
⑤git pull origin master で自分のローカルに最新版のmasterを同期