高機能Gitクライアントの「SourceTree」(無料)や「Tower」(有償)は導入しやすく機能が豊富なため人気があります。Gitにはコミットやプッシュだけではなくさまざまな機能が存在するので、使いこなすことで効率よく開発を進めていけるでしょう。本記事ではGitを使う上で必須となるcommitの取り消し方法をテーマに、次の4つの機能を解説します。
- コミットの修正・やり直し(amend)
- コミットの取り消し(reset)
- コミットの打ち消し(revert)
- 別ブランチからのコミットの取り込み(cherry-pick)
本記事では次の機能をSourceTreeとTowerの両方のソフトウェアの操作方法として解説します。
コミットの修正・やり直し
コミット後に「コミット漏れのファイルがあった・・」「コメントを間違えたので修正したい」など困ったことはありませんか?リモートリポジトリにPUSHする前であれば、git commit --amend
コマンドを使うことで解決できます。
git commit --amend
SourceTreeの操作方法
[作業コピー]画面にある[コミット オプション]から[直前のコミットを上書き]にチェックを入れることで、コミットの修正ができます。チェックを入れると直前コミットのコメントが表示され、コメントの修正やファイルの追加ができるようになり「コミット」ボタンを押すことで修正が反映されます。
Towerの操作方法
[WorkingCopy]画面にある[Amend]というチェックボックスにチェックを入れることで、コミットの修正ができます。チェックを入れると直前コミットのコメントが表示され、コメントの修正やファイルの追加ができるようになり[Amend]ボタンを押すことで修正が反映されます。
コメントはそのままでファイルの追加だけをしたいという方は[WorkingCopy]画面で[Alt]ボタンを押すと[Commit]ボタンが[Amend]ボタンに切り替わるので、このままファイルを選択し[Amend]ボタンを押すことでファイルの追加が簡単にできます。
コミットの取り消し
Gitにはコミットを取り消す仕組みが用意されています。リモートリポジトリにPUSHする前であれば簡単な操作で取り消せます。コミット後に「やっぱりまだコミットはしたくない」「間違ったブランチにコミットしてしまった・・」などの場合はgit reset
コマンドを使いましょう。リモートリポジトリにPUSHしてしまった場合は、コミット履歴は残ってしまいますが、次項の「コミットの打ち消し」を使って元に戻す事ができます。
git reset (--soft | --mixed | --hard)
「git reset」コマンドには3つのオプションがあり、用途に合わせて選ぶことができます。
- soft
選択したコミットまで戻し、すべての変更をインデックスに保持したままにします。細かいコミットをまとめたり、整理したい時などに便利です。 - mixed
選択したコミットまで戻し、インデックスはリセットされ、すべての変更はワーキングツリーに保持した状態になります。デフォルト(オプション指定なし時)のオプションになります。 - hard
選択したコミットまで戻し、すべての変更を破棄します。誤ったコミットを取り消したい時などに便利です。
※実際に作業しているフォルダーを「ワーキングツリー」といい、修正したファイルをコミットする前の状態を保持している領域(コミットするためにツール上でファイルを選択した状態)を「インデックス」といいます。
SourceTreeの操作方法
コミット履歴の一覧からもとに戻りたい位置のコミットを右クリックし[ XXXXX をこのコミットまで戻す]を選択します。すると、「soft」「mixed」「hard」の3つのオプションを選ぶ画面が出てくるので、実行したいモードを選択して実行してください。
Towerの操作方法
コミット履歴の一覧からもとに戻りたい位置のコミットを右クリックし[Reset HEAD to “XXXXXXXX”]を選択します。すると、「Keep Changes」するかどうかのチェックボックスが表示されますので、「mixed」オプションで実行したい場合はチェックを入れたまま、「hard」オプションで実行したい場合はチェックを外して実行してください。
コミットの打ち消し
コミット取り消したいがリモートリポジトリにPUSHしてしまったという方はgit revert
コマンドを利用することで、特定のコミットの変更を元に戻す事ができます。ただし、git reset
コマンドと違い、もとに戻す(なかった事にする)訳ではなく、打ち消す(修正を元に戻すコミットを行う)コマンドになります。そのため、リモートリポジトリにPUSHしてしまった後でも、修正をもとに戻すことが可能となります。
git revert
SourceTreeの操作方法
コミット履歴の一覧から元に戻したいコミットを右クリックし[コミット適用前に戻す…]を選択すると、選択したコミットを打ち消す内容がコミットされます。問題がなければPUSHすることでリモートリポジトリに反映できます。
Towerの操作方法
コミット履歴の一覧から元に戻したいコミットを右クリックし[Revert “XXXXXXXX”]を選択すると、選択したコミットを打ち消す内容がコミットされます。問題がなければPUSHすることでリモートリポジトリに反映できます。
チェリーピック(コミットの取り込み)
チェリーピックとは英語で「いいとこ取り」「つまみ食い」という意味がある通り、別ブランチの特定のコミット内容だけを現在のブランチに取り込む機能です。コミット単位で取り込む事ができるため、別ブランチに同じ修正を反映させたいときに便利な機能です。
git cherry-pick(-rn)
SourceTreeの操作方法
コミット履歴の一覧から元に戻したいコミットを右クリックし[チェリーピック]を選択します。SourceTreeでは直接コミットするかのオプションは選べないため、コミットして問題ないかのダイアログが表示されますので、問題なければ実行ください。
Towerの操作方法
コミット履歴の一覧から元に戻したいコミットを右クリックし[Cherry-Pick “XXXXXXXX”]を選択します。チェリーピックした内容をコミットするかのダイアログが表示されるので、直接コミットしたくない場合はチェックボックスにチェックを入れて(-rn
オプション)実行します。
おわりに
頻繁に使う操作ではありませんが、これらの操作を覚えておくことで、スムーズに対応できるようになります。また、活用することでムダなコミットが減り、開発効率の向上にもつながります。
他にも便利な機能は色々ありますので、興味のある方は記事「SourceTree入門 - 基本操作(diff, stash, tag, revert, cherry-pick)」もあわせてご覧ください。
※本記事は、SourceTree 3とTower 8.0を使って作成しています。