【Git】複数のコミットを1つにまとめる方法

はじめに

どうも、後期中間テストが終わり、ホッとしていたのも束の間、レポートや課題に追われてフガフガしているaridaiです。
今回は 複数のコミットを1つのコミットにまとめる ということをやってみたので、それのメモを残したいと思います。

作業前の状態

test ブランチがあります。
その中に3つのコミットがあります。

  • テストコミット1
  • テストコミット2
  • テストコミット3

作業後の状態

test ブランチに元々3つあったコミットを

  • テストコミット!!!

の1つにまとめています。

操作の流れ

以下に順を追って説明していきます。

コマンドを打ち込む

ターミナルに git rebase -i HEAD~3 と打ち込みます。
これは リベース を行うというコマンドで、-i オプションと、引数に HEAD~n を与えています。

この引数 HEAD~n は 「HEAD (そのブランチの現在のコミット) から HEAD を含めてn個のコミットを編集対象にする」という意味です。

git-rebase-todoを編集する

コマンドを打ち込むとエディタが立ち上がります。
(私の環境では VSCode に設定してありますが、大抵 Vi が立ち上がると思います。)

ここでは「どのコミットをどのような操作をするのか」を以下のコマンドによっていじることができます。

コマンド 説明
p, pick コミットをそのまま残しておく。
r, reword コミットを残すが、コミットメッセージを編集する。
e, edit コミットの中身を編集する。
s, squash 前のコミットに統合する。
f, fixup 前のコミットに統合するが、コミットメッセージは破棄する。
x, exec 任意のコマンドを実行する。
d, drop このコミットを削除する。

今回は、0b9970e テストコミット24f14574 テストコミット3 に対して squash を使うことにしました。
これによって 642d144 テストコミット1 に2つのコミットを統合させ、1つのコミットにまとめることができます。

編集したら、保存をし、エディタを終了させます。

COMMIT_EDITMSGを編集する

すると、またエディタが立ち上がります。
ここではコミットメッセージの編集ができます。

# で始まる行は無視されるので、この状態では

テストコミット1

テストコミット2

テストコミット3

というコミットメッセージになってしまうので、

テストコミット!!!

と書き換えてしまいましょう。

編集が終わったら、保存をしてエディタを閉じましょう。

さいごに

成功した場合は

このようになると思います。
(SourceTree側の表示が作業前の状態の場合、これはターミナルでの編集との同期が取れていないだけなので、 フェッチ ボタンを押すと、更新がかかるので作業内容が適用されるはずです。)

というわけでこんな感じでコミットをまとめることができると思います。

2017/12/09 13:16:57
画像つきの記事
画像をつけようと思うと色々とめんどくさかったなぁ。
自分のサーバー上にアップすることもできるんだけど、いちいちめんどくさいなぁと思ったからTwitterに一度アップしたやつを参照するようにしている。
これ、どうにかしたいなぁとは思ってる。
2017/12/14 10:34:41 - aridai
これができない場合
リベースを実行しようとすると、"fatal: Needed a single revision"と出て怒られる場合、
http://d.hatena.ne.jp/ken_c_lo/20130421/1366558065
を試すといいかも。
2018/05/15 16:57:22 - aridai
コメントを投稿する