Gitについて書いてみた

#１．gitとは
####バージョン管理システム。バックアップや共同制作等を効率よく行うために使う。
・ファイルの変更（更新）を自動で管理してくれる
・だれが、いつ、どこを追加・変更・削除したかを記録してくれる
・過去の状態に戻すことができる
####使うツール
PhpStorm（エディタ）
Backlog（gitシステムを使って動いているサービス）

#２．PhpStormとは
PHPでプログラムを書く人にとって、最強のIDE。

#３．Backlogとは
- プロジェクト管理
- 課題管理
 
PhpStormと連携して課題を管理

####運用ルール
「プロジェクト/バックログ運用ルール」を参照


#４．ローカルリポジトリとリモートリポジトリ
リモートリポジトリは「みんなのファイルやディレクトリの状態」が保存されている場所のこと。（管理する方「部長」）
ローカルリポジトリは「自分のファイルやディレクトリの状態」保存されている場所のこと。（管理する方「課長」）
作業ディレクトリで開発を行う。（操作する方「一般社員」）
![リポジトリ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286794/195cfb63-42eb-920a-d491-e2ec9d37a5ed.png)



#５．クローン
####リモートリポジトリの内容をそのままローカルリポジトリとして複製すること

Backlogから作業するリポジトリをコピー
<img width="674" alt="スクリーンショット 2019-06-06 19.54.27.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286794/8e642bd5-ae06-29e8-31ca-a9f51436257f.png">


Phpstormホーム画面の「バージョン管理からチェックアウト」押して
<img width="770" alt="スクリーンショット 2019-06-06 19.51.23.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286794/01946933-2ce3-0947-973e-7819ca93914a.png">


リポジトリを貼り付けて
<img width="732" alt="スクリーンショット 2019-06-06 20.00.40.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286794/060eee79-adae-6738-6598-24058a4d9875.png">


右下のクローン！

#####新規案件でリポジトリに初めてファイルをコミットする時の注意
PhpStormの機能ファイル「.idea」はコミットしなくていい
デフォルトではコミット一覧に出てきてしまう、ファイルを無視してコミットしないようにしよう
①ファイルまたはディレクトリと同じ階層に「.gitignore」ファイルを追加
中身

```
/.idea
```
「/」つけることで.ideaディレクトリ配下のファイルも無視

まだコミット一覧にいるときはキャッシュが残っちゃてるだけだから、コマンドを実行。（GUIはないぽい）

```
git rm -r --cached .idea/
```


#６．コミット
ファイルを追加・変更・削除した際、変更内容をローカルリポジトリに反映すること
<img width="21" alt="スクリーンショット 2019-06-07 19.05.51.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286794/4f24fa19-9e55-d239-fb37-9d5033372c3c.png">
####コミットする前にやること
①コミットメッセージにチケットを貼る
貼り付けることでチケットに共有される。
![スクリーンショット 2019-06-07 19.10.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286794/55798583-8017-f19b-dac8-45f6ecdc0135.png)

②「コードの再フォーマット」にチェックつける
③「バージョン管理外ファイルの表示チェック」につける
<img width="899" alt="スクリーンショット 2019-06-07 19.14.55.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286794/bf5b0214-0c5a-65ce-6d2e-df11be80f1ef.png">


③「PhpStorm」→「環境設定」→「バージョン管理」→「コミット・ダイアログ」→「バージョン管理外ファイルの表示」チェックつける
<img width="1192" alt="スクリーンショット 2019-06-07 19.23.23.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286794/2ec5728d-3adf-95e6-00db-0b43703e6ac5.png">

一度コミットしたファイルがまだコミットリストにいる場面に遭遇した。キャッシュクリアしてもnotfoundって言われるし、そんな時はコミットリストをリロードしよう。

####コミット取り消しコマンド
（GUIではないぽい）

```php
git reset --soft HEAD^
```


####たまにバージョン管理外ファイルが参照できなくて困る場合がある。
（今度その状況に遭遇したら画像載せます）
解決するためのコマンド（GUIはないぽい）

```
git add .
```

#７．プッシュ
ローカルリポジトリで追加・変更・削除したファイルの内容をリモートリポジトリに反映すること
<img width="24" alt="スクリーンショット 2019-06-07 19.27.46.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286794/0af1e37d-223b-b3ad-86df-7cdf3ca67b2a.png">
コミットのプッシュをする前にもう一度修正点を確認しよう。
※アナタ以外の人が同じファイルを修正し、リモートリポジトリにプッシュしてた場合、コンフリクトエラーになる。（１１．競合の解決で説明）

####プッシュ取り消し
誤ってプッシュしてしまっても大丈夫。コマンドでの操作になるが、間違えましたと分かるようにプッシュし直せばいい。
直前のコミットを戻すコマンド（GUIではないぽい・・・）

```php
git revert HEAD
```

<img width="612" alt="スクリーンショット 2019-06-11 16.09.52.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286794/5f60cc91-6920-6527-77c8-f0f649bae379.png">
なんか嫌な感じのでてくるけど、「:wq」押してEnterキーでOK。（コミットメッセージこれでいい？って聞かれてるだけ）
あとは「プッシュ」すればいい

#８．プル
リモートリポジトリの最新の履歴をローカルリポジトリに反映すること
「フェッチ」＋「マージ」のほうが丁寧（みんなプル使ってるけど）
※プッシュと同じく、コンフリクトする可能性がある。（１１．競合の解決で説明）
####フェッチ
リモートリポジトリの最新の履歴をローカルリポジトリに取得。
差分みるコマンド(GUIではないぽい・・・)

```php
git diff HEAD [リポジトリ/ブランチ名]
```
####マージ
結合。



#９．ブランチ

1つのプロジェクトから分岐させることにより、プロジェクト本体に影響を与えずに開発を行える機能のこと。
他のブランチに影響を与えず、複数人が同時平行で作業を行うことができる。
作業単位で履歴を残すことで後で見た時にわかりやすい。
![スクリーンショット 2019-06-11 9.14.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286794/34315e0c-b113-3b15-ef01-0f302b11f10c.png)

↑画像見たい時のパス　「Backlog」→「各プロジェクトのGit」→「各リポジトリのネットワーク」

以下、ブランチの命名規則。（開発の規模によって異なる）
###必須
以下のブランチは全プロジェクト必須です。

####マスターブランチ(master)
命名規則：master（固定）

リリース可能な完全な品質を保証する。
原則として本番環境で動作しているプログラムと同一となる。ただしマージ中など、タイミングにより原則を満たさない可能性がある。
直接コミット禁止。特定のブランチからマージすることでのみ更新がおこなわれる。
featureブランチはこのブランチから派生する。
####機能開発ブランチ(feature)
命名規則：feature/[課題番号]_[機能名]

新しい機能の開発をおこなうためのブランチ。
masterから分岐して作成し、最後はmasterにマージする
機能名は、処理がイメージできるものにすること
☓：feature/DWW001
○：feature/DWW001_fix_point_calculation
###任意
以下のブランチは任意です。プロジェクトの特性に合わせて取捨選択してください。

####開発ブランチ(development)
命名規則：development（固定）

開発中の機能がすべて統合されるブランチ
直接コミット禁止。featureからのmargeのみ
####リリースブランチ(release)
命名規則: release/[YYYYMMDD-NN] ※NNは01から開始

masterブランチから分岐して作成する。
リリース用の課題を集約して、リリース版を確定させるためのブランチ。
本ブランチをステージング環境にデプロイして動作確認をおこない、リリースが確定したらmasterブランチにマージした後、masterブランチにタグを作成してリリースをおこなう。
YYYYMMDDはリリース日を指定
####ホットフィックスブランチ(patch)
命名規則: patch/[課題番号]_[機能名]

masterに対する修正をおこなう際に利用するブランチ。緊急対応など。
masterから分岐して作成し、最後はmasterにマージする。

##１０．プルリクエスト
各ブランチの作業を他のブランチに反映すること。
例）　存在するブランチ　master　development　feature_a　feature_b
作業したブランチ　→　反映したいブランチ
feature_a　　  →　 feature_b
feature_b     →　 development
development   → 　master
![スクリーンショット 2019-06-10 15.20.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286794/d8bb992b-447b-2ab2-4e8b-b2d1a69a0600.png)
プルリクエストを追加後、担当者にチャットワークで報告。確認してもらう。（URLつける）
担当者確認後、マージしてくれる。

#####コンフリクト問題
修正点が重複しなければそれぞれの変更を適用でき、問題なくマージされる。
また、修正点が重複しててもその変更内容が同じであれば、問題なくマージされる。
問題なのは、重複する点の変更内容が異なるとき。このときはどちらを適用すべきか判断しなければならない。



##１１．リベース
ログを綺麗にできる。ただし、他の人のコミットを勝手に作り直す可能性があるため、気をつける。
リベースで出来ること
①開発コミットを繋げ直す
「e2info-kusano-step2ブランチ」と「e2info-kusano-step3ブランチ」がある。
![スクリーンショット 2019-06-11 14.42.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286794/77759783-6afd-a636-1d41-a064aabb8a9f.png)
「e2info-kusano-step3ブランチ」を失くして、「e2info-kusano-step2ブランチ」を一本化する。
「e2info-kusano-step3ブランチ」にチェックアウト
「VCS」→「Git」→「リベース」
<img width="812" alt="スクリーンショット 2019-06-11 14.56.57.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286794/5d672960-5c72-8878-b4c6-73b20db3c44e.png">
「リベース」
<img width="473" alt="スクリーンショット 2019-06-11 14.57.13.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286794/3705a1df-5abe-8838-2ca1-b8680caa5f6b.png">
アクションを「pick」でリベース開始
リベースすることで「e2info-kusano-step2ブランチ」のローカルリポジトリに「e2info-kusano-step3ブランチ」の履歴が反映される。
「e2info-kusano-step2ブランチ」にチェックアウト
「e2info-kusano-step3ブランチ」をプル
<img width="873" alt="スクリーンショット 2019-06-11 17.13.31.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286794/ec351467-4212-eaab-6755-0ac42142709b.png">

履歴が反映していることがわかる。
<img width="1014" alt="スクリーンショット 2019-06-11 15.10.17.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286794/af6da73a-9498-e61d-d690-d707ad28e5bf.png">
「プッシュ」
![スクリーンショット 2019-06-11 15.10.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286794/bfb5f773-8d83-17f8-9a65-013f9ae40f7f.png)
一本化される。

#１２．競合の解決
同じファイルを編集してしまうことを「競合する（コンフリクト）」という。
競合した場合、どっちのファイルを反映しますかエラー吐く。
例）課題：ドラえもんの顔を完成させる
　　　　　　Aさんの課題：ひげ担当
　　　　　　Bさんの課題：目担当
○
ドラえもんリポジトリ
Aさん　ドラえもんリポジトリをクローン→ひげファイルを編集→コミット→プッシュ
Bさん　ドラえもんリポジトリをクローン→目ファイルを編集→コミット→プッシュ

☓
ドラえもんリポジトリ
Aさん　ドラえもんリポジトリをクローン→ひげファイルを編集→コミット→プッシュ
Bさん　ドラえもんリポジトリをクローン→ひげファイルを編集→コミット→プッシュ

競合の解決
メニューバー「VCS」→「Git」→「競合の解決」
<img width="587" alt="スクリーンショット 2019-06-11 16.25.24.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286794/b3e42f47-a46f-97fb-ccb7-2af68de11b16.png">
「login.php」を押すと
<img width="1185" alt="スクリーンショット 2019-06-11 16.25.37.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286794/a98857b3-21c6-5d46-1b4b-077884acbdaf.png">
真ん中を解決した状態にする

##１３.タグ
<img width="18" alt="スクリーンショット 2019-06-11 10.30.39.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286794/e130849d-901b-b58a-a3d3-dede3c3f02ab.png">
タグに名前をつけて「タグの作成」
<img width="438" alt="スクリーンショット 2019-06-17 19.05.49.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286794/d75e7bb9-d090-7e09-8843-720a834727db.png">

作成後、ローカルリポジトリに追加される。
<img width="672" alt="スクリーンショット 2019-06-17 15.54.46.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286794/e70d6c8a-54c6-f6a7-e985-4ae7f96356dc.png">
プッシュ・タグにチェックを付けて「PUSH」

####リリースタグ
本番リリース時にタグ付けを必須とする。
masterブランチに対してタグ付けする
タグのルールは以下の通り
rel-yyyymmdd-連番

【連番】
数字2文字の連番。

例
rel-20161116-01
rel-20161116-02

![スクリーンショット 2019-06-11 10.13.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286794/5de0b697-e301-7344-381b-46909a8191ba.png)


最新リリースにバグが見つかった場合、前回のリリースタグに戻す