Git 戻す系の処理を自分の理解の為にまとめてみた
先週Gitでファイルを巻き戻す時にどうするのかを聞かれてうまく説明できなかったので以下に自分がちゃんと 理解していないかを痛感したので自分の為にまとめてみる事にしました
※Gitのinstallや基本的な操作についてはふれません
Gitは以下の3つのファイルの状態を持っています
ワーキングツリー
現在のファイルの状態
インデックス
addした時点のファイルの状態
HEAD
commitした時点の状態
Gitが上記の3つのファイルの状態を持っている事をふまえて一連の流れを書きます
git init
適当なディレクトリを作成しそのディレクトリ内で以下のコマンドを発行する
$ git init
この時点のGitの状態
ファイルを作成する
$ vim index.html <!DOCTYPE HTML> <html lang="jp"> <head> <meta charset="UTF-8"> <title></title> </head> <body> </body> </html>
この時点のGitの状態
ファイルが作成されたのでワーキングツリーの位置が進みます
add する
$ git add index.html
この時点のGitの状態
インデックスの位置が進みます
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かと思います
次はファイルを巻き戻す方法を以下に書いていきたいと思います
修正しているファイルの修正箇所を取り消す
index.htmlを編集する
ワーキングツリーのファイルを修正したのワーキングツリーが1つ進む
修正している箇所を取り消す
ワーキングツリーを戻す
$ git checkout index.html
addを取り消す
index.htmlを修正、add(インデックスに登録する)
addを取り消す
addだけ取り消す
$ git reset HEAD
この状態になる
ワーキングツリーの変更も取り消す
$ git reset --hard HEAD
この状態になる
commit を取り消す
index.htmlを修正して、add, commitをする
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 [なにを戻すかを指定する] [どの位置まで戻すかを指定する]
って感じですか、間違ってたら教えて下さい
でわでわ