Git操作メモ(1. 取り消し系)

Gitの取り消し系の操作

コミットとかステージングをやり直したい時の操作について書いていきます。

ファイルの変更の取り消し

$ git checkout <ファイルまたはディレクトリ>

これで一応ファイルの変更の取り消せるんですが、より正確にはこういうことをやっているらしい。

指定したファイルについて、インデックスが指しているブロブ をオブジェクト格納領域から取り出し、ワーキングディレクトリのファイルを置き変える。

git checkoutを図解する | To Be Decided

たとえば以下のような操作を行なったとしましょう。

コミット(1) -> hoge.txt編集(2) -> hoge.txtをステージング(3) -> hoge.txt編集(4)

この場合、(4)を行なった後にgit checkout hoge.txtを実行すると、hoge.txtの内容は(2)の時のものになります。ファイルの内容を(4)から(1)に戻すのは、後述「ステージングの取り消し」に記載した方法で(3)のステージングを取り消せばできます。

ちなみにgit checkoutで新規に作成したファイルが削除されることはありません。

参考: git checkoutを図解する | To Be Decided

ステージングの取り消し

$ git reset HEAD <file or directory>

または

$ git reset <file or directory>

git resetコマンドはステージングを取り消すっていうか、HEADやstageやworking directoryの状態を前に戻すコマンドです。オプションを特につけないで実行した場合、HEADとstageの状態はリセットされ、working directoryで行なった変更はリセットされません。

HEADのみ状態を前に戻したい場合は--softのオプションをつけます。HEAD、stage、working directoryの状態を前に戻したい場合は--hardのオプションをつけます。

たとえばこれら3つの状態を、あるコミットの状態にまで戻したい場合こんなコマンドを実行します。

git reset --hard <commit>

これは実質「ステージングの取り消し」と「ファイルの変更の取り消し」を行なっています。

参考: git-resetは結局何を戻すのか

Untracked filesの削除

$ git clean -f

追跡していないファイルは全て削除されます。追跡してないディレクトリも削除する場合は以下のコマンド。

$ git clean -df

これらを実行する前に-nオプションをつけてドライランを行なっておくといいですね。

参考: git Untracked files(未追跡ファイル)を1発で消し去る

コミットの取り消し

git reset 使います。

  • ステージングを取り消したい時: git reset <path>
  • コミットを取り消したい時: git reset <commit>

って覚えとくといいんじゃないかなぁと思います。

「今まで行なったファイルの変更とかステージングもなかったことにしてやるぜ!」って場合は

$ git reset --hard HEAD^

「今まで行なったファイルの変更やステージングはなかったことにしたくないけど、さっきのコミットは取り消したいなぁ」って場合は

$ git reset --soft HEAD^

pushの取り消し

ローカルとリモートのリポジトリで最新のコミットを取り消したい場合

$ git reset HEAD^
$ git push -f origin <branch>

ローカルでは取り消さず、リモートのみ最新のコミットを取り消したい場合

$ git push -f origin HEAD^:<branch>

その他の取り消し系操作

Gitでやらかした時に使える19個の奥義に色々書いてあります。

Tips

git resetのmode

Soft、Mixed、Hardがあります。git resetでどのmodeを指定するかによって、リセットされる対象が変化します。

  • Soft: HEAD
  • Mixed: HEAD、stage
  • Hard: HEAD、stage、working directory

@

HEADのエイリアス。コマンド実行する時HEADって書くのが面倒臭かったら代わりに@が使えるよぅ!(=゚ω゚)ノ