Gitとは

Gitはファイルのバージョン管理をする為のもの
バージョン管理をしないと、最新状態がわからなくなったり、いつ誰が何を変更したのかわからない。また、上書き修正してしまう恐れがある。
それらを防止するためにGitが使われる。

【構成】
個人ファイル → ステージングエリア → ローカルリポジトリ →　リモートリポジトリ
個人ファイル → ステージングエリア：git add
ステージングエリア → ローカルリポジトリ：git commit
ローカルリポジトリ →　リモートリポジトリ：git push
リモートリポジトリ →　ローカルリポジトリ：git pull

・バージョン確認
```git:sample
git version
```

・初期設定
```git:sample
〇ユーザー名登録
  git config --global user.name "github user name"
  git config user.nameで登録確認
〇メールアドレス登録
  git config --global user.email "github@useremail"
  git config user.emailで登録確認
〇使用エディタの登録
  git config --global core.editor "atom --wait"
  git config core.editorで登録確認
```

・ローカルリポジトリの作成
リポジトリとは、ファイルやディレクトリの状態、変更履歴を記録する場所。
"git init"コマンドでリポジトリを新規作成する
→.gitディレクトリが作成され、変更ごとにファイルが格納される

・既にGithub上にあるプロジェクトをローカルにコピーする
```git:sample
git clone　<Github上のアドレス>
```

・変更確認
```git:sample
〇変更確認
  git diff  :個人ファイルとステージングエリアとの違い
  git diff --staged  :ステージングエリアとローカルリポジトリの違い

〇変更履歴の確認
  git log --oneline #一行で表示する
  git log -p index.html #ファイルの変更差分を表示する
  git log -n <コミット数> #表示するコミット数を制限する
```

・削除
```git:sample
〇ファイルの削除(ローカルリポジトリとファイル自身)
  git rm <ファイル名>
  git rm <ディレクトリ名>

〇ファイルを残したいとき(ローカルリポジトリからは削除するが、ファイル自身は残す)
  git rm --cached <ファイル名>
```

・取り消し
```git:sample
・変更を取り消す
git checkout -- <ファイル名> #個人ファイルの復元
git checkout -- <ディレクトリ名> #個人ファイルの復元
git checkout -- . #全変更を取り消す
git reset HEAD <ファイル名> #ステージの復元
git reset HEAD <ディレクトリ名> #ステージの復元
git reset HEAD . #全変更を取り消す
git commit --amend #直前のコミットをやり直す(pushしたコミットはやり直してはいけない)
```

・移動
```git:sample
・ファイルの移動
  git mv <旧ファイル>　<新ファイル>
  下記コマンドと同じ内容
  mv <旧ファイル>　<新ファイル>

  git mv <旧ファイル>
  git add　<新ファイル>
```

・リモートリポジトリ
```git:sample
〇リモートリポジトリ(Github)を追加
  git remote add origin <リモートリポジトリURL>
〇リモートリポジトリ(Github)を新規追加
  git remote add origin <リモート名><リモートリポジトリURL>

〇push
  git push <リモート名><ブランチ名>
  git push -u origin master #初回のみ実行、次回以降git pushコマンドのみでpushできるようになる
```

・エイリアス
```git:sample
〇コマンドにエイリアス(別名)を付ける
  →毎回長いコマンドを入力するのが面倒

  git config --global alias.ci #ci=>commit
  git config --global alias.st #st=>status
  git config --global alias.br #br=>branch
  git config --global alias.co #co=>checkout

  --globalを付けるとPC全ユーザーに反映

〇エイリアスを削除する方法
  git config --global --unset alias.co 

〇エイリアスの一覧を確認する
  git config --global　--list
```

・ignore
```git:sample
〇バージョン管理したくないファイルを記載した.gitignoreファイルを作成する
.gitignore

#から始まる行はコメント扱い
〇指定したファイルを除外
  index.html
〇ルートディレクトリを指定
  /root.html
〇ディレクトリ以下を除外
  dir/
〇/以外の文字列にマッチ[*]
  /*/*.CSS
```

・リモート
```git:sample
〇リモート情報を表示する
  git remote
  git remote -v #対応するURLを表示

〇リモートから情報を取得する(ローカルリポジトリに保存してから、個人ファイルに反映)
  git fetch <リモート名>
  git fetch origin
  情報はローカルリポジトリのremoteフォルダに格納されるため、個人ファイルには反映されない。反映させるコマンドはマージを使用する
  git merge /origin

〇リモートから情報を取得する(直接、個人ファイルに反映)
  git pull<リモート名><ブランチ名>
  git pull origin master

  上記コマンドは省略可能
  git pull

  これは下記コマンドを実行したのと同じこと
  git fetch origin master
  git merge origin master

〇pullとfetchの使い分け
  pullはリモートから直接情報を取得できるので楽だが、挙動が特殊なので慣れるまでは、fetch・mergeの方が良い

〇リモートの詳細情報を表示したい時
  git remote show <リモート名>
  git remote show origin

〇リモートを変更する
  git remote rename <旧リモート名><新リモート名>
  git remote rename turorial new_turorial

〇リモートを削除する
  git remote rm <リモート名>
  git remote rm new_turorial
```

・ブランチ
```git:sample
〇ブランチとは
  分岐することで複数機能を同時並行で開発するための仕組み
  ブランチとはコミットを指すポインタ

〇ブランチを作成するだけで、ブランチの切り替えまでは行わない
  git branch <ブランチ名>
  git branch feature

〇ブランチの一覧を表示する
  git branch
  git branch -a #すべてのブランチを表示する

〇ブランチを切り替える
  git checkout <既存ブランチ名>
  git checkout feature

〇ブランチを新規作成して切り替える
  git checkout -b <新ブランチ名>
  -bオプションを付けるとブランチの作成と切り替えを一度にしてくれるので便利

〇ブランチを変更する
  git branch -m <ブランチ名>
  git branch -m new_branch　#自分が作業しているブランチの名前を変更する

〇ブランチを削除する
  git branch -d <ブランチ名>
  git branch -d feature　#masterにマージされていない変更が残っている場合削除しない

〇強制削除する
  git branch -D <ブランチ名> 
```

・マージ
```git:sample
〇マージとは
  他の人の変更内容を取り込む作業の事
  git merge <ブランチ名>
  git merge <リモート名/ブランチ名>
  git merge origin/master #作業中のブランチにマージする

〇マージの概念
マージには3種類ある
1種類目：Fast Foward、早送りになるマージ
        ブランチが枝分かれしなかったときは、ブランチのポインタを前に進めるだけ
2種類目：Auto Merge、基本的なマージ
        枝分かれして開発していた場合、マージコミットという新しいコミットを作る
3種類目：コンフリクト
        同じファイルの同じ行に対して異なる編集を行った時に発生
```


GitHubを利用した開発手順
プルリクエストの流れ
プルリクエストとは、自分の変更したコードをリポジトリに取り込んでもらえるように依頼する機能
1.ローカルリポジトリのmasterブランチを最新に更新
2.ローカルリポジトリに新しいブランチを作成
3.ローカルリポジトリのファイルを変更
4.変更をコミット
5.GitHub(リモートリポジトリ)へプッシュ
6.GitHubでプルリクエストを送る
7.コードレビューしてもらう
8.プルリクエストをマージ
9.ブランチを削除
10.GitHub上のmasterをローカルリポジトリへpullし最新状態にする
11.ローカルリポジトリのブランチを削除

GitHub Flowの流れ
GitHub社のワークフロー
master → branch → プルリクエスト → master ...

・リベース
```git:sample
〇リベースとは、履歴をきれいに整えた形で変更を統合する
  git rebase <ブランチ名>　#ブランチの基点となるコミットを別のコミットに移動する

〇リベースとマージの違い
  履歴が一直線かそうでないか

〇リベースでしてはいけないこと
  GitHubにプッシュしたコミットをリベースするのはNG
  git push -f は絶対NG

〇マージかリベースは考え方次第
  ・マージ
  メリット：コンフリクトの解決が比較的簡単
  デメリット：マージコミットがたくさんあると履歴が複雑化する

  ・リベース
  メリット：履歴をきれいに保つことができる
  デメリット：コンフリクトの解決が若干面倒(コミットそれぞれに解消が必要)

〇使い分け
作業の履歴を残したいならマージ、履歴をきれいにしたいならリベース
```

・タグ
```git:sample
〇タグ
  コミットを参照しやすくするために分かりやすい名前を付けるのがタグ。
  リリースポイントに使用される。
  git tag #すべてのタグが表示される
  git tag -l 201705 #201705に該当するタグが表示される

〇タグには、注釈付き版(annotated)と軽量版(lightweight)の2種類がある
  注釈付き版(annotated)、情報量がある正式版。
  軽量版(lightweight)、情報量が少ない省略形。
  よく使用されるのが注釈付き版。

〇注釈付き版(annotated)
  git tag -a [タグ名] -m "[メッセージ]"
  git tag -a 20170520_01 -m "version 20170520_01"
  -aオプションを付けると注釈付きタブを作成。
  -mオプションを付けるとエディタを立ち上げずにﾒｯｾｰｼﾞを入力できる

〇軽量版(lightweight)
  git tag [タグ名]
  git tag 20170520_01

〇後からタグ付けする
  git tag [タグ名][コミット名]
  git tag 20170520_01 8a5cbc4

〇タグのデータを表示する
  git show [タグ名]
  git show 20170520_01

〇タグをリモートリポジトリに送信する
  git push [リモート名][タグ名]
  git push origin 20170520_01

  git push origin --tags 
  --tagsを付けるとローカルにあってリモートリポジトリに存在しないタグを一斉に送信する。
```

・スタッシュ
```git:sample
〇作業が途中でコミットしたくないけど、別のブランチで作業しないといけない。
  そういう時に作業を一時避難する。
  git stash (= git stash save) 

〇避難した作業を確認する
  git stash list

〇避難した復元する
  git stash apply #最新の作業を復元する(ワークのみ)
  git stash apply --index #ステージの状況も復元する

〇特定の作業を復元する
  git stash apply [スタッシュ名]
  git stash apply stash@{1}

〇避難した作業を削除する
  git stash drop #最新の作業を削除する

〇特定の作業を削除する
  git stash drop [スタッシュ名]
  git stash drop stash@{1}

〇全作業を削除する
  git stash clear
```