Help us understand the problem. What is going on with this article?

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

 gitレポジトリの状態を前に戻すコマンドgit resetについて、覚えるために自分用メモ。

参考資料

usage

 git reset -hで出てくるusageはこんな感じ。

git reset [--mixed | --soft | --hard | --merge | --keep] [-q] [<commit>]

 いろいろオプションがあるけれど、普通に使う分には、だいたい以下のものを把握してればいいみたい。

git reset [--soft | --hard] [HEAD | HEAD^]

 次の項から、この[--soft | --hard]及び[HEAD | HEAD^]がどういう意味を持つのか、まとめてみる。

HEADとHEAD^

 この部分は、「状態をどこまで戻すか」の指定をしている。HEADHEAD^はそれぞれ、最新のコミットの位置・そのひとつ前のコミットの位置を指す。

 ただしHEADは、ここの図では「どこまでコミットしているか」という意味で使われているので、すこしこんがらがった。そりゃぁ最新のコミットという意味なので、そういうことなんだけど。

 なお、ここにはコミットのidを入れてももちろんOK。HEADHEAD^は代名詞なんですね。

--softと--hard

 git resetはともかく、状態を前に戻すコマンド。しかしgitにおける「状態」は、

  • HEAD (現在の最新コミットの状態)
  • index (何をaddしたか・addした時点でのファイルの状態)
  • working tree (いま現在のファイルの状態)

と3つ考えられる。このうちのどれを取り扱うか指定しているのが、この--soft--hardなどのオプションだ。

 どのオプションを付けると、何が操作対象になるかは、以下の表の通り。

HEAD index working tree
--soft o
(no option) o o
--hard o o o

 要するに、

  • やってしまったコミット(だけ)をなかったことにしたかったら、--soft
  • addもなかったことにしたかったら、オプションなし
  • ファイルの変更自体をなかったことにしたかったら、--hard

ということ。また言い換えると

  • 現在のファイルの中身が変わっちゃ困るなら、--hardはやっちゃダメ
  • addしたものを忘れられちゃこまるなら、オプションなしでは危ない。--softをつけよう。
  • コミット位置を変えたくないなら、git reset使うな…ではなく、戻す先をHEADにしておけば安心ですね。

という感じ。

まとめ

 分かってしまえば、

git reset <何を戻す?> <どこまで戻す?>

というだけの話だったんですね。納得。

 まぁ、ミスを修正するためのコマンドにしてはややこしいっすよね。「ええっ! コミットをなかったことにされると困るぞ…!? git resetこわっ!」とか思ってました。

 でもこういう理解をしておけば、「何をミスったのか」「どこまで戻れば帳消しにできるのか」だけ考えればコマンド打てるので、使えそうな気がしてきました。

fnobi
面白法人のテクニカルディレクター 兼 作曲家 兼 ドルヲタ ⌨️ http://github.com/fnobi 🎼 http://soundcloud.com/fnobi
http://fnobi.com/
kayac
古都鎌倉から新しい技術と面白いサービスを、次々にリリースする面白法人カヤックのフロントエンジニアチーム
http://www.kayac.com
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした