gitを使ったバージョン管理の基本メモ(Win10, 社内ファイルサーバ)


# 全体像

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

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

### (masterブランチで開発を行う場合)(あらたなローカル開発環境を使う場合)
07_リモートリポジトリの変更内容をローカルリポジトリにクローンする
08_ローカルリポジトリ上で開発を行う(04と同じ)
09_変更内容をローカルリポジトリにコミットする(05と同じ)
10_ローカルリポジトリのコミット内容をリモートリポジトリにプッシュする(06と同じ)

### (masterブランチで開発を行う場合)(既存のローカル開発環境を使う場合)
07_リモートリポジトリの変更内容をローカルリポジトリでフェッチする
08_ローカルリポジトリ上で、リモートリポジトリの変更内容を統合させたいブランチに移動しておく
09_現在いるブランチにリモートリポジトリの内容をマージする
10_ローカルリポジトリ上で開発を行う(04と同じ)
11_変更内容をローカルリポジトリにコミットする(05と同じ)
12_ローカルリポジトリのコミット内容をリモートリポジトリにプッシュする(06と同じ)


### (新しいブランチを作って開発を行う場合)(既存のローカル開発環境を使う場合)

07_リモートリポジトリの変更内容をローカルリポジトリでフェッチする
08_念のためローカルリポジトリ上で、リモートリポジトリの変更内容を統合させたいブランチに移動しておく
09_現在いるブランチにリモートリポジトリの内容をマージする
10_ローカルリポジトリ上で開発を行う。ここで新しいブランチを作る
11_今作った新しいブランチをチェックアウトする
12_そこで開発を行って、ローカルリポジトリの新しいブランチ上にコミットする
13_ローカルリポジトリでマスターブランチをチェックアウトする
14_リモートリポジトリからmasterブランチをフェッチ＆マージして最新にしておく
15_ローカルリポジトリで、再度新しいブランチをチェックアウトしておく
16_その新しいブランチをリモートにプッシュする


(新しいブランチで開発を行う場合)
07_リモートリポジトリの変更内容をローカルリポジトリにクローンする
08_マージする？
09_ローカルリポジトリ上で新しいブランチを作成する
10_新しいブランチをチェックアウトする
11_ローカルリポジトリ上で開発を行う(04と同じ)
12_変更内容をローカルリポジトリにコミットする(05と同じ)
13_ローカルリポジトリのコミット内容をリモートリポジトリにプッシュする(06と同じ)


# 準備

### 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
```


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

### (masterブランチで開発を行う場合)(あらたなローカル開発環境を使う場合)
07_リモートリポジトリの変更内容をローカルリポジトリにクローンする
```
git clone ***
```

08_ローカルリポジトリ上で開発を行う(04と同じ)
09_変更内容をローカルリポジトリにコミットする(05と同じ)
10_ローカルリポジトリのコミット内容をリモートリポジトリにプッシュする(06と同じ)



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

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

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

10_ローカルリポジトリ上で開発を行う(04と同じ)
11_変更内容をローカルリポジトリにコミットする(05と同じ)
12_ローカルリポジトリのコミット内容をリモートリポジトリにプッシュする(06と同じ)

### (新しいブランチを作って開発を行う場合)(既存のローカル開発環境を使う場合)

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 origin ***
```
***はプッシュするブランチの名前。
リモートリポジトリに存在してない場合は、リモートリポジトリに新しく作られる。
ただしこのままだとローカルリポジトリのブランチに上流ブランチが設定されていない状態なので、
次のようにする（上流ブランチが何なのかの理解は保留）

```
git push -u origin ***
```


:::note warn
★220315 次、
(既存ブランチ)(既存のローカル開発環境を使う場合)
(異なるブランチ)(既存のローカル開発環境を使う場合)＝リモートにあってローカルにないブランチをローカルに持ち込む

https://qiita.com/matsumon-development/items/d3231acccc08c8d74c21
:::

### (異なるブランチ)(既存のローカル開発環境を使う場合)
リモートリポジトリとローカルリポジトリとで最新のコミットがそれぞれ異なるブランチで行われているケースを想定する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572544/7eca5a3e-261b-4738-db86-f30c4cb6536b.png)

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

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


```
git checkout ***

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

10_ローカルリポジトリ上で開発を行う(04と同じ)
11_変更内容をローカルリポジトリにコミットする(05と同じ)
12_ローカルリポジトリのコミット内容をリモートリポジトリにプッシュする(06と同じ)

プル＝フェッチ＋マージ　である。
参考
https://pointsandlines.jp/env-tool/git-fetch-pull