Git ブランチ 管理コマンド

# これは *個人の* 勉強記事です

# Git ブランチ管理コマンド

## ローカルでの新ブランチ作成、現在のブランチの表示

ファイル操作で言うと`mkdir`, `ls`

参考
[git コマンド branchの作り方]
(https://qiita.com/TetsuTaka/items/5ab227a8bd2cd7106833)

ローカルのリポジトリで

```
git checkout -b <branchName>
```

で作成する
(`-b`をつけなければ生成されないので、通常の移動先に存在しないブランチを指定したときにうっかり作成されることはない。)

```
git checkout -b hoge
Switched to a new branch 'hoge'

git branch -a
* hoge
  master
  remotes/origin/HEAD -> origin/master
  remotes/origin/master
```

これで今コマンドで作成したブランチ無事に作成できていて
私は今そのブランチにいることがわかる．

なお、リモート (GitHub など) でブランチを作成することもできるが

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243383/856d8d15-8e2f-a577-5854-7e315a5afcc8.png)

この場合はlocalで`git fetch`しないと反映されない。
そもそもリモートで編集してその変更をローカルで取り込む (fetch) のは今のチームでは非推奨となっている。

## ローカルでのブランチ移動

ファイル操作で言うと `cd`

参考
[【 git checkout 】コマンド（基礎編）――ワークツリーを特定のブランチやコミットに切り替える]
(https://www.atmarkit.co.jp/ait/articles/2004/24/news028.html)

https://qiita.com/sunstripe2011/items/53ae4184d021e927b3
(https://qiita.com/sunstripe2011 さんの削除された記事)

ブランチを移動する場合は

```
git checkout <branchname>
```

で移動できる。

```
git branch -a
* 20200701-report
  hoge
  master
  remotes/origin/20200702-daily-reoprt
  remotes/origin/HEAD -> origin/master
  remotes/origin/hoge
  remotes/origin/master
```

現在 20200701-report, hoge, master, のブランチがあるなか
20200701-report にいるのを確認して

```
git checkout hoge
Switched to branch 'hoge'
Your branch is up to date with 'origin/hoge'.
git branch -a
  20200701-report
* hoge
  master
  remotes/origin/20200702-daily-reoprt
  remotes/origin/HEAD -> origin/master
  remotes/origin/hoge
  remotes/origin/master
```

hoge ブランチに移動。
もう一度 現在地を確認すると、hoge ブランチにいることが再確認できた。

こうして、
20200701-report のブランチにいる状態から
`git checkout hoge` を使うことで
hoge のブランチに移動できることが確認できた

------------------------------------

## ローカルブランチ名の変更

参考
https://linuxize.com/post/how-to-rename-local-and-remote-git-branch/

>
Rename the local branch by typing:
>
```
git branch -m <new_name>
```

* 現在のブランチの名前はbranch -m で変更できる



## ローカルブランチの削除

ファイル操作で言うと `rm -f`

参考
[How can I delete branches in Git?]
(https://www.git-tower.com/learn/git/faq/delete-remote-branch)

ローカルのブランチを削除したい場合は

```
git branch -d <branchName>
```

で削除することができる。

```
git branch
  20200707-daily-report
* 20200708-daily-report
  hoge
  master
```

現在 20200708-daily-report ブランチにいることを確認。
hoge はテスト用のブランチなので削除したい。

```
git branch -d hoge
Deleted branch hoge (was 043aab3).
```

これで ブランチ hoge が削除できた。
削除したブランチの16進数の id も確認できる

git はコミットもブランチも16進数の id がついている

```
git branch -d test0709
error: Cannot delete branch 'test0709' checked out at '/your/directory/kaede0902-daily-report'
```

なお、今いるブランチは そこから checkout しないと削除できない。
ホテルに人が泊まって(check in して)いたら解体出来ないみたいなことだ。

```
git branch -d test0709
error: The branch 'test0709' is not fully merged.
If you are sure you want to delete it, run 'git branch -D test0709'.
```

また、リモートで PR が pending で merge されていない段階で、ローカルのブランチを削除しようとすると警告が出る。

## GitHub (リモート)側のブランチの削除

参考
[復習 Git: GitHub のブランチを削除する．]
(https://passingloop.tumblr.com/post/18015576208/remove-remote-branches-by-git-push)

CLIでやるのは非常に大変そうだ。

参考
[Creating and deleting branches within your repository]
(https://docs.github.com/en/github/collaborating-with-issues-and-pull-requests/creating-and-deleting-branches-within-your-repository)

しかしGitHubでなら簡単だった。

ブランチの名前が2020... レ「オ」ポートに typo されているから削除する

view all repositoriesのリンクからこれを

![Screen Shot 2020-07-03 at 17.23.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243383/0bd99529-c424-c0a1-1393-400a6419fa43.png)

こうじゃ！！！

![Screen Shot 2020-07-03 at 17.24.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243383/80f119be-7357-0f9c-a78f-c09cbdc965b1.png)

しかもゴミ箱ボタン押してしばらくは restore ができる新設設計．GitHub 愛してます！！


## 実践例： git による日報ワークフロー

### 前提

現在、私は練習のために日報を毎日 git コマンドを使って GitHub の日付ごとのブランチに日報を提出することにしています。

ここまでに学んだ git の使い方の実践例として、git を使った私の毎日の日報提出のワークフローをまとめて、
実際にそのフローで上記のコマンドがどう使われているかを紹介しようと思います。

ローカルの master からその日の日報用のブランチを作るところから解説します。
日付は仮に 2020/07/02 として進めます。日報の内容には触れません。

### 現在地確認

```
git branch
```

で 現在のブランチを確認

### リモートの master と ローカルの master の一致

```
git pull origin master
```

リモート の master を pull  ( fetch & merge) してローカルの master をリモートの master の状態と一致させる

[git pull --rebaseをpushする前にやろうという話。]
(https://qiita.com/makua/items/7aa1f4fa02ef9ab1f9d9)

`--rebase` をつけるべきとの意見もある。

### 今日の日報のブランチの作成、移動、記入

```
git checkout -b 202000702-daily-report
```

ローカルの master から日報用のブランチを作る

```
git checkout -b 20200702-daily-report
Switched to a new branch '20200702-daily-report'
```

作成されて移動できた。

ここで `2020/07/` の `02.md` に日報を記入。

### ステージングとコミット

```
git add .
```

master から作った枝だから、今作ったもの以外は 入ることがない

```
git commit
```

ステージングした日報ファイルを現在のブランチに commit。
正確には この後 vim が開いてコミットメッセージを書く。
この一行目が PR のタイトル
二行目が PR の本文 に反映される（後からも変えられる）

```
git commit
On branch 20200702-daily-report
nothing to commit, working tree clean
```
( branch名を教えてくれる）
この日報用ブランチを GitHub に push

ローカルで今自分が checkout しているブランチが hoge なのであれば、

```
git push origin hoge
```

origin master への直接 push は原則禁止となっている。

origin に今の commit を新しいブランチごと提出すると

```
git push origin 20200702-daily-report
Enumerating objects: 4, done.
Counting objects: 100% (4/4), done.
Delta compression using up to 12 threads
Compressing objects: 100% (2/2), done.
Writing objects: 100% (2/2), 373 bytes | 373.00 KiB/s, done.
Total 2 (delta 0), reused 0 (delta 0)
remote: 
remote: Create a pull request for '20200702-daily-report' on GitHub by visiting:
remote:      https://github.com/your-repository/pull/new/20200702-daily-report
remote: 
To github.com:/your-repository/kaede0902-daily-report.git
 * [new branch]      20200702-daily-report -> 20200702-daily-report
```

こうなる。「origin (リモートのこと)に送信したから GitHub から PR 出してね」と教えてくれる。

### PR (Pull Request)

![Screen Shot 2020-07-03 at 18.51.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243383/8d9bc2db-7015-6486-3df5-0f7362171fa8.png)

これで今 (6 minutes ago) に origin に push したブランチである 20200702-report が確認できたので

`compare & pull request` する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243383/0f684a73-64e1-726d-4171-c0ebea62f336.png)

ここで コミットメッセージがタイトル、本文に反映されるので、それと PR のタイトル本文を変えたい場合はここで変更する。

現在のチームではこの書き方になっています。この後にレビュワーを指定し、メンションしてレビューをお願いします。

### PR を出した後の commit の修正

自分で間違いに気付いたり、レビュワーさんにもらったコメントから出した PR の commit の修正をする場合

単純にそのブランチで作業して commit してpush すれば OK
ただ、history から commit 自体を減らしたいなら PR したブランチをローカルに pull して rebase して push -f しなければならない。とても大変なので注意。

(Git コミット管理コマンドの記事で解説します)

### ローカルでの master への復帰と pull

2020/10/11 追記

前述の工程で feature ブランチを push した後、
**push された feature ブランチをマージして master ブランチに統合しているのはリモート側のみ** 
なので feature ブランチを レビュアーが **リモート側で** マージした後は
自分の **ローカル側でも** master に戻り、pull して自分のブランチの master のも反映させてから、新しくブランチを切る必要がある。

コマンドだと

```
git push origin YOUR_FEATURE_BRANCH
Writing objects: 100% (5/5), 471 bytes | 471.00 KiB/s, done.  
remote:
To github.com:kaede0902/easy-biz-email.git 
 * [new branch]      head -> YOUR_FEATURE_BRANCH
```

これで feature ブランチを push して、レビュアーに master ブランチにマージしてもらった後に

```
git checkout master   
Switched to branch 'master' 
git pull origin master
remote: Enumerating objects: 1, done.                         
```

これでローカルの master に戻って origin から 自分の commit の PR がマージされた master ブランチの内容を
**自分の master ブランチにも反映させる必要がある。**

レビュアーの PR のマージが遅くなる場合は、コンフリクトが起きないように PR 承認待ちの作業と衝突しない箇所を作業するブランチを作る必要がある。


以上。