Edited at

[git] 戻したい時よく使っているコマンドまとめ

More than 1 year has passed since last update.


はじめに

コミットのバージョンを戻す、ステージングしたものを編集内容ごと取り消す、ファイルのステージングを取り下げる...と戻すにも色々あります。

整理も兼ねて業務でよく使っているコマンドをまとめます。


目次


  • 編集内容を取り消したい(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

でバックアップを消す。

以前やらかした時に助けられました...:pray:

参考

Gitでリモートリポジトリを巻き戻す | @tmtms のメモ


おわりに

resetとrevertよりもresetとcheckoutの違いの方が難しかった。