GitHubの超基本的な運用に関して再度自分なりにまとめてみた

# 概要

ポートフォリオ制作真っ最中です。
Gitで大苦戦したので、先人の方々の力をお借りし、メモとして再度手順や概念をまとめました。
※僕の追記部分に誤りなどあれば、コメントくださると嬉しいです。


## 前提
まずローカル環境には3つの状態がある
* 作業ディレクトリ(ワークツリー)
* ステージングエリア
* Gitディレクトリ(ローカルリポジトリ)



1つのトピックの変更をステージングエリアに持っていくことが大事。そしてローカルリポジトリの内容が大事。




* ブランチモデル①GitFlow
    * masterブランチ
        * リリース可能な**完全品質を保証する**ブランチ。
        * **releaseブランチからのマージ**のみで更新される。
        * masterブランチ上で直接作業したりコミットするのはNG。
    * developブランチ
        * **開発の主軸**になるブランチ。
        * **masterブランチから**派生させる。
        * developブランチ上で直接作業したりコミットするのはNG。
    * releaseブランチ
        * **リリース作業を行う**ためのブランチ。
        * **developブランチから**派生させる。
        * リリース作業が完了したら**masterブランチとdevelopブランチにマージ**する。
        * マージされたら該当のreleaseブランチは**削除**する。
    * featureブランチ
        * **機能追加および修正作業を行うため**のブランチ。
        * **developブランチから**派生させる。
        * 作業完了してレビューが通ったら、**developブランチにマージ**する。
        * どのような機能追加を行うブランチなのかが一目で分かるようなブランチ名を心がける。
        * マージされたら該当のfeatureブランチは**削除**する。 
    * hotfixブランチ
        * **リリース済みのものの緊急修正用の作業を行う**ブランチ。
        * **masterブランチから**派生させる。
        * 修正作業完了後は**masterブランチとdevelopブランチにマージ**する。
        * マージされたら該当のhotfixブランチは**削除**する。




* ブランチモデル②GitHub Flow
    * masterブランチ
        * **リリース可能な完全品質を保証する**ブランチ。
        * git-flowでいうmasterブランチ+developブランチ相当。
        * **masterブランチ上で直接作業したりコミットするのはNG。**
        * **リリース作業はmasterブランチ上**で行う。（releaseブランチは別途用意しない。）
    * topicブランチ
        * **機能追加やバグ修正を行う**ブランチ。
        * **実際のファイル編集作業はこのブランチ上**で行う。
        * **masterブランチから枝分かれする唯一**のブランチ。
        * git-flowでいうfeatureブランチ+hotfixブランチ相当。
        * **masterブランチにマージされたらtopicブランチは削除**する。

(引用：https://qiita.com/gold-kou/items/7f6a3b46e2781b0dd4a0)




![](https://i.imgur.com/CP513EM.png)

(引用:https://qiita.com/tbpgr/items/4ff76ef35c4ff0ec8314)


# GitHub flowの利用

#### 基本原則
* masterブランチは、常時デプロイ可能である
* 機能追加、バグフィックスなどは 説明的な名前のブランチをmasterから作成する
* 作成したブランチでローカル開発。小さい単位でこまめにコミットし、リモートにもこまめにPush
* フィードバックや助言が欲しい時、ブランチをマージしてもよいと思ったときは、Pull Requestを作成する
* フィードバックや助言が欲しい時に作成するPull RequestをWIP Pull RequestといいPull Request名の頭に [WIP] をつけるのが慣習
* レビューがOKを出してもらったら、masterへマージ
* masterへpushしたら、即デプロイをする

# 開発の流れのイメージ
### 【Step1】リモートリポジトリ作成


### 【Step2】clone
リモートリポジトリをローカルにclone

`$ git clone <url>`


### 【Step3】ローカルでブランチきる
ブランチの命名規則はチームやコミュニティそれぞれの流儀があるためそれに従う。
タスク番号とか書いてあれば分かりやすいと思う。

`$ git checkout -b <branch name>`


### 【Step4】ファイル編集
機能実装などそのブランチで必要なファイル編集をワーキングツリー上で行う。

### 【Step5】変更ファイルの確認
現在ブランチでaddやコミットが実施されていないファイルの一覧を表示。

`$ git status`


### 【Step6】ステージング環境に追加
ワーキングツリー上で編集したファイルをステージング環境に追加する。
変に-allオプションとかつかわずに焦らず1つ1つaddしていく方がいいと思う。

`$ git add <file>`


### 【Step7】ローカルコミット
コミットメッセージの書き方はチームやコミュニティそれぞれの流儀があるためそれに従う。

`$ git commit -m "<commit message>"`

### 【Step8】最新リモートリポジトリの内容をローカルリポジトリに適用
pushの前に最新状態があれば取得しておく。

`$ git pull --rebase origin develop`


>（上記で競合が発生した場合）
競合したファイルの修正
競合したファイルを適切に修正する。
他人のコミット内容を変更することになるので修正内容はメンバと確認した方がよい場合もある。
修正したファイルをステージング環境へ移動
`$ git add <修正済みファイル>`
rebaseを完了する
`$ git rebase --continue`


### 【Step9】リモートリポジトリにアップロードする
`$ git push origin <local branch>`


### 【Step10】pull request
GitのWEB-UIでレビューアにpull request送信。

### 【Step11】(必要あれば)レビュー対応してマージまで繰り返す
pull requestに関していただいたレビューに対応する。
Step4から終わるまで繰り返し、最終的にリモートリポジトリ上でマージされる。

### 【Step12】ローカルを最新化
リモートリポジトリ上でマージされると、コミットが進むため、ローカルの情報をリモートリポジトリに合わせるために最新化する。

```
$ git checkout develop
$ git pull
```

***
## 以下基本コマンド等を記載
## リモートリポジトリの運用

>リモートリポジトリのディレクトリをそのまま持ってくる&gitの管理下に置く
`git clone <リモートリポジトリのURI>`

>リモートリポジトリの確認
`git remote`

>リモートリポジトリの確認(URLも表示)
`git remote -v`

>リモートリポジトリの追加
git remote add <登録名> <リモートリポジトリのURL>

>リモートリポジトリの削除
git remote rm <リモートリポジトリ登録名>


## ブランチの運用


>ブランチの作成
`git branch <ブランチ名>`

>ブランチ変更=チェックアウト
`git checkout <ブランチ名>`

>ブランチの作成+チェックアウト
`git checkout -b <ブランチ名>`

>ブランチ名変更
`git branch -m <変更前のブランチ名> <変更後のブランチ名>`

>ブランチ削除
`git branch -d <ブランチ名>`

>ブランチ一覧確認
`git branch`

>マージ(topicブランチをmasterブランチへ@master)
`git merge topic`

>リベース(topicブランチをmasterブランチへ@master)
`git rebase master`

>fetch


>pull







## ワーキングツリーからリモートリポジトリまでの流れ


**ワーキングツリー　▶　ステージングエリア**
`git add <ファイル名>`
`git add .`

**ステージングエリア　▶　ローカルリポジトリ**
`git commit -m "メッセージ"`

**ローカルリポジトリ　▶　リモートリポジトリ**
`git push <リモートリポジトリの登録名/ブランチ> <ブランチ>`
`git push origin/master master`

**ローカルリポジトリ　▶　リモートリポジトリ(rebase後など強制的にpush)**
`git push <リモートリポジトリの登録名/ブランチ> <ブランチ> **-f**`
`git push origin/master master **-f**`



## 状態確認
>前回のコミットと比較した変更内容を表示(ステージングエリア&ワーキングツリーどちらも)
`git status`

>コミットログを確認
`git log`