gitを使ったバージョン管理手順(社内ファイルサーバ＋Win10)


# 全体像

GitHub flowというバージョン管理の方針に沿って、
バージョン管理を行うための手順メモ
GitHub flowについては
https://qiita.com/onishi_820/items/d98c61e0faa67f417829


前提
リモートリポジトリは社内ファイルサーバ上に置く
Win10

### 新規作成から最初のコミットまで
01_ディレクトリの作成
02_カラのリモートリポジトリを作る
03_カラのリモートリポジトリをクローンしてローカルリポジトリを作る
04_ローカルリポジトリ上で開発を行う
05_変更内容をローカルリポジトリにコミットする
06_ローカルリポジトリのコミット内容をリモートリポジトリにプッシュする

### 最初のコミット以降の開発1

#### リモートリポジトリの最新の内容をローカルリポジトリに反映する
07_ローカルリポジトリ上で、masterブランチをチェックアウトする
08_リモートリポジトリのmasterブランチの変更内容をローカルリポジトリでフェッチする
09_現在いるブランチにリモートリポジトリの内容をマージする(リモートのmaster→ローカルのmaster)

#### 初めて開発ブランチを作成し、開発し、途中で保存するためにプッシュする
10_ローカルリポジトリ上で開発ブランチを１つ作る
11_今作った開発ブランチをチェックアウトする
12_開発を行って、ローカルリポジトリの開発ブランチ上にコミットする

↓次にプッシュを行うが、プッシュ前にmasterブランチを最新の状態にしておく

13_ローカルリポジトリ上で、masterブランチをチェックアウトする(07と同じ)
14_リモートリポジトリのmasterブランチの変更内容をローカルリポジトリでフェッチする(08と同じ)
16_現在いるブランチにリモートリポジトリの内容をマージする(リモートのmaster→ローカルのmaster)(09と同じ)

↓開発ブランチを一時的にプッシュする

17_ローカルリポジトリで、再度開発ブランチをチェックアウトする(11と同じ)
18_その開発ブランチをリモートリポジトリにプッシュする


#### 開発ブランチ作成、開発、初プッシュを行ったあとの2回目以降の開発(masterへのマージはまだ)

まずはローカルリポジトリのmasterブランチを最新にする
19_ローカルリポジトリ上で、masterブランチをチェックアウトする(07と同じ)
20_リモートリポジトリのmasterブランチの変更内容をローカルリポジトリでフェッチする(08と同じ)
21_現在いるブランチにリモートリポジトリの内容をマージする(リモートのmaster→ローカルのmaster)(09と同じ)

つぎにローカルリポジトリの開発ブランチも最新にする（それ以外のブランチは不要※220322実験済）
22_ローカルリポジトリ上で、開発ブランチをチェックアウトする(11と同じ)
23_リモートリポジトリの開発ブランチの変更内容をローカルリポジトリでフェッチする
24_現在いるブランチにリモートリポジトリの内容をマージする(リモートの開発ブランチ→ローカルの開発ブランチ)

25_開発を行って、ローカルリポジトリの開発ブランチ上にコミットする(12と同じ)

26_ローカルリポジトリ上で、masterブランチをチェックアウトする(07と同じ)
27_リモートリポジトリのmasterブランチの変更内容をローカルリポジトリでフェッチする(08と同じ)
28_現在いるブランチにリモートリポジトリの内容をマージする(リモートのmaster→ローカルのmaster)(09と同じ)

29_ローカルリポジトリで、再度開発ブランチをチェックアウトする(11と同じ)
30_その開発ブランチをリモートリポジトリにプッシュする(18と同じ)

:::note
masterと開発対象の開発ブランチ以外はローカルに反映していない状態で、プッシュして問題なし。
:::


### 開発が完了し、デプロイするまで（masterブランチへのマージ～デプロイ）
※プルリクエストはとりあえず略



まずはローカルリポジトリのmasterブランチを最新にする
31_ローカルリポジトリ上で、masterブランチをチェックアウトする(07と同じ)
32_リモートリポジトリのmasterブランチの変更内容をローカルリポジトリでフェッチする(08と同じ)
33_現在いるブランチにリモートリポジトリの内容をマージする(リモートのmaster→ローカルのmaster)(09と同じ)

つぎにローカルリポジトリの開発ブランチも最新にする（それ以外のブランチは多分不要）
34_ローカルリポジトリ上で、開発ブランチをチェックアウトする(11と同じ)
35_リモートリポジトリの開発ブランチの変更内容をローカルリポジトリでフェッチする(23と同じ)
36_現在いるブランチにリモートリポジトリの内容をマージする(リモートの開発ブランチ→ローカルの開発ブランチ)(24と同じ)

37_ローカルリポジトリでmasterブランチをチェックアウトする(07と同じ)
38_開発ブランチをmasterブランチにマージする

(コンフリクトが発生した場合)
39_コンフリクトを解消する
40_コンフリクトを解消したファイルをステージングする(git add)
41_コミットする
42_ローカルリポジトリで開発ブランチを削除する
43_マージ後のmasterブランチをリモートリポジトリにプッシュする
44_リモートリポジトリで開発ブランチを削除する



# 準備

### gitのインストール

git for windowsをインストールする。
https://gitforwindows.org/

デフォルト
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572544/f1fbcfa2-4b9e-eb03-d623-7d879ebcdbaf.png)

notepadに変えておく。（よくわからない）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572544/21412ba6-7604-0f77-c270-0de1826af705.png)

改行コードはinputを選択しておく
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572544/d866f9f0-0793-baed-ded3-cb2a06216d98.png)
参考：https://qiita.com/uggds/items/00a1974ec4f115616580

よくわからない↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572544/e6a08d10-df8d-6150-5ee7-0d2bc69ae6c3.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572544/b533a97f-56da-d496-9a44-85847360a4b3.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572544/9d87ed31-3917-438a-daf4-3959d3f4b0de.png)


その他インストール時の設定は下記参考。
https://qiita.com/toshibe/items/dcf3dd48fdc74c91b409

### git上でメールアドレスとユーザ名の登録
どこのディレクトリでもよいので、エクスプローラ上で右クリック＞Git Bash Here
```
git config --global user.name ****
git config --global user.email @@@@
```
****は任意のユーザ名
@@@@は任意のメールアドレス

ヒント：プロジェクトごとに設定することもできる。
その場合は対象プロジェクトのディレクトリ内で上記の--globalを--localに変えて実行

# 本題


### 01_ディレクトリの作成
共有可能なディレクトリを選んで、カラのディレクトリを作る。
このディレクトリが、リモートリポジトリの器になる。
慣例により、ディレクトリ名の末尾には「.git」をつける
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572544/fbae1df0-9da5-87e7-aca3-174fba6c6515.png)

※画像はローカルディレクトリだが、ファイルサーバ上のディレクトリでも大丈夫。


### 02_カラのリモートリポジトリを作る

さっき作った共有用のディレクトリを右クリック＞Git Bash Here
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572544/34161b77-f69d-ce17-6933-4cd5cffed6f2.png)



```
git init --bare --shared
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572544/33c2dc53-6c62-6450-34da-d665e615935a.png)
↓するとこうなる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572544/72aabd18-aeef-ff08-4962-461679bb1c1c.png)


### 03_カラのリモートリポジトリをクローンしてローカルリポジトリを作る
ローカルの作業フォルダを作っておき、右クリック＞Git Bash Hereで、
```
git clone ***
```
※「***」はリモートリポジトリのファイルパス。階層区切り記号はバックスラッシュや円マークではなく、フォワードスラッシュを使う。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572544/42fc2407-e84f-099e-9136-0fa2ebb843d1.png)
↓するとこうなる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572544/be24b10c-a876-8cb9-3a4d-dd04509fc60e.png)


### 04_ローカルリポジトリ上で作業を行う
### 05_コミットする
```
git commit -m "first commit"
```
### 06_プッシュする
```
git push origin master
```


## 最初のコミット以降の開発（開発ブランチ作成～開発ブランチの一時保存のためのプッシュ）


07_リモートリポジトリの変更内容をローカルリポジトリでフェッチする
```
git fetch origin
```
これを行うことで、ローカルのリモート追跡ブランチ　という特別な場所に、
リモートリポジトリの最新の内容が取り込まれる。
ローカルのリモート追跡ブランチ　とは、ローカルのマスターブランチとは違う。

08_念のためローカルリポジトリ上で、リモートリポジトリの変更内容を統合させたいブランチに移動しておく
特にブランチを作っていなければ、下記***は masterとなる。チェックアウトをしていなければはじめからmasterブランチにいるはずなので、
以下の操作は不要。

09_現在いるブランチにリモートリポジトリの内容をマージする
```
git merge origin/master
```
この操作を行うことで、ローカルのマスターブランチに、ローカルのリモート追跡ブランチの内容を統合することができる

10_ローカルリポジトリ上で開発を行う。ここで新しいブランチを作る
```
git branch *** @@@
```
***は、新しいブランチ名
@@@は、もとにするブランチ名（もとにするブランチ名を省略すると、現在チェックアウトしているブランチをもとに新しいブランチが作られる）

11_今作った新しいブランチをチェックアウトする
```
git checkout ***
```

12_そこで開発を行って、ローカルリポジトリの新しいブランチ上にコミットする

13_ローカルリポジトリでマスターブランチをチェックアウトする

14_リモートリポジトリからmasterブランチをフェッチ＆マージして最新にしておく
　※ここではmasterブランチは触っていない前提。新しいブランチのみで開発を行ったとする。



15_ローカルリポジトリで、再度新しいブランチをチェックアウトしておく


16_その新しいブランチをリモートにプッシュする

```
git push -u origin ***
```
***はプッシュするブランチの名前。
リモートリポジトリに存在してない場合は、リモートリポジトリに新しく作られる。
-uは、ローカルリポジトリのブランチに対して、リモートリポジトリ上の同名のブランチを
上流ブランチとして設定するためのオプション（理解甘め。上流ブランチが何なのかの理解は保留）


## 開発が完了し、デプロイするまで（masterブランチへのマージ～デプロイ）