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

16
281

Gitでの開発で、こんな体験はありませんか?

  • 3つ前のコミットのメッセージにミスがあった。修正したい・・・
  • このコミットの順番入れ替えたいなぁ
  • このコミット、ホントは要らなかったから削除したいなぁ

…… 実はそれGitでできるんです!今回はGitクライアントソフトのSource Treeソース・ツリーでコミットログを修正する便利な機能「rebase interactiveリベース・インタラクティブ」を解説します。

コミットの再編集ができる機能とは?

Gitではコミットを再編集する機能を「git rebase interactive」といいます。たとえば、コミットの入れ替えや編集、統合、削除ができます。正確に説明すると、コミットそのものを編集するのではなく、新しくコミットのコピーを作成して1つずつコミットを組み立てる機能になります。

Git rebase interactiveとは?

Source Treeでコミットログを編集しよう

Source Treeでコミットログを操作する手順を解説します。編集を行いたい1つ手前のコミットを右クリックし[CommitAの子を対話形式でリベース‥]を選んでください。コミットログを操作するためのウィンドウ「Interactive rebase」が表示されます。

このウインドウを使えば、さまざまなコミットの再編集ができます。以下にて逆引きとしてまとめました。

GitRebase-編集ウィンドウ_マークアップ

基本動作を抑えよう

この「Interactive rebase」ウインドウにはさまざまなボタンがありますが、まずは基本操作として「OK・キャンセル・リセット」の3つを抑えましょう。

作業を終えたら右下の②[OK]ボタンをクリックすると、コミットログが確定されます。③[キャンセル]ボタンをクリックすると作業は破棄され元のツリービューに戻ります。元のツリービューへ戻らずサクッと元に戻す場合は①[リセット]ボタンをクリックします。編集ウィンドウ内の左下にあるので、よくわからなくなってしまった場合は焦らずにクリックをして戻しましょう。

コミットメッセージを書き換える方法

1つ前のコミットメッセージを編集することは、コマンドgit commit --amendでも可能ですが、今回のやり方だといくつ前でも編集が可能です。編集したいコミットを選択した状態で④[メッセージを編集]をクリックするとコミットメッセージの編集欄が表示され、編集後[OK]ボタンをクリックすると変更がコミットログ編集箇所に反映されます(※1)。

2つのコミットをまとめる方法

まとめたい2つのコミットの新しいコミットの方を選択し、⑤[過去を含めて squash する]をクリックします(※1)。

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

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

コミットを削除する方法

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

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

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

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

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

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

RebaseI-マーク付け

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

RebaseI-ヘッドの移動_マークアップ

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

RebaseI-コミットの上書き

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

次のコミットを編集する

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

RebaseI-リベースを続ける_マークアップ

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

RebaseI-Aのリベース後

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

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

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

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

編集前に元に戻す方法を知る

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

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

元に戻したくなった時に

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

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

おわりに

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

野原 のぞみ

インタラクティブデベロッパー。好きな生き物はハムスター、好きな食べ物は豚汁です。ツールは使うより作りたい派。

この担当の記事一覧