【全3回】第1回 Git/GitHub 勉強 【ファイル修正→ローカルリポジトリへのマージ】 

##はじめに
実務未経験の僕は、gitのコマンドを勉強しているときにどういう場合にどのコマンドを使うかが解らなかった。
そこで、プログラマーの先輩にコマンドの使い方・原理を教えてもらった。
そこで学んだ内容をアウトプットする。


##要件
要件は以下。
<img width="599" alt="Screen Shot 2019-05-04 at 0.25.48.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312088/d87777a6-4599-2a83-93db-1fbfe2afb48e.png">

snake_case: '_'で名前をつなぐこと (例) change_name
CamelCase : 単語の１文字目のみ大文字にすること (例) ChangeName

##使用するもの
iterm2
VSCode
Sourcetree

##ファイル修正からプルリクエストまでの流れ
####①issue確認
ページヘッダーに書いてある`hoge Introduction`を`DAIBANEZ Introduction`にしたい (#1)

####②`git checkout -b 'ブランチ名'`でブランチを作成し、そのブランチに移動する。
要件に従いブランチを作成する。

```
$ git checkout -b practice-#1-enhancement-change_name
M	src/components/commonMenu.vue
Switched to a new branch 'practice-#1-enhancement-change_name'
```


####③ローカルでページヘッダーを変更
```
<v-toolbar-title class="white--text">DAIBANEZ Introduction</v-toolbar-title>
```

####④`git status`でワークツリーの状態を確認する
```
$ git status
On branch practice-#1-enhancement-change_name
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

	modified:   src/components/commonMenu.vue
```

#### ⑤`git add`でステージング
```
$ git add src/components/commonMenu.vue
$ git status
On branch practice-#1-enhancement-change_name
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

	modified:   src/components/commonMenu.vue
```
※この時、出来るだけ `git add .`は使わないようにする。

**理由**
いくつか作業をしている時、関係ないものまでステージングされ分かりにくくなる可能性があるため。

###※A,B,C,D,Eのファイルを修正してA,B,Cだけをコミットしたかったが全てステージングしてしまった場合
![S__92364827.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312088/972b8b15-9a56-e480-5733-77b25953e4c8.jpeg)

####対処法① ~`git reset ファイル名`を使う~
`git reset ファイル名`は指定したファイルだけをステージからワークツリーに戻せる。
なので、`git reset D E`でD、Eのファイルのみワークツリーに戻す。
![S__92364829.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312088/c2042d6f-c9c9-462f-3cc3-2b42a1f07522.jpeg)

####対処法② ~`git reset HEAD`を使う~
`git reset HEAD`はステージングされたファイルを全てワークツリーに戻せる。
なので、５つのファイルを全てワークツリーに戻し、その後`git add A B C`でステージングする。
![S__92364828.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312088/c5b0c9ff-7d5a-2e28-5041-51bcf0d847c0.jpeg)

####⑥`git commit -m '変更内容'`でコミットする

```
$ git commit -m 'change title'
[practice-#1-enhancement-change_name ced6e2a] change title
 1 file changed, 1 insertion(+), 1 deletion(-)
```

####⑦`git push origin`でリモートリポジトリにプッシュする

####⑧プルリクエストを送る
<img width="774" alt="Screen Shot 2019-05-04 at 1.22.00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312088/bdf6896d-58d6-c23d-61a7-2fe91cefd261.png">

※プルリクエストを送った後、修正依頼が来た場合、必ずブランチ名は**同じもの**で修正する。

**理由**
このブランチ内で完結させないと、意味が分からなくなるため。

*(プルリクエストがすぐに指摘されない場合がありブランチがない場合がある。
その対処法については次回。)*

####上記の後、Masterがプルリクエストを承認しリモートリポジトリ上でマージ

####ページヘッダーの現状
リモートリポジトリ(origin/master): DAIBANEZ Introduction
**ローカルリポジトリ(master)       : hoge Introduction**
ローカルリポジトリ(branch)       : DAIBANEZ Introduction

→ローカルリポジトリ(master)を`DAIBANEZ Introduction`と更新しておく。

**理由**
極端な話、ローカルリポジトリ上に存在しないファイルの修正を依頼された時に修正することができないため。
例）Fを修正してほしいという依頼があった。ローカルリポジトリ上はOLDの状態だった場合、修正することができない。
![S__92364832.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312088/f94f16cf-818e-f546-5a1d-a3d3b4de2250.jpeg)

上記のため、**こまめにローカルリポジトリはアップデートする**必要がある。

##ローカルリポジトリをアップデートする方法
####①`git fetch --prune`でローカルとリモートのリポジトリの差分のブランチを消す。

```
$ git branch -r
  origin/HEAD -> origin/master
  origin/develop
  origin/master
  origin/practice-#1-enhancement-change_name

$ git fetch --prune
 - [deleted]         (none)     -> origin/practice-#1-enhancement-change_name
$ git branch -r
  origin/HEAD -> origin/master
  origin/develop
  origin/master
```

####②`git merge origin/master`でローカルを最新の状態にする
必ず**`master`の状態**でマージする。

**理由**
通常の英文のように、`git merge A B`という構文で書くことが出来ないため。
→ Aの状態で `git merge B`として、マージする。

```
$ git checkout master
Switched to branch 'master'
Your branch is behind 'origin/master' by 3 commits, and can be fast-forwarded.
  (use "git pull" to update your local branch)
$ git branch
* master
  practice-#1-enhancement-change_name
$ git merge origin/master
Updating 7801dac..93457b5
Fast-forward
 src/components/commonMenu.vue | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
```

※最新の状態にするためには、`ローカル上のMasterとブランチ`をマージしてはいけない

**下記のような問題が発生**
**・自分が更新したファイルのみマージされてしまう**
→他の人が別のファイルを更新していたとしても、それは反映されない
**・もし他の人が自分が修正したファイルと全く同じ文言で修正した場合、コミットIDに差異が生じてしまいgitがどっちのファイルを信用していいか分からなくなってしまう。**
→コミットIDが違うと同じファイルでも、全くの別物になる。

##次回やること
・リモートからローカルにmerge以外で持ってくる方法
・developブランチに作業を詰め込む方法
・コンフリクトが起きる理由・それをどう直すか
・Git小技集