SourceTreeの使い方 | コミットの再編集・変更方法

16
277

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つのコミットの新しいコミットの方を選択し、⑤[前のコミットとスカッシュ]をクリックします(※1)。

コミットの順番を変更する方法

移動させたいコミットを選択した状態で、⑦[↑][↓]ボタンをクリックします。同ファイルの同位置を修正したコミットを前後させるとコンフリクトが起きる可能性があるので注意しましょう(コンフリクトが発生した場合エラーが発生し元に戻ってしまいます)。

コミットを削除する方法

削除させたいコミットを選択した状態で⑥[削除]ボタンをクリックします。削除したコミットは打ち消し線が入ります。戻したくなった場合は削除と同じ位置に配置される[リストア]ボタンをクリックします。

コミット内容を書き換える方法

⑧[Ammend Commit ?]の列にチェックマークを入れるとコミット内容を編集することが可能になります。詳しくは解説画像をまじえて後述します。

※1 執筆時点のWindows版(バージョン 1.6.22)だとコミットメッセージに日本語が混ざっていると文字化けをしました(macOSでは大丈夫でした)

コミット内容を書き換える方法

チェックマークを入れたコミットの上書きする

「Interactive rebase」ウィンドウで[Ammend Commit ?]の列にチェックマークを入れたあと、[OK]ボタンをクリックします。

とくに何事も無く通常のログツリーに戻りますが、HEADが今までのブランチから離れチェックマークを入れた一番古いコミットに移動してます。

チェックを入れたコミットに対して変更をかけるために最後のコミットを上書きします。ソースを変更したあと[コミット]→[オプションのコミット]→[最後のコミットを上書き(Amend)]を選択します。

[コミット]ボタンをクリックしコミットを確定させると、今までのブランチから枝分かれが始まります。

次のコミットを編集する

メニューの[操作]→[リベースを続ける]を選びます。

すると、次のチェックマークを入れた箇所までHEADが進みます。

チェックマークを入れた回数分だけ、[コミットの上書き]と[リベースを続ける]を繰り返し作業します。HEADの表示が無くなり現在のブランチが編集していたブランチに移動が完了していたら、インタラクティブなリベースが完了となります。リベースを途中でキャンセルしたくなったらメニューの[操作]→[リベースを停止]を選びもとに戻すことは可能ですが、リベースが完了するとメニューは選べなくなります。

なお、共有のリポジトリで作業している場合は絶対にプッシュしたコミットを編集してはいけません。SourceTreeだと強制的なプッシュ(コマンドラインだとpush -f)はできませんし、もしも別の人がプルしていた場合にコミットログが壊れる可能性があります。

バックアップを作って安全にコミットログを再編集しよう

コミットログを編集し作業を確定してしまった後は、SourceTree上では(※1)もとに戻すことが困難なため、なれないうちは編集を行う前にコミットの保管用にブランチを切っておくのをオススメします。念の為にバックアップ用のブランチを作成し、もとに戻す手段を説明します。

バックアップ用のブランチを作成する

まずはバックアップ用のブランチを作成します。メニューから[ブランチ]を選び、新規ブランチとして「backup」という名前を付けておきましょう。作成したあとは再度元のブランチをダブルクリックして元のブランチへチェックアウトします。

元に戻したくなった時に

作業を終えて確定した後に元へ戻したくなったら、コミットログ上の「backupブランチ」を選択し、右クリックしメニューを表示させます。メニューから[現在のブランチをこのコミットまでリセット]→使うモード:[Hard - すべての作業コピーの変更を破棄する]を選択すると無事にもとのコミットに戻ります。不要になった「backupブランチ」は後ほど左メニューのブランチ一覧から右クリックで選択し「backupを削除する」から削除します。

※1 コマンドラインでの作業に抵抗がない方は上記のようにブランチを作成せずともコマンドgit reflogで過去の操作を確認し、合わせてコマンドgit resetで戻すことができるので覚えておくと便利です。

おわりに

コミットログを編集することで一連の開発の流れを整頓でき、理解しやすいコミットログを残せます。こういったGitの便利機能は、小さい粒度でコミットをすることで本文を発揮できます。みなさんも是非美しいコミットログを残してくださいね!

※この記事が公開されたのは4年9ヶ月前ですが、 平成29年1月20日に内容をメンテナンスしています。