【開発出来るまで】gitとプルリクを総まとめ

#1,gitコマンド入門
##1-1,gitの設定とコミットまで(ローカル編)
###1-1-1,gitで一番最初にやること
  <font color="Salmon">ローカルにgitの設定をします。</font>

```sh
    //はじめる
    git init

　　　　　　　　//e-mailとユーザー名の設定
　　　　　　　git config --global user.name ユーザー名
　　　　　　　git config --global user.email メールアドレス

　　　　　　　//確認
　　　　　　　git config --list

   /* こんな感じの設定が出来ているはず
   * user.name=ユーザー名
   * user.email=メールアドレス
   */
```
ちなみに、ここで設定したものは<font color="MediumSlateBlue">~/.gitconfig</font>に以下のように保存されています。

```ini
[user]
        name = ユーザー名
        email = メールアドレス
```                                             
###1-1-2,変更をコミットする
<font color="Fuchsia">以下、ローカルでコードを変更(修正)をした後〜変更をローカルでコミットするまでのコマンドになります。</font>

gitにはワーキングツリー(今作業している場所)とステージング(インデックス)と呼ばれるどの変更差分を反映するかを登録する場所があります。
<font color="LightSalmon">*変更を登録するまでの流れ*</font>としては
--
1,変更差分をみて、
2,変更するファイルを選んでステージングに追加して、
3,変更を確定する。
です！

```sh
   //ファイルの更新状況の確認
　　　　　　git status

   //変更差分の確認
　　　　　　git diff

　　　　　　//変更をなかったことにしたいファイルがある場合(ファイルの変更差分を削除)
　　　　　　git checkout ファイル名

   //ステージングに追加(変更したいファイルの選択)
   ファイルを指定してステージングに追加したい場合
     git add　"ファイル名"
   全てのファイルを追加する場合
   　　　　git add --all
　　　　　　
　　　　　//変更差分の確定
　　　　　　　　　　git commit -m "コミットメッセージ(なぜその変更をしたのか)"
```

コミットをする（変更を確定する）だけなら

```sh
    git add --all
    git commit -m "なぜその変更をしたのか"
```
で可能ですが、コミットをする前には<font color="Red">変更差分を確認する</font>ことが望ましいです。
確認せずにコミットしてしまうと<font color="IndianRed">不要な変更分が間違ってコミット</font>されてしまったり、<font color="IndianRed">コードのインデントがずれているのに気づかない</font>などの問題が起きます。
不要な変更差分を修正してまたそれをコミットすると、コミットの履歴(後述)に本質的ではない変更が多く含まれてしまい、履歴が見にくくなってしまいます。


###1-1-3,コミット履歴の確認
コミットの履歴に関しては

```sh
　　　　//コミットの履歴の確認
  git log

  //最新の一件だけを取得
　　　　git log -1

  //特定の日(2019-05-01)までのログを取得
　　　　git log --until=2019-05-01

  //特定の日(2019-05-01)以降のログを取得
　　　　git log --since=2019-05-01

  //特定のファイル(ここではApp.js)のログを取得
　　　　git log App.js
```
で確認できます。

```
commit 195f1633e4dfa9095b3c9207e0e5a93751db3dfa
Author: kaitolll <kaitolll@gmail.com>
Date:   Wed Sep 6 16:27:02 2017 +0530
```
こんな感じのものが出てきます。
一番上のものがコミットIDと呼ばれるものでコミットの識別子になります。
Authorはオリジナルのコードを書いた人です(コミットした人ではないです)。
Dateはその日時です。

git-logには色々なオプションがあります。
以下が詳しいのでよければ参考にしてみてください。
https://git-scm.com/docs/git-log

- Authorとcommitter
  
<font color="Red">以下は、難しければ飛ばして1-1-4,ブランチを切るに進んでください</font>
gitのタイムスタンプはauthor-dateとcommiter-dateの二種類あり、--pretty=fullerオプションをつけることでcommiter-dateを見ることが出来ます。

```sh
　　　　//コミットの履歴の確認
  git log --pretty=fuller
```
出てくるのは、

```
Author:     kaitolll <kaitolll@gmail.com>
AuthorDate: Fri Oct 6 11:21:53 2017 +0800
Commit:     kaitommm <kaitommm@gmail.com>
CommitDate: Fri Oct 6 11:21:53 2017 +0800
```
こんな感じです。
なぜAuthorとcommitterが分かれているのかというと、複数人で開発する時に、コードを書いた人とコミットした人(履歴を登録した人)は必ずしも一致しないからです。
これは以下の1-1-4や複数人開発でのブランチモデルを説明した後に思い返してもらえると幸いです。

###1-1-4,ブランチを切る
開発をしていて実験的に変更を加えてみて、上手くいったら反映したいなみたいな時に、
コミットの履歴を登録する場所を切り替えることが出来ます。
最初に何もしていない場合masterと呼ばれるブランチ(履歴の記録場所)にコミットの履歴は積み重なっていきます。
そうするのではなくて別の場所に履歴を登録していき、その履歴をmasterに<font color="HotPink">必要に応じて反映させる</font>ということが可能です。
開発履歴を枝分かれさせることからブランチ(branchは英語で枝の意味です)と呼ばれています。

引用：https://git-scm.com/about/branching-and-merging
![branches@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320677/086eebe4-09f2-5bc8-214b-44890424b91f.png)

他のブランチの変更差分を取り込むことをマージと言います。(mergeは英語で統合するという意味です。)
枝分かれする元のブランチを<font color="DarkOrange">親ブランチ</font>、切った先のブランチを<font color="DarkOrange">子ブランチ</font>と言います。
ここでは扱いませんが親ブランチを持たないブランチを切ることも可能で、
<font color="Orange">Orphan(オーファン)ブランチ</font>と言います。Orphanは孤児の意味です。


```sh
    //ブランチ一覧を確認する
　　　　　　 git branch
    /* こんな感じでブランチ一覧が表示されます。
　　　　　　　　　　　　　　(developやdev1などmaster以外はサンプルとして作りました。)
       dev1
       dev2
       dev3
     * develop
       master
     ここで先頭に*が付いているものが現在の作業ブランチです。
　　　　　　　　　　何もブランチを切っていなければ
　　　　　　　　　　* master
　　　　　　　　　　とだけ表示されます。
　　　　　　　*/
　　　
　　　　　　//ブランチを切って子ブランチに移動。(切った時の作業ブランチが親ブランチになります)
　　　　　git checkout -b 子ブランチ名

  //作業ブランチを切り替える
　　　　git checkout 作業ブランチ名(作業したいブランチ名)

　　　　//現在の作業ブランチに他のブランチの変更履歴を取り込む
  git merge 取り込みたいブランチ名

　　　　//現在の作業ブランチに他のブランチの特定のコミットのみ取り込む
　　　　git cherry-pick コミットID

  //ブランチ名の修正
　　　　git branch -m 元のブランチ名　修正後のブランチ名

　　　　//ブランチの削除
　　　　git branch -D 削除するブランチの名前
　　　　
```

###1-1-5 git stash
ファイルの変更差分があって、ブランチを切り替えたい場合が存在します。
その場合素直に作業ブランチを切り替えてしまう(get checkoutする)と変更差分を持ったまま、次の作業ブランチに移動することになります。
なので、作業ブランチを切り替える前に、コミットするというのも一つの手ではあるのですが、そのブランチのコミット履歴が汚れてしまいます(不完全な変更差分をコミットしてしまう)。
そこで、現在の変更差分を一時的に退避するためのコマンドが<font color="DeepPink">git stash</font>です。

git stashは一時的な変更を退避させたり、そこから取り出して反映させるコマンドです。
なのでブランチを切り替える前に<font color="DeepPink">git stash</font>して、変更を一時的に退避させ、終わったら戻ってきて<font color="DeepPink">git apply</font>で変更を元に戻します。

```sh
    //変更を一時的に退避させる
　　　　　　　　git stash save "メッセージ（どういう差分かなど）"

    //untrackedファイルも含めて全てスタッシュ
    git stash save -u "メッセージ（どういう差分かなど）"

    //stashの一覧
　　　　　　　　git stash list
    /*　こんな感じで一覧が表示されます。
    * stash@{0}: On master: スタッシュの実験２
    * stash@{1}: On master: スタッシュの実験1
    */

    //stashの中身の確認
　　　　　　　　git stash show stash@{N}
    /* こんな感じのものが表示されます。
    * App.js | 3 +++
    * 1 file changed, 3 insertions(+)
    */

    //stashの反映(変更差分を元に戻す)
    git stash apply stash@{N}

　　　　　　　　//stashされたものの中から特定のファイルのみ反映(戻す時にステージングされます)
　　　　　　　　git checkout stash@{N} ファイル名

   //stashの削除
　　　　　　git stash drop stash@{N}

　　　　　//stashから反映させ＆同時に削除もする
　　　　　git stash pop stash@{N}
```
stashをsaveする時にはどういうものかを判別するために、メッセージをつけることが好ましいです。
変更差分をstashから戻す時に、applyとpopの二種類が存在しますが、違いとしては
applyは<font color="Orchid">stashから削除しない</font>ですが、popは<font color="DarkOrchid">stashから削除します</font>。
この違いはgit stash listで確認することが可能です。




##1-2,gitの設定(リモート編)とリモートでの開発
今まではローカルでのブランチ運用のお話でしたが、ここからはリモートリポジトリ(GitHub)を使用した開発について書きます。

###1-2-1 リポジトリを作成する
まず、[GitHubのサイト](https://github.co.jp/ "GitHubのサイト")に行って、登録をします。
登録が完了するとリポジトリを作成できますので自分のページの左サイドバーのRepositoriesの<font color="LimeGreen">New</font>を押して、リポジトリ名や、Public or Privateの選択をした後<font color="LimeGreen"></font><font color="LimeGreen">Create repository</font>を押してリポジトリを作成します。
<img width="341" alt="スクリーンショット 2019-05-03 3.55.52.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320677/181904fc-58f1-a391-6fd7-511efe7d3bf9.png">
<img width="779" alt="スクリーンショット 2019-05-03 3.59.06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320677/38292e0d-3667-0d3d-c21e-b4f2842ebeea.png">

リポジトリが出来ましたら、Quick setup — if you’ve done this kind of thing before
にあるHttpsのhttps\://github.com/xxxxxxx/-.gitをコピーします。
ssh接続の場合は公開鍵をGitHubに登録する必要があり、長いので今回は省略します。


###1-2-2　ローカルリポジトリの設定
ローカルリポジトリに<font color="Violet">どこのリモートリポジトリにコードを反映させるかの設定</font>をします。
ローカルの該当ディレクトリにて以下のコマンドを実行します。

```sh
    git remote add origin （1-2-1でコピーした）https://github.com/xxxxxxx/-.git
```
これでoriginにhttps\://github.com/xxxxxxx/-.gitが設定され、完了です。
originはリモートリポジトリの判別に使用します。

###1-2-3 リモートリポジトリに反映させる、リモートリポジトリから取ってくる
リモートリポジトリにローカルのコミットを送ります。
これを<font color="Blue">push(プッシュ)</font>と呼びます。

```sh
    //リモートリポジトリにpushする
    git push origin ブランチ名
    /*
    * ブランチの一覧はgit branchで確認できます。
    * その時の作業ブランチは※が頭についているものです。
    * masterブランチを送る場合は
    * git push origin master
    * dev1ブランチを送る場合は
    * git push origin dev1
    * です。
    */
```

リモートリポジトリから変更をローカルに持ってくる場合、
<font color="Blue">git pull</font>コマンドを使用します。
(取ってくるだけならgit fetchというコマンドもありますが、今回は変更差分をローカルに反映(マージ)したいのでpullを使用します。)

```sh
    //リモートリポジトリにpushする
    git pull origin ブランチ名
    /*
    * リモートのmasterブランチの変更をローカルのmasterに反映させる場合は
    * git pull origin master
    * リモートのdev1ブランチの変更をローカルのdev1に反映させる場合は
    * git pull origin dev1(dev1がローカルにない場合は新規作成されます)
    */
```

リモートリポジトリにコミットを送るのが<font color="Green">push</font>で
その反対(リモートリポジトリからコミットを取ってくる)が<font color="Green">fetch</font>です。
fetchした後にマージまでしてくれるのが<font color="Green">pull</font>です。

複数人で開発する<font color="DarkTurquoise">GitHubフロー</font>と呼ばれるGitHubのPullRequest機能を用いた開発フローの場合GitHub上のコミットを開発者がそれぞれ進めていくのでそれを適宜取り込む必要があります。その際に<font color="Green">pull</font>を使用します。
また、誰かがリモートリポジトリにpushしたブランチの動作確認を行う際に、
<font color="Turquoise">git pull origin そのブランチ名</font>でローカルに持ってきて検証することもあります。

###1-2-4 PullRequest
GitHubを用いた開発で一番大きな意味合いとして<font color="Crimson">PullRequest(プルリクエスト、通称プルリク)</font>が挙げられます。

変更差分が入ったブランチをpushしてリモートリポジトリに挙げた後、そのブランチの変更分をリリースするブランチ(大抵はmasterブランチ)などに取り込んでもらう(mergeしてもらう)ため、プルリクを作成します。
作成手順は
１、プルリクエストタブの<font color="MediumSeaGreen">New pull request</font>を選択し、
<img width="1155" alt="スクリーンショット 2019-05-03 5.17.23.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320677/3ce19311-75b4-5032-524d-eae594743e9d.png">

２、どこのブランチからどこのブランチに取り込んで欲しいかを設定して、どういう変更かを記述してプルリクをオープンします。プルリクは自動で二つのブランチの差分を算出して可視化してくれます。

作成手順はこれだけです。

この際にどういうものを記述するかは開発チームごとにテンプレートが存在しているのが一般的であると思います。大抵はプルリクの目的、変更の概要、行ったテストやデザイン上の変更点などを書くかなと思います。

オープンされたプルリクは決められた開発ルールの中で誰かしらに見られ(見る人を<font color="DarkOrange">レビュアー</font>、見られる人を<font color="MediumSpringGreen">レビュイー</font>と言います)、問題ないと判断されればレビュアーはプルリクエストを<font color="OrangeRed">承認(approve)</font>します。

そして、管理者によってマージが実行されて、自分のブランチの変更差分が取り込まれます。

###1-2-5 リモートブランチとチーム開発を少しまとめ
以上がリモートリポジトリの作成から自分のブランチをpushしてプルリクを作成してリリースブランチなりに取り込んでもらうまでの流れになります。





#参考
　　- [1.6 Getting Started - First-Time Git Setup](https://git-scm.com/book/en/v2/Getting-Started-First-Time-Git-Setup "1.6 Getting Started - First-Time Git Setup")