1
0

More than 1 year has passed since last update.

Git 個人的取り消しチートシート

Posted at

はじめに

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 restoregit resetの一番大きな違いは、
前者はブランチを更新しないが、後者はブランチを更新すること、と言えそうです。

あとで、git rebaseも追記したいです。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0