個人的 Gitの便利な機能

# はじめに
本記事は、[三重大学 計算研 Advent Calendar 2019](https://qiita.com/advent-calendar/2019/calc-mie) 23日目です。
Gitを個人で普段使いするときに便利だなと思っている機能を3つ紹介します。
共同開発をしているときはむやみやたらに使用しないことをおすすめします。

この記事では、次の3つの方法を扱います。

- merge時にlogをキレイに保つ方法
- 直前のcommitの簡単な修正方法
- GitHub等のremoteブランチの削除方法

# merge時にlogをキレイに保つ方法
新機能を追加するときは、masterブランチ以外（例えばfeatureブランチ）で作業を行うのが一般的です。
通常、featureブランチで新機能の実装を行った後、masterブランチに`merge`します。
しかし、何も考えずに`merge`してしまうと、masterブランチに実装時の細かな`commit`が追加され、ログが読みづらくなってしまいます。
そんなときに便利な機能が`squash`です。

merge時に`squash`を指定すると、次のようにmergeするcommitを1つにまとめてmasterブランチのlogをキレイに保てます。


```xml:例）squashを使用した場合のmasterブランチのlog
<BEFORE>
- ...
- 新機能〇〇用関数 new_feature() を追加。
- new_feature() にエラー処理を追加。
- new_feature() の型を修正。
- new_feature() にコメントを追加。
- new_feature() のコメントを修正。
- new_feature() の変数名を変更。
- new_feature() のコメントを修正。
- ...

<AFTER>
- ...
- 〇〇をする機能を追加。
- ...
```

`squash`を使うには、`merge`時に`--squash`を指定します。

```terminal:例）squashを使ってfeatureブランチをmergeする方法
[ブランチ名を確認]
$ git branch
  feature
* master
 
[merge時にsquashを指定]
$ git merge --squash feature
Updating b1e991e..df95b90
Fast-forward
Squash commit -- not updating HEAD
 new_feature.c | 16 ++++++++++++++++
 README        |  5 +++++
2 files changed, 21 insertions(+)
 create mode 100644 new_feature.c

[merge分をコメントを付けてcommit]
$ git commit -m "〇〇する機能を追加"
[master 563bc73] 〇〇する機能を追加
2 files changed, 21 insertions(+)
 create mode 100644 new_feature.c
```

今回紹介したのはmasterブランチ側でcommitをまとめる方法ですが、featureブランチ側でまとめる方法もあります。また、共同開発をしている場合はfeatureブランチ側で変更内容をまとめてからプルリクエストを送るほうが良いらしいです。

featureブランチ側でまとめる方法は　[【git rebase -i】gitのcommitをまとめる](https://qiita.com/tsuuuuu_san/items/f708a9f7ea8ab8eb6945)　で解説されています。
# 直前のcommitの簡単な修正方法
皆さんは、`git commit`をした直後に
　「あ、ミスったな」
って思ったことはありませんか？

`amend`というオプションを使うと、直前の`commit`を**しなかったこと**にして改めて`commit`し直すことが出来ます。

この機能を使えば、

- 追加忘れのファイルの追加
- コメントの誤字・脱字を修正
- ファイル内の誤字・脱字を修正

などの作業を簡単に行なえます。

やり方は簡単で、commit時に`--amend`を付けるだけです。

```terminal:例）amendを使ってコメントを修正
[修正する対象]
$ git commit -am "昨日書いたところにエラー処理を追加"
[master e1f21dc] 昨日書いたところにエラー処理を追加
 1 file changed, 20 insertions(+), 2 deletions(-)

[amendを使って直前のcommitを修正]
$ git commit -am "サーバ側が異常終了したときのエラー処理を追加" --amend
[master 3eb9d2c] サーバ側が異常終了したときのエラー処理を追加
 Date: Sat Dec 21 11:24:38 2019 +0900
 1 file changed, 20 insertions(+), 2 deletions(-)
```

`--amend`を付けるだけで、前半のcommitは**しなかったことになり**、後半のcommitに統合されました。commitしなかったことになるだけなので、作業内容は失われません。



# GitHub等のremoteブランチの削除方法
ローカルで不要になったブランチを削除するには
　`git branch -d <BRANCHNAME>`
を実行します。

しかし、これだけではGitHub等の外部にあるブランチは残ったままになります。
そんなときには`git push <REMOTENAME> :<BRANCHNAME>`を実行します。
`<REMOTENAME>`はリモート名（下の例ではorigin）、`<BRANCHNAME>`は削除したいブランチの名前で置き換えてください。

```terminal:例）GitHub側のtestingブランチを削除する方法
[remote名を確認]
$ git remote -v
origin github:AkiraHasegawa1997/hogefuga_project (fetch)
origin github:AkiraHasegawa1997/hogefuga_project (push)

[GitHub上のtestingブランチを削除]
$ git push origin :testing
To https://github.com/AkiraHasegawa1997/hogefuga_project.git
 - [deleted]         testing
```

このコマンドは、ブランチ名を空文字にリネームすることでブランチの削除をしています。
※注意：一度削除したら戻せません。

# まとめ
今回は自分が個人用リポジトリでよく使うGitの機能を紹介しました。
この記事が少しでも役に立ったら幸いです。
ここまで読んでいただきありがとうございました。

# 参考
- [入門git（本）](https://www.amazon.co.jp/%E5%85%A5%E9%96%80git-Travis-Swicegood/dp/427406767X/ref=tmm_pap_swatch_0?_encoding=UTF8&qid=&sr=)
- [Pushing commits to a remote repository - GitHub Help](https://help.github.com/en/github/using-git/pushing-commits-to-a-remote-repository#deleting-a-remote-branch-or-tag)
- [【git rebase -i】gitのcommitをまとめる](https://qiita.com/tsuuuuu_san/items/f708a9f7ea8ab8eb6945)