28
Git入門 あの頃に戻るには Loco Partners 大須賀 義浩 Thursday, September 12, 13

Git入門 あの頃に戻るには

Embed Size (px)

Citation preview

Page 1: Git入門 あの頃に戻るには

Git入門あの頃に戻るには

Loco Partners大須賀 義浩

Thursday, September 12, 13

Page 2: Git入門 あの頃に戻るには

過去に戻りたい

そう思うことってありますよね

例えば

Thursday, September 12, 13

Page 3: Git入門 あの頃に戻るには

「私は・・・鹿目さんとの出会いをやり直したい彼女に守られる私ではなく、彼女を守る私になりたい」

Thursday, September 12, 13

Page 4: Git入門 あの頃に戻るには

閑話休題

Thursday, September 12, 13

Page 5: Git入門 あの頃に戻るには

プログラムを編集してたら、なんか知らないけど動かなくなってしまった・・・

編集前の状態に戻したい・・・

そんなとき、簡単に戻すことができる

Thursday, September 12, 13

Page 6: Git入門 あの頃に戻るには

そう、Gitならね

Thursday, September 12, 13

Page 7: Git入門 あの頃に戻るには

$ git checkout -- target.txt

$ git checkout target.txtでも戻るけど、あまり良くない。仮にtarget.txtというブランチがあった場合、『そのブランチへのチェックアウト』という動作になってしまう。

Case1変更したファイル(未add)を元に戻したい

Thursday, September 12, 13

Page 8: Git入門 あの頃に戻るには

$ git status# On branch master# Changes not staged for commit:# (use "git add/rm <file>..." to update what will be committed)# (use "git checkout -- <file>..." to discard changes in working directory)## modified: target.txt

Case1変更したファイル(未add)を元に戻したい

Text

ちなみに git status を見ると、戻し方が書いてあります。(しんせつ)

Thursday, September 12, 13

Page 9: Git入門 あの頃に戻るには

$ git reset HEAD target.txt$ git checkout -- target.txt

ちなみに親切なことに定評のある git status を見ると、

$ git status# On branch master# Changes to be committed:# (use "git reset HEAD <file>..." to unstage)## modified: target.txt

Case2addしちゃったファイルを元に戻したい

Thursday, September 12, 13

Page 10: Git入門 あの頃に戻るには

$ echo 'hoge' >> target.txt$ git add target.txt$ echo 'fuga' >> target.txt$ git commit -m 'こみっと!'

ところで、編集→git add→編集→git commit

とした場合、どうなるかご存知ですか?

ここでコミットされるのは、addした時点のtarget.txtです

Thursday, September 12, 13

Page 11: Git入門 あの頃に戻るには

A

commit

HEAD

B

インデックス

ワーキングツリー

ワーキングツリー現在のファイルの状態インデックスaddした変更HEADコミットを指すポインタ

Thursday, September 12, 13

Page 12: Git入門 あの頃に戻るには

A

HEAD

B

インデックス

ワーキングツリー

ファイルを編集するとワーキングツリーが変わる

Thursday, September 12, 13

Page 13: Git入門 あの頃に戻るには

A

HEAD

B

インデックス

ワーキングツリー

git add で、ワーキングツリーの内容がインデックスに登録される

Thursday, September 12, 13

Page 14: Git入門 あの頃に戻るには

A

HEAD

B

インデックス

ワーキングツリー

C

git commit で、インデックスの状態のコミットが作成される

Thursday, September 12, 13

Page 15: Git入門 あの頃に戻るには

ではgit reset HEADgit checkout --

とは何だったのか

Thursday, September 12, 13

Page 16: Git入門 あの頃に戻るには

A

HEAD

B

インデックス

ワーキングツリー

git reset HEAD は、インデックスをHEADまで戻す

インデックス

Thursday, September 12, 13

Page 17: Git入門 あの頃に戻るには

A

HEAD

B

インデックス

ワーキングツリー

git checkout -- は、ワーキングツリーをインデックスまで戻す

ワーキングツリー

Thursday, September 12, 13

Page 18: Git入門 あの頃に戻るには

これをふまへて

Thursday, September 12, 13

Page 19: Git入門 あの頃に戻るには

$ git reset --hard HEAD

git reset は、HEADを指定したコミットの位置に移動するコマンド--hardというオプションを付けると、HEAD、インデックス、ワーキングツリーが指定したコミットの位置に移動します。(--hardオプションを使う時は、個別のファイルを指定することはできない。)

Case3全てのファイルを、直前のコミットの状態に戻したい

Thursday, September 12, 13

Page 20: Git入門 あの頃に戻るには

A

HEAD

B

インデックス

ワーキングツリー

git reset --hard HEAD

インデックス

ワーキングツリー

Thursday, September 12, 13

Page 21: Git入門 あの頃に戻るには

$ git reset --hard HEAD^

HEAD^ というのは、HEADのひとつ前のコミットのエイリアス

(HEADとかHEAD^とかよくわかんない、とにかくあの時に戻りたいという場合はcommit_idを指定する$ git reset --hard 73da94c0204aaac817bc2(以下略)commit idはgit logなどで確認)

Case4全てのファイルを、ひとつ前のコミットの状態に戻したい

Thursday, September 12, 13

Page 22: Git入門 あの頃に戻るには

A

HEAD

B

インデックス

ワーキングツリー

git reset --hard HEAD^

インデックス

ワーキングツリー

HEAD

Thursday, September 12, 13

Page 23: Git入門 あの頃に戻るには

A

HEAD

B

--hard があれば --soft もありますgit reset --soft HEAD^

インデックス

ワーキングツリー

HEAD

Thursday, September 12, 13

Page 24: Git入門 あの頃に戻るには

A B

この状態で$ git commit -am ‘こみっと!’

すると

インデックス

ワーキングツリー

HEAD

Thursday, September 12, 13

Page 25: Git入門 あの頃に戻るには

A C

Aの後にCというコミットが作成されます

インデックス

ワーキングツリー

HEAD

Thursday, September 12, 13

Page 26: Git入門 あの頃に戻るには

git reset のオプションは他にも--mixed--merge--keepがあります。

コミットの取消方法としては git-revert もあり、指定したコミット"だけ"無かったことにしたい時などに使用します。

Thursday, September 12, 13

Page 27: Git入門 あの頃に戻るには

Thursday, September 12, 13

Page 28: Git入門 あの頃に戻るには

Enjoy Git!

Thursday, September 12, 13