「やり直し系コマンド」は私の造語です。gitの操作は常にやり直せます。
「打ち消す」、「リセットする」、「削除する」、「クリーンする」など、「やり直す」ためのgitのコマンドやオプションを紹介します。
本投稿では一つ一つのコマンドやオプションの詳細には踏み込みません。
git rebase --abort
(リベースの破棄) を説明するためには、リベースとは何ぞやから説明しなければならないため説明の一部を端折ります。
「変更を破棄する」という日本語化されたGUIメニューが表示されたときに、以下のいずれのgitコマンドが実行されるか確信が持てないのであれば、怖くてボタンを選択できません。 「日本語化したgitアプリは怖いですよ!」、「GUIのgitアプリは便利なようでクセがありますよ!」ということを啓蒙するためのポエムです。
1. revert (打ち消す)
1.1. 最後のコミットを打ち消すコミットを追加する
$ git revert HEAD
HEAD(≒カレントブランチの末端)のコミットを打ち消すコミットを追加する。
1.2. 特定のコミットを打ち消すコミットを追加する
$ git revert 286dc77
コミット 286dc77 を打ち消すコミットを追加する。
※ いつ、誰が、どういう変更をした&変更を打ち消した(revertした)かキチンと変更履歴に残る行儀の良い方法です。
2. reset (リセットする)
2.1. ひとつ前のコミットにコミットだけをリセットする
$ git reset HEAD^
最後のコミット(HEAD)をなかったことにする。
ステージングとワークはコマンド実行前後で変化しません。コミットをなかったことにするだけで修正途中のファイルは手元に残ります。
2.2. ひとつ前のコミットに全てをリセットする
$ git reset --hard HEAD^
最後のコミット(HEAD)をなかったことにする。
ステージングとワークもリセットします。前々回のコミット以降の変更が一切合切(=ステージングからもワークからも)消えてなくなります。
2.3. resetの注意点
resetコマンドを使うと「コミットをなかったこと」にできます。しかしリモートサーバーにpushしたあと(変更履歴をメンバーと共有した後)に「なかったこと」にすると、同じリポジトリを共有している他のメンバーの新たな変更もなかったことになります。「なかったこと」にされたメンバーに謝罪して歩く気がないのであれば、push後のresetや force push は控えましょう。
3. restore (復元する)
3.1. ワークを復元する
$ git restore hello.c
ワークに対する変更を破棄して、ステージングからワークへhello.cを復元する。
3.2. ステージングを復元する
$ git restore --staged hello.c
ステージングに対する変更を破棄して、コミットからステージングへhello.cを復元する。
git add hello.c
や git rm hello.c
などステージングに対する操作を破棄する。
4. rm (削除する)
4.1. 追跡対象から削除する
$ git rm hello.c
ファイル "hello.c" を追跡対象(=今後のバージョン管理の対象)から外す。ファイルエクスプローラーでhello.cを削除しただけでは最新コミットの中にhello.cが残り続ける。ゆえに rm コマンドで追跡対象から外すことができる。
5. abort (中止する)
5.1. コンフリクトが発生したマージを取り止める
$ git merge --abort
5.2. コンフリクトが発生したリベースを取り止める
$ git rebase --abort
6. clean (掃除する)
6.1. カレントフォルダーの未追跡のファイルをワークから削除する
$ git clean -f .
たとえば *.bak などの一時ファイルをカレントフォルダから一気に削除するときに使う。
7. amend (修正する)
7.1. 直前のコミットを修正する
$ git commit --amend
直前のコミットをなかったことにして、新しいコミットを作る一連の流れを1コマンドで実行する。
- コミットとステージングに差異が生じていなければ、コミットコメントを修正するだけ。ちなみにコメントを変更するだけではあるが、新しいコミットはハッシュ(SHA-1)値が異なる似て非なるコミットである。
-
git add
やgit rm
により、コミットとステージングに差異が生じていれば、新しいコミットは全く異なるコミットである。
8. prune (切り払う)
8.1. リモートリポジトリに存在しないリモート追跡ブランチを削除する
$ git fetch --prune
8.2. ワークツリー情報を削除する
$ git worktree prune
9. drop (落とす)
9.1. 最新のstashを削除する
$ git drop stash
ワークからstash(退避)した内容をワークに戻さずに破棄する。