Upload
yoshihiro-ohsuka
View
575
Download
1
Embed Size (px)
Citation preview
Git入門あの頃に戻るには
Loco Partners大須賀 義浩
Thursday, September 12, 13
過去に戻りたい
そう思うことってありますよね
例えば
Thursday, September 12, 13
「私は・・・鹿目さんとの出会いをやり直したい彼女に守られる私ではなく、彼女を守る私になりたい」
Thursday, September 12, 13
閑話休題
Thursday, September 12, 13
プログラムを編集してたら、なんか知らないけど動かなくなってしまった・・・
編集前の状態に戻したい・・・
そんなとき、簡単に戻すことができる
Thursday, September 12, 13
そう、Gitならね
Thursday, September 12, 13
$ git checkout -- target.txt
$ git checkout target.txtでも戻るけど、あまり良くない。仮にtarget.txtというブランチがあった場合、『そのブランチへのチェックアウト』という動作になってしまう。
Case1変更したファイル(未add)を元に戻したい
Thursday, September 12, 13
$ 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
$ 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
$ 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
A
commit
HEAD
B
インデックス
ワーキングツリー
ワーキングツリー現在のファイルの状態インデックスaddした変更HEADコミットを指すポインタ
Thursday, September 12, 13
A
HEAD
B
インデックス
ワーキングツリー
ファイルを編集するとワーキングツリーが変わる
Thursday, September 12, 13
A
HEAD
B
インデックス
ワーキングツリー
git add で、ワーキングツリーの内容がインデックスに登録される
Thursday, September 12, 13
A
HEAD
B
インデックス
ワーキングツリー
C
git commit で、インデックスの状態のコミットが作成される
Thursday, September 12, 13
ではgit reset HEADgit checkout --
とは何だったのか
Thursday, September 12, 13
A
HEAD
B
インデックス
ワーキングツリー
git reset HEAD は、インデックスをHEADまで戻す
インデックス
Thursday, September 12, 13
A
HEAD
B
インデックス
ワーキングツリー
git checkout -- は、ワーキングツリーをインデックスまで戻す
ワーキングツリー
Thursday, September 12, 13
これをふまへて
Thursday, September 12, 13
$ git reset --hard HEAD
git reset は、HEADを指定したコミットの位置に移動するコマンド--hardというオプションを付けると、HEAD、インデックス、ワーキングツリーが指定したコミットの位置に移動します。(--hardオプションを使う時は、個別のファイルを指定することはできない。)
Case3全てのファイルを、直前のコミットの状態に戻したい
Thursday, September 12, 13
A
HEAD
B
インデックス
ワーキングツリー
git reset --hard HEAD
インデックス
ワーキングツリー
Thursday, September 12, 13
$ git reset --hard HEAD^
HEAD^ というのは、HEADのひとつ前のコミットのエイリアス
(HEADとかHEAD^とかよくわかんない、とにかくあの時に戻りたいという場合はcommit_idを指定する$ git reset --hard 73da94c0204aaac817bc2(以下略)commit idはgit logなどで確認)
Case4全てのファイルを、ひとつ前のコミットの状態に戻したい
Thursday, September 12, 13
A
HEAD
B
インデックス
ワーキングツリー
git reset --hard HEAD^
インデックス
ワーキングツリー
HEAD
Thursday, September 12, 13
A
HEAD
B
--hard があれば --soft もありますgit reset --soft HEAD^
インデックス
ワーキングツリー
HEAD
Thursday, September 12, 13
A B
この状態で$ git commit -am ‘こみっと!’
すると
インデックス
ワーキングツリー
HEAD
Thursday, September 12, 13
A C
Aの後にCというコミットが作成されます
インデックス
ワーキングツリー
HEAD
Thursday, September 12, 13
git reset のオプションは他にも--mixed--merge--keepがあります。
コミットの取消方法としては git-revert もあり、指定したコミット"だけ"無かったことにしたい時などに使用します。
Thursday, September 12, 13
Thursday, September 12, 13
Enjoy Git!
Thursday, September 12, 13