【Sourcetree】コミットを一つにまとめる
はじめに
こまめにコミットしたけど、一つのコミットで変更点や履歴をまとめたい場合はどうすればいいでしょうか?
今回は複数のコミットを一つのコミットにまとめてみたいと思います。
環境
この記事はSourcetree3.4.6での確認内容となります。
Sourcetree3.4.6は以下の場所から取得できます。
www.sourcetreeapp.com
どのようにすればコミットを一つにまとめられるか?
GitのSquash機能を使うことで解決します。
Sourcetreeを使いながら対処していきましょう。
[対処1]ローカルリポジトリのみのコミットをまとめる
Sourcetreeで以下のように「変更1」、「変更2」、「変更3」のコミットをローカルリポジトリだけ行っているとします。
これらのコミットを一つにまとめたい場合を例として説明していきます。
まずは、まとめたいコミットのうち、一番古いコミットの手前のコミットを選択します。
この例だと「commit3」のコミットが該当します。
選択したら右クリックで、「~の子とインタラクティブなリベースを行う」を選択しましょう。
すると以下のような画面が表示されると思います。
一番上に表示されている「変更3」のコミットを選択し、「前のコミットとスカッシュ」を選択しましょう。
これで「変更3」と「変更2」が一つにまとまりました(まだ確定ではありませんが)
さらにこの状態で「前のコミットとスカッシュ」を選択します。
これですべてのコミットが一つにまとまりました(まだ確定ではありませんが)
「メッセージを編集」ボタンを押してみましょう。
この画面の内容が一つにまとまった後のコミットでの変更履歴となります。
変更したい場合はここで内容を変更して「OK」ボタンを押します。
※今回は「編集」と内容変えることとします。
画面戻るとMessageの所が変わっていることがわかりますね。
この後「OK」ボタンを押すとコミットは一つにまとめられます(もう後戻りできませんのでご注意下さい)
※「キャンセル」ボタンを押すことでやめることも可能です。
これでコミットを一つにまとめることができました^^
もし、ツリーの表示に変化がないときはキーボードの「F5」ボタンを押すか、メニューの「表示」 - 「更新」を押すと画面更新されるはずです。
[対処2]リモートリポジトリにPush済みのコミットをまとめる
ではリモートリポジトリにすでにPushしてしまっているコミットをまとめることは可能でしょうか?
答えは、可能ですが非推奨です。
リモートリポジトリは整合性を取れなくなる可能性があるので、以下の場合だけ対処するようにしましょう。
※該当しない場合はリモートリポジトリに関してはコミットを一つにまとめるという対処をしないことをおススメします。
では実際にリモートリポジトリでの対処をしていきましょう。
Sourcetreeで以下のようにリモートリポジトリに「変更1」、「変更2」、「変更3」、「変更4」がコミット済み、Push済みであるとします。
今回は「変更1」、「変更2」、「変更3」だけ一つのコミットのまとめてみたいと思います(変更4はまとめない)
ローカルリポジトリの時と同じです。
右クリックで、「~の子とインタラクティブなリベースを行う」を選択しましょう。
「変更3」を選択して「前のコミットとスカッシュ」ボタンを押しましょう。
続いて「前のコミットとスカッシュ」ボタンを押します。
今回もメッセージを「編集」と変更して「OK」ボタンを押しましょう。
メイン画面に戻るとこのように表示されていると思います。
この状態でPushするとどうなるでしょうか?
「failed to push some refs to~」というエラーでPushできないですね。
ターミナル画面を開いて直接gitコマンドを入力しましょう。
以下のコマンドを入力して、強制的にローカルリポジトリのブランチの内容をリモートリポジトリにPushさせます。
git push --force origin master
メイン画面に戻って画面更新すると、このように表示されコミットを一つにまとめることができましたね。