【git】(続き)ブランチ、プル、マージとか【チーム開発を目指して】


https://qiita.com/hemuwan-kazu/items/44c77ecc90c541a79f94

からの続き。

こっちは気を付けることはなさそうなので自分用にメモ。内容はｎ番煎じ。

githubにpushできたリポジトリをクローンするとこからやっていく。

### 使うコマンド一覧
 - `git clone <githubリポジトリのパス>`
 - `git branch <任意の名前>`
 - `git checkout <移動先ブランチ名>`
 - `git branch `
 - `git add <ファイル名>`
 - `git commit -m <"メッセージ">`
 - `git push <リモートリポジトリ名> <ブランチ名>`
 - `git pull` 
 - `git log`

以下のコマンドを実行し、パスフレーズを打ち込むとクローン完了。
（なぜか今回はssh://なしでいけた。もうよくわからん）

```powershell
> git clone git@github.com:hemuwan/test.git

Cloning into 'test'...
Enter passphrase for key '/c/Users/hemuwan/.ssh/id_rsa':
remote: Enumerating objects: 9, done.
remote: Counting objects: 100% (9/9), done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 9 (delta 0), reused 9 (delta 0), pack-reused 0
Receiving objects: 100% (9/9), done.
```


# ８．ブランチを作成する。
ブランチは枝分かれという意味。もとのデータからいくつも別軸を生み出し、並行して作業を行うのを枝が伸びる様子に例えられているんだとか。

`git branch <任意の名前>`コマンドを使う。

クローンで作成されたフォルダに移動し、ブランチを作成する。
名前は参考に倣って「feature1」としておく。

```powershell
> cd test
test > git branch feature1
```

作成した後、該当のブランチで作業するためにはブランチを移動しなければならない。
`git checkout <移動先ブランチ名>`コマンドで移動できる。

```powershell
test> git checkout feature1
Switched to branch 'feature1'
```

名前を指定しないで`git branch`コマンドを実行すると、現在のローカルリポジトリに存在するブランチが一覧で見れる。いまは「master」と「feature1」のみ。
作業中のブランチには頭に＊が表示される。


```powershell
test>git branch
* feature1
  master
```
# ９．ブランチでコミットし、リモートリポジトリにプッシュ

とりあえずなんか変化を加える。
新しいファイルでも作成してみる。

```powershell
test> notepad branchtest.txt
// 中身にブランチのテスト、と記述
```

新しく作成したファイルをローカルリポジトリにコミットし、リモートリポジトリにプッシュする。
以下のコマンドを実行していく。

```powershell
test> git add branchtest.txt
test> git commit -m "[Add] branchtest"
[feature1 f73bcd7] [Add] branchtest
 1 file changed, 1 insertion(+)
 create mode 100644 branchtest.txt
test> git push origin feature1
Enter passphrase for key '/c/Users/hemuwan/.ssh/id_rsa':
Enumerating objects: 4, done.
Counting objects: 100% (4/4), done.
Delta compression using up to 4 threads
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 307 bytes | 307.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
remote:
remote: Create a pull request for 'feature1' on GitHub by visiting:
remote:      https://github.com/hemuwan/test/pull/new/feature1
remote:
To github.com:hemuwan/test.git
 * [new branch]      feature1 -> feature1
```

初回の時とは違い、プッシュ先が「feature1」になっている点に注意。
コマンドを実行するとパスフレーズが求められ、入力すると上記のように「プルできたよー」と表示がされるはず。

githubを見にいくと、ブランチが追加されているのが確認できる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494508/206812ae-89f2-239b-de9c-f812d33a99f8.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494508/4a1c050f-a066-7237-2e35-f21beae29995.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494508/c6fba031-9dfb-8e2a-d0c0-77225a09781f.png)

# １０．プルリクエスト（コードレビュー）、マージ

ブランチでの作業が完了したら、メインとなるブランチ（たぶんmaster）に変更内容を取り込んでいく。これをマージという。

マージを行う際、github上ではプルリクエストと呼ばれる機能を使い、コードレビューを行うことができる。

githubを開き、`Pull requests`タブから`New pull request`ボタンを押下。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494508/8d4e78e3-807e-e66a-2695-5b191ef87ef4.png)

マージ元（base:master）とマージ先（compare:feature1）のブランチを選択
（元と先の関係逆か？　とりあえず矢印に従えばよいか）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494508/8edbb0a6-6059-9a65-b832-aea72042be19.png)

変更点確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494508/0ce0a4e0-5dee-08e8-da8c-537201035aab.png)

`Create pull request`ボタンを押下。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494508/73b7ff34-708d-3b10-0b43-9ef520a4a136.png)

依頼のコメント書いたり、右上のレビュアーを設定したり
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494508/b904e04e-fa09-bbfc-d9e2-47af24ae9f1e.png)

準備できたら再び`Create pull request`ボタンを押下。
（draftなんちゃらは下書き的なやつか。準備できてないとマージできないよとのこと）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494508/2cbdbdbb-6acc-b0c9-336b-7e0f2dcb2ac9.png)

## １１．レビューの実施

プルリクエストを受け取ったら「Pull requests」タブを開き、「File changed」から内容を確認。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494508/03828786-6d53-ee2c-4944-263610a16373.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494508/f87917aa-c65b-a4cb-58a0-5c78bec5db60.png)

訂正がある場合などは、該当の行にマウスホバーすると「＋」がでるので、クリックするとコメント追加の領域が現れる。何かほかにもいろいろ機能あるっぽい。すごいなんとなくでやってる。
とりあえず突っ返してみる。
コメント記入 > start a review 押下。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494508/dd905f94-239c-05ce-c564-f938e5fc4cce.png)

右上のボタン`Finish your review`を押下すると、コメントを書く欄と、以下のラジオボタンが出る。（右は翻訳内容）

- comment コメント：明示的な承認なしに一般的なフィードバックを送信します。 
- Approve 承認：フィードバックを送信し、これらの変更のマージを承認します。 
- Request changes 変更をリクエストする：マージする前に対処する必要があるフィードバックを送信します。 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494508/57d2ef24-30e0-b0bc-0801-e48eade59d18.png)

`Approve`は内容OKだよーで、`Request changes`はこれさえ直せばOKで、`comment`がごめんやり直して―ってことかな。
とりあえず、commentで`Submit review`押下。
`conversation`タブに以下の表示が。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494508/fd606994-d929-0f79-e5d4-06efc704da14.png)

こうやって、作業者と承認者がやり取りしていくのかな。
返事うったりスタンプ押したりもできる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494508/5c7ff9a0-398c-c344-52a8-880bfb94e971.png)

とりあえず直せと言われたの出なおします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494508/6e934236-fc79-b672-18ca-81f3cd8d6123.png)

ふたたびローカルリポジトリ更新。
`git add .`コマンド。`.`で現在のディレクトリを表し、ディレクトリ全体の変更を反映できる。

```powershell
test> git add .
test> git commit -m "[Update]文修正"
[feature1 24ba4a9] [Update] 文修正
 1 file changed, 2 insertions(+), 1 deletion(-)
```

んでもう一回pushかな。（手探り）

```powershell
test> git push origin feature1
Enter passphrase for key '/c/Users/hemuwan/.ssh/id_rsa':
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Delta compression using up to 4 threads
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 353 bytes | 353.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To github.com:hemuwan/test.git
   f73bcd7..24ba4a9  feature1 -> feature1
```
githubを開くとなんか増えてる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494508/3923ed17-7d6c-669f-c0fa-4f872c89449e.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494508/12e5dc44-69f9-9712-2ee1-f6af0cabb7de.png)

また`New pull request`かな。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494508/b9372e1e-e22f-a774-d768-082963a1fb5e.png)
`View pull request`ボタンを押下。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494508/74e60002-c8fb-5c10-14f8-b80940910e66.png)
続きにコメントかけるっぽい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494508/020750a3-a8e7-2817-661b-1f0a13d16800.png)

再びレビュー者視点。
問題ないのでOKのコメント残しとく。
（今気づいたけどpull request出した本人は承認押せないっぽい。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494508/a0905c12-bd9a-457d-6559-707df46ba4e8.png)

過去の修正依頼は完了したのち、`Resolve conversation`ボタンを押すと表示を消せる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494508/c115699b-0996-9047-3f9e-72e47fb2dcbf.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494508/de53c185-b057-f77f-120f-50fe6a67e784.png)

問題なくなったのでいよいよマージ。
`Conversation`タグの`Marge pull request`を押下。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494508/0d2c3407-35de-b965-da5f-c4120baadc38.png)

コメントはよくわからんのでそのまま`comfirm marge`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494508/e434f4f3-c5e6-ec07-bc88-c55436a30c0b.png)

マージできたで。ブランチfeature1は完全に消せるでというメッセージ。
（ブランチは`git branch -d <ブランチ名>`で消せる。マージしたら消すものらしい）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494508/24e20312-cdd9-d72d-9f1b-e26b2021df81.png)

masterのブランチを見てみると、feature1ブランチで作成した`branchtest.txt`が追加されている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494508/04b2a453-1a44-52db-17f7-177b726dd9a8.png)

マージできたあ！ぐっだぐだ。

# １２．ローカルリポジトリからプル。

リモートリポジトリのmasterブランチにマージはできたが、自分自身のPCの中のローカルリポジトリ上のmasterにはマージの内容が反映されていない。

マージした内容をローカルリポジトリのmasterに取得し、最適化するにはローカルでmasterブランチに切り替え、`git pull`コマンドを実行すればよい。

```powershell
test> git checkout master
test> git branch
  feature1
* master
test> dir
//test.txtしかないことを確認 
test> git pull

Enter passphrase for key '/c/Users/hemuwan/.ssh/id_rsa':
remote: Enumerating objects: 1, done.
remote: Counting objects: 100% (1/1), done.
remote: Total 1 (delta 0), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (1/1), 624 bytes | 10.00 KiB/s, done.
From github.com:hemuwan/test
   6ca8868..46d8a35  master     -> origin/master
Updating 6ca8868..46d8a35
Fast-forward
 branchtest.txt | 2 ++
 1 file changed, 2 insertions(+)
 create mode 100644 branchtest.txt
```
パスフレーズを入力するとなんやかんや入ってきそうな流れ。
ファイルを確認すると、マージした「branchtest.txt」がある。

```powershell
test> dir
test.txt
branchtest.txt
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494508/7b077d32-fe65-7228-c1f5-ed9da2dd76c3.png)

`git log`コマンドでこれまでの編集履歴を見れる。

```
test>git log
commit 46d8a35b3fb8ーーコミットハッシュ (HEAD -> master, origin/master, origin/HEAD)
Merge: 6ca8868 24ba4a9
Author: hemuwan <61411705+hemuwan@users.noreply.github.com>
Date:   Fri Oct 22 13:09:04 2021 +0900

    Merge pull request #1 from hemuwan/feature1

    [Add] branchtest

commit 24ba4a966e0faーーコミットハッシュ (origin/feature1, feature1)
Author: hemuwan <メアド>
Date:   Fri Oct 22 12:46:26 2021 +0900

    [Update] 文修正
~以下省略、抜けるときはQキーで~
```

ながかったがとりあえずここで一区切り。

ひとまずこれでチームによる開発も可能になったかなと。
あとは一緒に開発してくれる友達を見つけるべし。