Git

【Git】離れた複数のcommit(コミット)をまとめる方法

【Git】離れた複数のcommit(コミット)をまとめる方法

Gitで離れた複数のcommit(コミット)をまとめたいけど方法が分からない。。どうやってやるの?

今回はこういった疑問にお答えします。

 

この記事を読めば、一つにまとめたい複数のコミットをサクッとまとめることができるようになります。

少しでも参考になれば幸いです。

【Git】離れた複数のcommit(コミット)をまとめる方法

まずは現状を整理しましょう。

以下のように複数のコミットがあって、TODOと書いてある3つのコミットとhogeと書いてある2つのコミットをそれぞれ一つにまとめたい状況です。

離れた複数のコミットがある状態

 

このような状況で使うべきGitコマンドはgit rebase -iです。

 

まず、以下のコマンドを打って最新のコミットから5個目までのコミットを編集対象にします。

git rebase -i HEAD~5

 

すると以下のようにエディタが開きます。

これが複数のコミットを一つにまとめるための編集画面です。

git rebase -iで開かれる画面

 

この中で編集するのは以下の部分です。

pick 1e23c92 TODO
pick ec4a6d0 hoge
pick 4829df3 TODO
pick 7d8b415 TODO
pick 824129e hoge

 

今回はコミットメッセージがTODOになっている3つのコミットとhogeとなっている二つのコミットをそれぞれ一つにまとめるため、以下のように編集します。

pick 1e23c92 TODO
f 4829df3 TODO
f 7d8b415 TODO
pick ec4a6d0 hoge
f 824129e hoge

 

変えたのは以下の二点です。

  • ec4a6d0を7d8b415の下に移動させた
  • TODOとhogeのまとめるコミットをpickからf(fixup)に変更した

 

変更を一つにまとめるには、まとめたいコミットのpickとなっている部分をs(squash)もしくはf(fixup)に変更します。

 

しかし、これらは「直前のコミット」に取り入れる指定のため、3つのコミットが非連続になっていては都合が悪いです。

そのため、TODOの3つのコミットとhogeの二つのコミットがそれぞれ連続するようec4a6d0を7d8b415の下に移動させました。

 

次に、TODOのコミットについて、1e23c92に4829df3と7d8b415を取り込むため、4829df3と7d8b415をpickからf(fixup)に変更しました。

hogeについても同様にec4a6d0に824129eを取り入れるため、824129eをpickからfに変更しました。

 

今回squashでなくfixupを使用した理由は、1e23c92のコミットメッセージ(TODO)とec4a6d0のコミットメッセージ(hoge)を変更する必要がなかったからです。

コミットメッセージの変更が必要な場合はfixupの代わりにsquashを使いましょう。

fixupとsquashの挙動の違いはこちらの記事が参考になります。

 

以上でTODOの3つのコミットとhogeの2つのコミットがそれぞれ一つにまとまるはずです。

 

:wqでエディタを閉じてGitのログを再度確認してみましょう。

git rebase -iでコミットをまとめた状態

 

TODOとhogeのコミットをそれぞれ一つにまとめてコミットログをスッキリさせることができました!

 

【Git】離れた複数のcommit(コミット)をまとめる方法

今回はGitで離れた複数のcommit(コミット)をまとめる方法をご紹介しました。

再度流れを確認します。

  1. git rebase -iでコミットの編集画面を開く
  2. まとめたいコミットが連続になるようコミットの順番を変更する
  3. 一つ上のコミットにまとめたいコミットのpickをf(fixup)もしくはs(squash)に変更する

 

上記の手順を踏むことで、離れた複数のcommit(コミット)をまとめることができます。

 

コミットを綺麗に保つことは、過去にした作業内容を振り返る際や、後の改修効率を上げる意味でも重要です。

また、コミットが汚いか綺麗かで周りの人のあなたへの印象も変わってきます。(間違いなく綺麗な方が好印象を持たれます)

 

この記事を参考にコミットを綺麗に保つ習慣を付けて頂けるとありがたいです。

最後まで読んでいただきありがとうございました。

COMMENT

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA