Gitでの開発で、こんな体験はありませんか?
- 3つ前のコミットのメッセージにミスがあった。修正したい・・・
- このコミットの順番入れ替えたいなぁ
- このコミット、ホントは要らなかったから削除したいなぁ
…… 実はそれGitでできるんです!今回はGitクライアントソフトのSource Treeでコミットログを修正する便利な機能「rebase interactive」を解説します。
コミットの再編集ができる機能とは?
Gitではコミットを再編集する機能を「git rebase interactive」といいます。たとえば、コミットの入れ替えや編集、統合、削除ができます。正確に説明すると、コミットそのものを編集するのではなく、新しくコミットのコピーを作成して1つずつコミットを組み立てる機能になります。
Source Treeでコミットログを編集しよう
Source Treeでコミットログを操作する手順を解説します。編集を行いたい1つ手前のコミットを右クリックし[CommitAの子を対話形式でリベース‥]を選んでください。コミットログを操作するためのウィンドウ「Interactive rebase」が表示されます。
このウインドウを使えば、さまざまなコミットの再編集ができます。以下にて逆引きとしてまとめました。
基本動作を抑えよう
この「Interactive rebase」ウインドウにはさまざまなボタンがありますが、まずは基本操作として「OK・キャンセル・リセット」の3つを抑えましょう。
作業を終えたら右下の②[OK]ボタンをクリックすると、コミットログが確定されます。③[キャンセル]ボタンをクリックすると作業は破棄され元のツリービューに戻ります。元のツリービューへ戻らずサクッと元に戻す場合は①[リセット]ボタンをクリックします。編集ウィンドウ内の左下にあるので、よくわからなくなってしまった場合は焦らずにクリックをして戻しましょう。
コミットメッセージを書き換える方法
1つ前のコミットメッセージを編集することは、コマンドgit commit --amend
でも可能ですが、今回のやり方だといくつ前でも編集が可能です。編集したいコミットを選択した状態で④[メッセージを編集]をクリックするとコミットメッセージの編集欄が表示され、編集後[OK]ボタンをクリックすると変更がコミットログ編集箇所に反映されます(※1)。
2つのコミットをまとめる方法
まとめたい2つのコミットの新しいコミットの方を選択し、⑤[過去を含めて squash する]をクリックします(※1)。
コミットの順番を変更する方法
移動させたいコミットを選択した状態で、⑦[▲][▼]ボタンをクリックします。同ファイルの同位置を修正したコミットを前後させるとコンフリクトが起きる可能性があるので注意しましょう(コンフリクトが発生した場合エラーが発生し元に戻ってしまいます)。
コミットを削除する方法
削除させたいコミットを選択した状態で⑥[削除]ボタンをクリックします。削除したコミットは打ち消し線が入ります。戻したくなった場合は削除と同じ位置に配置される[リストア]ボタンをクリックします。
コミット内容を書き換える方法
⑧[コミットを修正しますか ?]の列にチェックマークを入れるとコミット内容を編集することが可能になります。詳しくは解説画像をまじえて後述します。
コミット内容を書き換える方法
チェックマークを入れたコミットの上書きする
「Interactive rebase」ウィンドウで[コミットを修正しますか ?]の列にチェックマークを入れたあと、[OK]ボタンをクリックします。
とくに何事も無く通常のログツリーに戻りますが、HEAD
が今までのブランチから離れチェックマークを入れた一番古いコミットに移動してます。
チェックを入れたコミットに対して変更をかけるために最後のコミットを上書きします。ソースを変更したあと[コミット]→[コミットオプション]→[直前のコミットを上書き]を選択します。
[コミット]ボタンをクリックしコミットを確定させると、今までのブランチから枝分かれが始まります。
次のコミットを編集する
メニューの[操作]→[リベースを続行]を選びます。
すると、次のチェックマークを入れた箇所までHEADが進みます。
チェックマークを入れた回数分だけ、[コミットの上書き]と[リベースを続行]を繰り返し作業します。HEADの表示が無くなり現在のブランチが編集していたブランチに移動が完了していたら、インタラクティブなリベースが完了となります。リベースを途中でキャンセルしたくなったらメニューの[操作]→[リベースを中止]を選びもとに戻すことは可能ですが、リベースが完了するとメニューは選べなくなります。
なお、共有のリポジトリで作業している場合は絶対にプッシュしたコミットを編集してはいけません。SourceTreeだと強制的なプッシュ(コマンドラインだとpush -f
)はできませんし、もしも別の人がプルしていた場合にコミットログが壊れる可能性があります。
バックアップを作って安全にコミットログを再編集しよう
コミットログを編集し作業を確定してしまった後は、SourceTree上では(※1)もとに戻すことが困難なため、なれないうちは編集を行う前にコミットの保管用にブランチを切っておくのをオススメします。念の為にバックアップ用のブランチを作成し、もとに戻す手段を説明します。
バックアップ用のブランチを作成する
まずはバックアップ用のブランチを作成します。メニューから[ブランチ]を選び、新規ブランチとして「backup」という名前を付けておきましょう。作成したあとは再度元のブランチをダブルクリックして元のブランチへチェックアウトします。
元に戻したくなった時に
作業を終えて確定した後に元へ戻したくなったら、コミットログ上の「backupブランチ」を選択し、右クリックしメニューを表示させます。メニューから[現在のブランチをこのコミットまでリセット]→使うモード:[Hard - すべての作業コピーの変更内容を破棄]を選択すると無事にもとのコミットに戻ります。不要になった「backupブランチ」は後ほど左メニューのブランチ一覧から右クリックで選択し「backupを削除」から削除します。
※1 コマンドラインでの作業に抵抗がない方は上記のようにブランチを作成せずともコマンドgit reflog
で過去の操作を確認し、合わせてコマンドgit reset
で戻すことができるので覚えておくと便利です。
おわりに
コミットログを編集することで一連の開発の流れを整頓でき、理解しやすいコミットログを残せます。こういったGitの便利機能は、小さい粒度でコミットをすることで本文を発揮できます。みなさんも是非美しいコミットログを残してくださいね!