SourceTreeで複数のコミットをsquashして強制プッシュする方法
背景
普段、私はコミットを行う際に、あまり粒度を意識せず、自分のタイミングでどんどんコミットしておりましたが、
コードのレビューを行うプロジェクトに配属された際、コミットをスカッシュ(複数のコミットを1つにまとめる)すると無駄なコミットを減らせるよ、と助言を頂きコミットの粒度を意識するようになりました。
そこで今回は、SourceTreeでコミットをsquash(まとめる)する方法と、その後に必要となる強制プッシュ(force push)を行う手順について備忘録を兼ねてまとめます。
squashの方法(コミットをまとめる)
SourceTreeを使って複数のコミットを1つにまとめるには、対話的リベース(Interactive Rebase) を使います。以下の手順で操作できます。
-
ログ画面を開く
対象のブランチで、画面上部の「ログ」タブを開きます。 -
squashしたいコミットの範囲を確認
「このコミットから上をまとめたい」という1つ前のコミットを右クリックして、
「このコミットまで対話的にリベース」
を選択します。 -
リベース画面で操作
リベース画面が表示されるので、まとめたいコミットをsquash
に変更します。
pick
→squash
に変更することで、前のコミットにまとめられます。 -
コミットメッセージを調整
複数のコミットメッセージが1つに統合されるので、適切に編集してOK
を押しましょう。
これでコミットが1つにまとまりました!
強制プッシュの方法(squash後のプッシュ)
リベースを行うと、Gitの履歴が書き換わるため、通常のプッシュでは拒否されてしまいます。そのため、強制プッシュ(force push) が必要です。
ただし、SourceTreeでは 言語設定が日本語 の場合、強制プッシュの設定項目が表示されない という罠があります。
以下に、言語設定を英語に変更する方法と、強制プッシュを有効化する手順を記載します。
① SourceTreeの言語設定を英語に変更する
- 設定の一般のPreferred languageをEnglishに変更
- SourceTreeを再起動
② 強制プッシュの設定を有効にする
- メニューバーの「SourceTree」 → 「Preferences」 → 「Git」タブを開く
- 「Allow force push(強制プッシュを許可)」にチェックを入れる
③ 実際に強制プッシュを行う
- 対象のブランチを選択
- 「プッシュ」ボタンをクリック
- 「Force push」にチェックを入れて実行
注意点(squash・強制プッシュ前に確認すべきこと)
強制プッシュやsquashは便利な反面、チーム開発においては注意すべき点があります。
-
developブランチなどの共通ブランチに対して強制プッシュを行わないこと
→ 他の人の履歴を壊す可能性があります -
既にリモートにpush済みのコミットをsquashしないこと(特に他の人と共有している場合)
→ 履歴の不整合からコンフリクトが発生する可能性があります -
レビューが必要なプロジェクトでは、commitの粒度にも気を配ること
→ squashを前提とせず、レビューしやすい単位でコミットを意識しましょう
おわりに
GUIベースのGitクライアントであるSourceTreeでも、CLIを使わずにsquashやforce pushを実現できます。
特に、細かくコミットしすぎたときの履歴の整理にsquashは非常に便利ですが、使いどころを見極めて慎重に使うことが大切です。