はじめに
コミットのバージョンを戻す、ステージングしたものを編集内容ごと取り消す、ファイルのステージングを取り下げる...と戻すにも色々あります。
整理も兼ねて業務でよく使っているコマンドをまとめます。
目次
- 編集内容を取り消したい(addする前)
- ステージングを取り消したい
- コミットのバージョンを戻したい
- 特定のファイルのみ、コミットのバージョンを戻したい
- リモートリポジトリのコミットのバージョンを戻したい
編集内容を取り消したい(addする前)
git checkout [ファイル名]
ファイル名のところを.
にすると、ステージング前の全ての変更内容がなくなる。
ステージングを取り消したい
git reset [ファイル名]
ステージングを取り下げる。編集内容は残る
ファイル名を指定しないと全てのステージングが取り下げられる。
git checkout HEAD -- [ファイル名]
ステージしたファイルを最後にコミットした状態に戻す
つまり編集内容は残らない。
git reset --hard HEAD
編集・ステージングいずれの変更内容を取り消し、最後にコミットした状態に戻す
checkoutとresetの違いを説明しようとするとそれだけで記事が1つ書けそうなので今回はやりません。
ただざっくりとだけ説明すると、
大きく分けて違いは二つ
-
作業ディレクトリの未保存の有無をチェックする機能
checkout:ある。うまくやれば未変更のファイルを全て更新してくれる
reset --hard:ない。容赦無く上書きされる -
HEADの移動の仕方
checkout:HEADそのものが移動。HEADが付いていたブランチに変化はない
reset:HEADの示すブランチの方が移動
上の説明の図があります。
7.7 Git のさまざまなツール - リセットコマンド詳説
コミットのバージョンを戻したい
git reset --hard [コミットid]
コミットidはgit log
コマンドで調べて、戻りたいコミットのidを指定してあげる。
※非推奨(個人的に)
git revert [コミットid]
reset --hard
が戻った以降のコミットをなかったことにする(コミットログが消える)のに対して、revert
はコミットログを残したまま戻る。
そのままpushしたりmergeされたりすると、反映されていない変更履歴が残ってしまい、メンバーを混乱させることがある。不要になったコミット履歴に気をつけましょう。
特定のファイルのみ、コミットのバージョンを戻したい
git checkout [コミットid] [ファイルパス]
リモートリポジトリのコミットのバージョンを戻したい
結論から言うとそれ用のコマンドはない。
なので以下の手順で
リモートリポジトリを消す→ローカルのを反映させる
ということをする。
念のためバックアップを作成
git push origin master:master_bak
remoteのmasterを一旦消す。ローカルを一つ戻す。
pushして反映させる。
git push -f origin HEAD^:master
無事に戻せたのを確認できたら
git push origin :master_bak
でバックアップを消す。
以前やらかした時に助けられました...
参考
Gitでリモートリポジトリを巻き戻す | @tmtms のメモ
おわりに
resetとrevertよりもresetとcheckoutの違いの方が難しかった。