Wivern Blog

Personal-Tech memorandum

Git取り消す時によく使うコマンド

コミットのバージョンを戻したりステージングしたものを編集内容ごと取り消したりと 色々戻す方法があるが、戻す時によく忘れるのでメモ。

addする前の編集内容を取り消す

git checkout ファイル名またはgit checkout . git checkout .は変更内容を全部ないことにしてくれるが、新規追加したファイルに 関しては削除されない点に注意!

1
2
3
$ git checkout [file_name]

$ git checkout .

完全に元に戻したい場合は別途削除する必要がある

1
$ rm -rf `git status --short | grep '??' | awk '{print $2}'`

ステージングを取り消す

ステージングを取り下げる。編集内容は残る
ファイル名を指定しないと全てのステージングが取り下げられる。

1
$ git reset [file_name]

ステージしたファイルを最後にコミットした状態に戻す(編集内容は残らない)

1
$ git checkout HEAD -- [file_name]

編集・ステージングいずれの変更内容を取り消し、最後にコミットした状態に戻す

1
$ git reset --hard HEAD

checkoutresetの違いを説明をざっくりとだけ説明すると、 大きく分けて違いは二つ

  • 作業ディレクトリの未保存の有無をチェック
    checkout:ある。うまくやれば未変更のファイルを全て更新してくれる
    reset --hard:ない。容赦無く上書きされる

  • HEADの移動の仕方
    checkout:HEADそのものが移動。HEADが付いていたブランチに変化はない
    reset:HEADの示すブランチの方が移動

コミットのバージョンを戻す

コミットidをgit logコマンドで調べて戻したいコミットidを指定する

1
$ git reset --hard [commit_id]

reset --hardが戻った以降のコミットをなかったコトにする(コミットログが消える)のに 対しrevertはコミットログを残したまま戻る そのままpushしたりmergeされたりすると、反映されていない変更履歴が残ってしまい、 戻したくなった時にそれを知らないと混乱させる元になる。 チーム開発では要注意!

1
$ git revert [commit_id]

リモートのバージョンを一つ前に戻す

結論から言うとそれ用のコマンドは用意されていない!

念の為バックアップを作成

1
$ git push origin mastermaster_bak

remotemasterを一旦消す。ローカルを一つ戻す
pushして反映させる

1
$ git push origin :master_bak

バックアップを消す