ロックとチュウーハイとこりんがるな日々

日々のインプットした事をアウトプットする場所

Git 戻す系の処理を自分の理解の為にまとめてみた

先週Gitでファイルを巻き戻す時にどうするのかを聞かれてうまく説明できなかったので以下に自分がちゃんと 理解していないかを痛感したので自分の為にまとめてみる事にしました

※Gitのinstallや基本的な操作についてはふれません

Gitは以下の3つのファイルの状態を持っています

  • ワーキングツリー

    現在のファイルの状態

  • インデックス

    addした時点のファイルの状態

  • HEAD

    commitした時点の状態

Gitが上記の3つのファイルの状態を持っている事をふまえて一連の流れを書きます

  1. git init

    適当なディレクトリを作成しそのディレクトリ内で以下のコマンドを発行する

     $ git init
    

    この時点のGitの状態

  2. ファイルを作成する

     $ vim index.html
     <!DOCTYPE HTML>
     <html lang="jp">
     <head>
     <meta charset="UTF-8">
     <title></title>
     </head>
     <body>
     </body>
     </html>
    

    この時点のGitの状態

    ファイルが作成されたのでワーキングツリーの位置が進みます

  3. add する

     $ git add index.html
    

    この時点のGitの状態

    インデックスの位置が進みます

  4. commit する

     $ git commit -m "first commit"
     [master (root-commit) 9d3f252] first commit
      1 file changed, 9 insertions(+)
      create mode 100644 index.html
    

    この時点のGitの状態

基本的にはpushしてリモートリポジトリに追加して一連の流れとしてはOKかと思います

次はファイルを巻き戻す方法を以下に書いていきたいと思います

修正しているファイルの修正箇所を取り消す

  1. index.htmlを編集する

    ワーキングツリーのファイルを修正したのワーキングツリーが1つ進む

  2. 修正している箇所を取り消す

    ワーキングツリーを戻す

     $ git checkout index.html
    

addを取り消す

  1. index.htmlを修正、add(インデックスに登録する)

  2. addを取り消す

    • addだけ取り消す

        $ git reset HEAD
      

      この状態になる

    • ワーキングツリーの変更も取り消す

        $ git reset --hard HEAD
      

      この状態になる

commit を取り消す

  1. index.htmlを修正して、add, commitをする

  2. commit を取り消す

    • commit だけを直前に戻す

        $ git reset --soft HEAD^
      

      この状態になる

    • commitとaddを直前に戻す

        $ git reset HEAD^
      

    • ワーキングツリーも含めて直前に戻す

        $ git reset --hard HEAD^
      

まとめ

  • HEAD, HEAD^

    • HEAD

      最新のcommitの位置

    • HEAD^

      一つ前のcommitの位置

    ※commit IDを指定して戻す事も可能

      $ git reser [commit id]
    
  • --soft, option無し, --hard

    • --soft

      HEADを操作する

    • option無し

      HEAD, indexを操作する

    • --hard

      HEAD, index, ワーキングツリーを操作する

だいぶ頭を整理できましたようするに

git reset [なにを戻すかを指定する] [どの位置まで戻すかを指定する]  

って感じですか、間違ってたら教えて下さい

でわでわ

参考にした記事

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

murankの日記 git reset についてもまとめてみる