🔰5分だけ努力するGit (2)

## 今回取り扱う用語
・ブランチ
・上流ブランチ
・マージ
・プルリクエスト

前回からの続きです。
早速ですが、新たにブランチを切ってみましょう。
mainブランチをセーブデータ1とすると、それを元にセーブデータ2を作成するといったイメージです。
セーブデータ2で上手くいった部分をセーブデータ1に反映できたりします。便利ですね。
セーブデータ2からセーブデータ3、そこから4…など、枝分かれして作業することを「***ブランチを切る***」といいます。

新規ターミナル(Git Bash)を立ち上げ以下のコマンドを実行します。
```
$ git branch "ブランチ名"
```
今回はstudy.txtを修正したいのでブランチ名を`fix/txt`とします。
実行したら以下のコマンドからブランチが作成できているか確認してみましょう。
```
$ git branch -a
　　　　↓
  fix/txt
* main
  remotes/origin/main
```
`fix/txt`ブランチが作成できているのが確認できました。
ではmainブランチから作成したブランチに切り替えていきます。
```
$ git checkout "ブランチ名"
```
VSCode左下のブランチが変更されたら切り替え成功です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3475740/1fde39fa-0e69-58a7-5534-a591118ab9fa.png)

ちなみに以下のコマンドを実行するとブランチ作成から切り替えが簡単に行えます。
```
$ git checkout -b "ブランチ名"
```
また、`git branch`コマンドのオプションには以下のようなものがあります。
```
$ git branch -d "ブランチ名"
→ ブランチを削除します。変更が残っている場合は拒否されます。

$ git branch -D "ブランチ名"
→ 変更が残っている場合でも強制的にブランチを削除します。

$ git branch -m "ブランチ名"
→ 現在のブランチの名前を変更します。
```

次に作成した`fix/txt`ブランチでテキストを修正し、
study.txtを以下のように修正します。
```txt:study.txt
Hello New Branch!
```
修正内容を保存し、コミットしていきます。
```
$ git status
→ 前回new fileだったのがmodified(修正された)ファイルと表示されていることを確認

$ git add study.txt
→ 修正したstudy.txtをステージングエリアに追加する

$ git commit -m "コミットメッセージ"
→ コミットメッセージを添えてコミットする
```
コミットできたらリモートリポジトリに`fix/txt`ブランチを登録してプッシュしていきます。
実行するコマンドは以下の通りです。
```
$ git push -u origin "ブランチ名"
```
-uオプションを付けることで上流ブランチに設定でき、次から`git push`コマンドのみでプッシュできるようになります。

上流ブランチとはローカルブランチと紐づけるためのリモートブランチのことで、今回はリモートリポジトリにfix/txtというブランチを作成し、ローカルリポジトリにあるfix/txtブランチと紐づけた。ということになります。

上流ブランチが設定されているかは以下のコマンドで確認できます。
```
$ git branch -vv
* fix/txt 95c4a98 [origin/fix/txt] change text
  main    81228ed [origin/main] second commit
```
[]で囲まれた部分が上流ブランチです。ローカルブランチのfix/txtにoriginというリモートリポジトリのfix/txtブランチが上流ブランチに設定されていることがわかりますね。

GitHubを開くと以下のような画面になると思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3475740/fccc4e56-4c61-8fa4-e736-94ef5807f86a.png)

ブランチの数が2に増えましたね。
fix/txtの変更箇所を確認していきましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3475740/d2ff40e8-ae19-f01f-c6e4-fe649635b1be.png)
ブランチを切り替えstudy.txtを開くと
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3475740/67bfc47a-8cf2-461f-6dda-07e84992b7d5.png)
プッシュ(ローカルリポジトリにコミットした変更箇所が反映)されていますね。

では、最後にリモートのfix/txtブランチをmainブランチにマージ(統合)していきましょう。
先ほどの画面に戻ってCompare & pull requestボタンを押下すると以下の画面になります。
![git-cap3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3475740/75166cc1-3840-2aeb-46e9-2601757f002e.png)

上から、どのブランチからどのブランチにマージするか(マージできなければ***競合***という厄介なものが発生するのですが、また説明します)、プルリクエスト(このような実装/修正できたから確認と反映をお願いしますというリクエスト)、コミット履歴と変更箇所が表示されています。

複数人で行うプロジェクトだと実装内容や動作確認など細かく書く必要があるのですが、今回は適当に「first pull request」とコメントに書いてプルリクエストを作成します。

作成後、以下の画面に遷移します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3475740/f6ae52e4-8b68-a074-36dc-39b315310b73.png)
この人がこんなプルリクエストを作成したからマージするか取り下げるかしてね。というような画面です。
問題ないためMerge pull requestボタンを押し、Confirm Mergeボタンも押してみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3475740/ab7ff6b9-2043-8256-e100-b21f780bd125.png)
リモートのmainブランチにfix/txtブランチがマージされました。
fix/txtブランチはもう使わないため真ん中のDelete branchからリモートブランチを削除しましょう。

リポジトリのトップページに戻るとブランチが1つになっており、study.txtを開くとmainブランチに今回修正した内容が反映されていることが確認できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3475740/68c3e64e-4290-0205-e9cb-dc0ea04b8390.png)

最後にローカルでブランチをマージし、fix/txtブランチを削除していきます。
```
$ git checkout main
→ 作業ブランチからmainブランチに切り替える

$ git merge fix/txt
→ mainブランチにfix/txtブランチの内容を統合する

$ git branch -d fix/txt
→ ローカルのfix/txtブランチを削除する
```
study.txtを開くと今回の修正内容が反映されましたことがわかりますね。
ローカルブランチ、リモートブランチが削除されたか確認するため以下のコマンドを実行します。
```
$ git fetch -p
→ ブランチ一覧を同期するコマンド(-pオプションはリモートリポジトリに存在しないブランチを取り除く機能)

$ git branch -a
* main
  remotes/origin/main
```

作業したブランチを削除することができましたね。

今回は以上となります。
ソースコード管理サービスは違えど、どのプロジェクトもこのような流れでGitを使いバージョンを管理しているので、次回も1つ強くなれたらなと思います。
ここまで読んでくださりありがとうございました。