はじめに
Gitでいろいろやらかしそうな僕のために、ワーキングツリー・ステージ(インデックス)・ローカルリポジトリ(コミット)ごとの取り消し方法をまとめます。
ワーキングツリーの変更取り消し
# 特定のファイル・ディレクトリの変更を取り消し
$ git checkout -- <ファイル名 or ディレクトリ名>
# カレントディレクトリ配下の全ての変更を取り消し
$ git checkout -- .
最新のステージ(インデックス)をワーキングツリーに反映することで、ファイル等への変更を取り消している。
--
を付けるのは、git checkout <ブランチ名>
によるブランチの切り替えと区別するため。ブランチ名とファイル名・ディレクトリ名が被っていなければ--
は不要。
なお、2019年8月のGitのアップデートでversion 2.23.0がリリースされ、git restore
コマンドが追加されたため、このコマンドでワーキングツリーおよびステージ(インデックス)の変更取り消しができるようになりました。
# 特定のファイル・ディレクトリの変更を取り消し
$ git restore <ファイル名 or ディレクトリ名>
# カレントディレクトリ配下の全ての変更を取り消し
$ git restore .
ちなみに、git restore
と同時に追加されたgit switch
でブランチの切り替え等ができるようになりました。
ステージ(インデックス)の取り消し
# 特定のファイル・ディレクトリのステージングを取り消し
$ git reset HEAD <ファイル名 or ディレクトリ名>
# カレントディレクトリ配下の全てのステージングを取り消し
$ git reset HEAD .
最新のコミットをステージ(インデックス)に反映することで、ファイル等のステージングを取り消している。
上でも書いた通り、git restore --staged
でも取り消し可能。
# 特定のファイル・ディレクトリのステージングを取り消し
$ git restore --staged <ファイル名 or ディレクトリ名>
# カレントディレクトリ配下の全てのステージングを取り消し
$ git restore --staged .
ローカルリポジトリ(コミット)の取り消し
先ほども出てきたgit reset
コマンドでコミットの取り消しを行うこともできます。
--mixed(デフォルト)
, --hard
, --soft
の各オプションでコミットを取り消す際の挙動を変更可能。
# 直前のコミットまで遡る
$ git reset HEAD^
また、こちらは取り消しというより修正ですが、間違った内容をコミットしてしまった後に、正しい内容に修正し、git add
してから実行することで、直前のコミットを修正できます。
git add
をせずに、これだけ実行することで、コミットメッセージだけ修正することも可能。
# 直前のコミットを修正
$ git commit --amend -m "コミットメッセージ"
そして、git revert
を使うことで、他のコミットで行われた変更を元に戻す新しいコミットを作成できます。「間違った内容をコミットしちゃったけど、そのコミットを打ち消したよっ」という新しいコミットを行うコマンドです。
# コミットを取り消して、元に戻したよ、というコミットを作成
$ git revert <取り消したいコミットID>
まとめ
似たようなスペルのコマンドがいくつもあって、僕のような初心者にはGitはとっつきにくいですね...
公式ドキュメントの「Reset, restore and revert」のところを読むと、
git restore
とgit reset
の一番大きな違いは、
前者はブランチを更新しないが、後者はブランチを更新すること、と言えそうです。
あとで、git rebase
も追記したいです。