LoginSignup
710

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-04-28

はじめに

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

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

目次

  • 編集内容を取り消したい(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の違いの方が難しかった。

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
710