《GitHub》エンジニアなら絶対知っておくべきgit rebaseのやり方を解説

Git

git rebaseとは

git rebaseを使うメリット

主に以下の2つの用途で用いられます。

  • 指定のcommitをbranchを変えて作り直す
  • 複数のcommitを1つにまとめることができる

この2つについて解説していこうと思います。

指定のcommitをbranchを変えて再生成

merge commitがlogに残らない

rebaseを使うと、merge commitをlogに残すことなく、他のbranchと自分のbranchを繋げることができます。

commitが混在しない

mergeをした場合、commitが時間順に並ぶので、自身のbranchのcommitとmergeしたbranchのcommitの並び順が混在してしまい、commit logが非常に見づらくなってしまいます。rebaseを使うとこのようなことはなくなります。何故ならrebaseは合体したいbranchの最後のcommitの後から、自分のbranchのcommitを1つずつ繋げていくという方式を取るからです。

複数のcommitを1つにまとめる

オプションi

プルリクエストを出したはいいものの、修正依頼が多すぎて、多くのcommitが積み重なってしまい、commitを1つにまとめたいときなどに  rebaseを使います。複数のcommitを1つにまとめる為に次のコマンドを打ちます。

git rebase -i [まとめるコミットのなかで最も古いコミットの1つ前のcommit ID]

実際にこのコマンドを叩いて3つのcommitを1つにまとめてみます。設定として現在branch1にいるとして、過去3件のcommitは次のようになっているとします。

commit 9662814368b3f739d663a2378e2db81526b0b221 (HEAD -> branch1)
Date:   Sun Feb 23 13:36:22 2020 +0900

    commit C

commit 1a2d8e9ffc8cddfa27d7995ec2c129b038a8bcb6
Date:   Sun Feb 23 13:35:45 2020 +0900

    commit B

commit 526a2158e4836cfd0af7fe085755c5b1bca91c7b
Date:   Sun Feb 23 13:35:35 2020 +0900

    commit A

commit e6d8e7b810b4924245a853d044350ad8b28c13a7

commit A、commit B、commit Cを1つのコミットにまとめたい場合、まとめるコミットのなかで最も古いコミットの1つ前のcommit IDを指定する必要があります。なので今回はcommit Aの前のe6d8e7b810b4924245a853d044350ad8b28c13a7を-i の後ろに指定します。そうすると次のテキストが表示されます。自分はvimを設定しているのでvimが開いた状態になります。

pick 526a215 commit A
pick 1a2d8e9 commit B
pick 9662814 commit C

# Rebase e6d8e7b..9662814 onto e6d8e7b (3 commands)
#
# Commands:
# p, pick <commit> = use commit
# r, reword <commit> = use commit, but edit the commit message
# e, edit <commit> = use commit, but stop for amending
# s, squash <commit> = use commit, but meld into previous commit
# f, fixup <commit> = like "squash", but discard this commit's log message
# x, exec <command> = run command (the rest of the line) using shell
# b, break = stop here (continue rebase later with 'git rebase --continue')
# d, drop <commit> = remove commit
# l, label <label> = label current HEAD with a name
# t, reset <label> = reset HEAD to a label
# m, merge [-C <commit> | -c <commit>] <label> [# <oneline>]
# .       create a merge commit using the original merge commit's
# .       message (or the oneline, if no original merge commit was
# .       specified). Use -c <commit> to reword the commit message.
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
# However, if you remove everything, the rebase will be aborted.
#
# Note that empty commits are commented out

pickとsquash

テキストの上の行にpickという文字が書かれていますね。rebaseでコミットを1つにまとめるときは「pick」と「squash」というコマンドを指定する必要があります。pickは拾い上げる、すなわちそのまま残すcommitのこと。squashは押しつぶす、まとめるcommitのことを指します。まとめるコミットの初めはpick、それ以外はsquashと指定します。

pick 526a215 commit A
squash 1a2d8e9 commit B
squash 9662814 commit C

vimを保存して閉じると、commitメッセージを記載するためのvimが開かれます。次のように1つのcommitメッセージにまとめてみました。

# This is a combination of 3 commits.
# This is the 1st commit message:

commit ABC

# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
#
# Date:      Sun Feb 23 13:35:35 2020 +0900
#
# interactive rebase in progress; onto e6d8e7b
# Last commands done (3 commands done):
#    squash 1a2d8e9 commit B
#    squash 9662814 commit C
# No commands remaining.
# You are currently rebasing branch 'branch1' on 'e6d8e7b'.
#
# Changes to be committed:
#       modified:   test1.txt

先程と同様に保存すればrebaseが完了です。git logを叩いて確認してみると

commit 2eebcf471cf264ff741e491a93ae11c5c2c45e9c (HEAD -> branch1)
Date:   Sun Feb 23 13:35:35 2020 +0900

    commit ABC

commit e6d8e7b810b4924245a853d044350ad8b28c

commit A、commit B、commit Cがcommit ABCというcommitにまとめられていることが確認できました。

番外:おすすめアイテム

記事の内容とは別に自宅・オフィスでの開発がもっと快適に、楽しくなる商品を紹介します。アイテム1つで開発効率が一気に向上したり、開発のモチベーションが上がったりするので良いアイテムにはお金を投資すると良いかと。

KATUO
KATUO
今回紹介する商品は普段自分が使っているものなので自信を持ってお勧めできますー。では1つずつ紹介していきます。

おすすめアイテム①

自分はオフィス次の2点の座布団と背もたれクッションを利用してます。姿勢が安定し、お尻への負担が激減します。オフィスにいるのに自宅で作業しているような感覚になるので気に入ってます。また疲労感もかなり減るので費用対効果が非常に高いアイテムです。

おすすめアイテム②

ブックスタンドみなさん使ってますか?PCを打ちながら参考書見る時に手で抑える必要がなくなるので非常に便利です。自分も購入した時なんでいままで使ってなかたんだろうと後悔したのでまだ持ってない方は買っておくと作業効率があがります。

おすすめアイテム③

PCスタンド、magic keyboard、magic mouseを購入してから、開発効率があがり、身体的負担が減って快適に開発ができるようになりました。

エンジニアの基礎知識・教養

別の記事でエンジニアとして知っておくべき技術本についてまとめました。初心者には最低限読んでおいて欲しい技術本をまとめました。例えば「リーダブルコード」などは技術力の高いエンジニアなら必ず過去に読んでいる本だと思います。

筆者
筆者

今回の記事の内容は以上で終了です!最後まで読んでくれてありがとうございました!Twitterもやってるのでよかったらフォローしてください!

タイトルとURLをコピーしました