概要
この記事はGitでの開発初心者を対象にした記事です。
まず、なぜコミットをまとめる必要があるのか?
コミットとは修正を確定した時にその時点の情報を記憶し、管理することができます。
問題が発生した時、修正前(過去のコミット時)の状態に戻ることも可能です。
チームで開発を行う場合は知っておいたほうがよいでしょう。
コミットをまとめるとは?
例えば以下のように開発ブランチとマスターブランチがあったとします。
開発ブランチの修正を何も考えずにマージ(取り込み)を行うと、以下のようになります。
これだと見にくい(醜い)ので、
開発ブランチのコミットを以下のように纏めます。
これでマージを行えば、マスターの履歴も綺麗になり、バグが発生したときに
いつ時点のコミットに戻ればいいのか分かりやすくなります。
Gitでのコマンド
複数のコミットを一つに纏めるためのGitコマンドを紹介します。
- マージ先のブランチ情報を取り込む
git fetchでリモートから最新の情報をローカルへDownloadし、
git pull --rebaseを行う。[miyahuji]$ git fetch
[miyahuji]$ git pull --rebase origin ブランチ名
(例) git pull --rebase origin develop
- コミットのログを確認
git log --oneline コマンドでコミットのログを確認する。【実行結果】
[miyahuji]$ git log --oneline
1aea940 試作版作成
2c07c03 バグ対応
3309d00 送信機能実装
4b4b2e1 バグ対応
- コミットをまとめる
git rebase -i HEAD~5 コマンドを利用し、複数回コミットした結果を1個にまとめましょう。
※末尾の数字は表示するコミット履歴の件数です。今回は4コミットのため、
余裕をもって 5 を指定します。
(3-1)コマンドを実行
[miyahuji]$ git rebase -i HEAD~5pick 1aea940 試作版作成
pick 2c07c03 バグ対応
pick 3309d00 送信機能実装
pick 4b4b2e1 バグ対応# Rebase xxxxx...xxxxxxx...xxxxxx
#
# Commands:
# p, pick = use commit
# r, reword = use commit, but edit the commit message
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
# f, fixup = like "squash", but discard this commit's log message
# x, exec = run command (the rest of the line) using shell(3-2)コミット履歴を修正
コマンドを実行したら I (編集モード)を入力し、 pick を f or fixup にする。
f (fixup)は1個前のコミットに修正を統合するという意味。そのため、一番最初のpickを残し、新しいものから f に書き換えれば良い。
【例:修正後イメージ】
[miyahuji]$ git rebase -i HEAD~5
pick 1aea940 試作版作成
f 2c07c03 バグ対応
f 3309d00 送信機能実装
f 4b4b2e1 バグ対応
変更が完了したら[Esc]で編集モードを抜け、":wq"で保存して、終了する。
コミットのコメントを修正する。
コマンド「git commit --amend」を使い、直近のコミットコメントを変更する。
先ほど、コミットを纏めたので、pickを指定したコミットコメントが表示される。
【実行結果】
[miyahuji]$ git commit --amend試作版作成
Author: miyahuji <miyahuji@example.com>
2 files changed, 171 insertions(+), 5 deletions(-)
I (編集モード)を入力し、変更が完了したら[Esc]で編集モードを抜け、":wq"で保存して、終了する。
- pushを行い、マスターへのマージを依頼する(完了)オプションの補足説明【実行コマンド】
git push -u -f origin develop
-f は強制push コミットを纏めた場合、通常のpushは通らないと思ったほうがいい。
-u は一度-uで実行した後は「git push」だけでpushできるようになる。
指定しなくてもよい。