Web Analytics

こつこつエンジニア

現役アプリ開発者によるIT系特化ブログ

【Sourcetree】コミットを一つにまとめる

f:id:madai21:20211020004710j:plain

はじめに

こまめにコミットしたけど、一つのコミットで変更点や履歴をまとめたい場合はどうすればいいでしょうか?
今回は複数のコミットを一つのコミットにまとめてみたいと思います。

環境

この記事はSourcetree3.4.6での確認内容となります。
Sourcetree3.4.6は以下の場所から取得できます。
www.sourcetreeapp.com

どのようにすればコミットを一つにまとめられるか?

GitのSquash機能を使うことで解決します。
Sourcetreeを使いながら対処していきましょう。

[対処1]ローカルリポジトリのみのコミットをまとめる

Sourcetreeで以下のように「変更1」、「変更2」、「変更3」のコミットをローカルリポジトリだけ行っているとします。
これらのコミットを一つにまとめたい場合を例として説明していきます。
f:id:madai21:20211019233335p:plain


まずは、まとめたいコミットのうち、一番古いコミットの手前のコミットを選択します。
この例だと「commit3」のコミットが該当します。
選択したら右クリックで、「~の子とインタラクティブなリベースを行う」を選択しましょう。
f:id:madai21:20211019233620p:plain


すると以下のような画面が表示されると思います。
一番上に表示されている「変更3」のコミットを選択し、「前のコミットとスカッシュ」を選択しましょう。
f:id:madai21:20211019233901p:plain


これで「変更3」と「変更2」が一つにまとまりました(まだ確定ではありませんが)
さらにこの状態で「前のコミットとスカッシュ」を選択します。
f:id:madai21:20211019234044p:plain


これですべてのコミットが一つにまとまりました(まだ確定ではありませんが)
「メッセージを編集」ボタンを押してみましょう。
f:id:madai21:20211019234151p:plain


この画面の内容が一つにまとまった後のコミットでの変更履歴となります。
変更したい場合はここで内容を変更して「OK」ボタンを押します。
※今回は「編集」と内容変えることとします。
f:id:madai21:20211019234241p:plain


画面戻るとMessageの所が変わっていることがわかりますね。
この後「OK」ボタンを押すとコミットは一つにまとめられます(もう後戻りできませんのでご注意下さい)
※「キャンセル」ボタンを押すことでやめることも可能です。
f:id:madai21:20211019234416p:plain


これでコミットを一つにまとめることができました^^
f:id:madai21:20211019234633p:plain


もし、ツリーの表示に変化がないときはキーボードの「F5」ボタンを押すか、メニューの「表示」 - 「更新」を押すと画面更新されるはずです。
f:id:madai21:20211019234846p:plain

[対処2]リモートリポジトリにPush済みのコミットをまとめる

ではリモートリポジトリにすでにPushしてしまっているコミットをまとめることは可能でしょうか?
答えは、可能ですが非推奨です。
リモートリポジトリは整合性を取れなくなる可能性があるので、以下の場合だけ対処するようにしましょう。
※該当しない場合はリモートリポジトリに関してはコミットを一つにまとめるという対処をしないことをおススメします。


  • 1人だけで使っている

  • 他の人も使うが、この対処を全員が納得している(もしくは対処後に全員にもう一度クローンし直してもらえる)


  • では実際にリモートリポジトリでの対処をしていきましょう。
    Sourcetreeで以下のようにリモートリポジトリに「変更1」、「変更2」、「変更3」、「変更4」がコミット済み、Push済みであるとします。
    今回は「変更1」、「変更2」、「変更3」だけ一つのコミットのまとめてみたいと思います(変更4はまとめない)
    f:id:madai21:20211020001823p:plain


    ローカルリポジトリの時と同じです。
    右クリックで、「~の子とインタラクティブなリベースを行う」を選択しましょう。
    f:id:madai21:20211020002115p:plain


    「変更3」を選択して「前のコミットとスカッシュ」ボタンを押しましょう。
    f:id:madai21:20211020002154p:plain


    続いて「前のコミットとスカッシュ」ボタンを押します。
    f:id:madai21:20211020002306p:plain

    今回もメッセージを「編集」と変更して「OK」ボタンを押しましょう。
    f:id:madai21:20211020002339p:plain


    メイン画面に戻るとこのように表示されていると思います。
    この状態でPushするとどうなるでしょうか?
    f:id:madai21:20211020002524p:plain


    「failed to push some refs to~」というエラーでPushできないですね。
    f:id:madai21:20211020002625p:plain


    ターミナル画面を開いて直接gitコマンドを入力しましょう。
    f:id:madai21:20211020002808p:plain


    以下のコマンドを入力して、強制的にローカルリポジトリのブランチの内容をリモートリポジトリにPushさせます。

    git push --force origin master


    メイン画面に戻って画面更新すると、このように表示されコミットを一つにまとめることができましたね。
    f:id:madai21:20211020002905p:plain

    おわりに

    Squash機能を使うことで、気兼ねなく日々の作業終わりにコミットして、ある程度修正がまとまった時点で一つのコミットにしてからPushするという事ができますね^^
    リモートリポジトリでの対処も書きましたが基本的にはローカルリポジトリのみのコミットでだけ使った方が安全です。
    Pushしてしまった場合は潔くあきらめましょうw
    コミットが煩雑より、gitをおかしくしてしまう方が迷惑かかるので・・・^^;