SlideShare a Scribd company logo
やりなおせるGit入門
2013-06-01 広島 Git 勉強会 201306
自己紹介
•ひむらともひこ
•Twitter eielh
•Github eiel
•http://eiel.info/
やりなおせる Git 入門
目的
•元に戻せないのは怖い
•元に戻せるようになろう
•危険 と 少し危険 を知る
とみせかけて
reset と checkout
の話をする
やりなおせる Git 入門
ふつうの Git 入門
+ やりなおせる
事前準備
•$ echo readme > README.md
•$ ls .
README.md
•$ cat README.md
readme
はじめてのコミット
•git init
•git add .
•git commit -m ‘initial commit’
間違えたらどーするの?
git init
•間違えた!
•最初からやりなおしたい
•rm -rf .git
git add .
•間違えた!
•add する前にもどしたい
•git rm --cached .
ん?覚えられないって?
•git status すると書いてあります
git status
$ git status
# On branch master
#
# Initial commit
#
# Changes to be committed:
# (use "git rm --cached <file>..." to unstage)
#
# new file: README.md
#
git commit -m intial commit`
•間違えた!
•コミットメッセージなおしたい
• git commit --amend -m ‘replace message
初回は特別なので難しい
•最初からやりなおしたくなれば
•rm -rf .git
NeXT STEP
ふたつめのコミット
ふたつめのコミット
•$ echo readyou > README.md
•$ git add -u
•$ git commit -m ‘second commit’
ファイルの変更
•間違えた!
•変更をなしにしたい
•git checkout README.md
•変更は消えてしまう
•危険
git add -u
•間違えた!
•変更をまだ追加したくないの
•git reset README.md
•変更は 残ったまま
•安全
git commit
• 間違えた!!
• commit する前と同じ状態にしたい
• git reset --soft HEAD^
• 変更は残ったまま & コミットは追えなくなる
• 少し危険
登場したコマンド
•git rm --cached
•git checkout ファイル名
•git reset
•git reset --soft コミットのようなもの
危険の定義
• 変更が失われてしまい、復元できなくなっ
てしまうようなもの
危険なコマンド
•git reset --hard
•git checkout ファイル名
•ブランチ名の場合は安全
•変更した残したいならコミットする
少し危険の定義
•コミットが新しく作成され、別物に代わ
ってしまう
•コミットが今のブランチから辿れない
少し危険なコマンド
•git commit --amend
•ひとつ前のコミットが別のものになり
ます
•git rebase
•新しいコミットに置き換えられます
危険なコマンドをする前に
•怖いなら
•とにかくコミットしとけ
•git commit
少し危険なコマンドをする前に
•怖いなら
•とにかくブランチを作成しとけ
•git branch ブランチ名
よくわからない、怖くなったら
•git branch helpme
•git add .
•git commit -m たすけて
•偉い人に聞く
もう少し詳しく
reset と checkout
•必要な知識
•ワークツリー
•インデックス
•コミット
•ツリーのようなもの
ワークツリー
•実際に存在しているファイルやディレク
トリ
•編集して変化していく内容
コミットコミット
インデックスインデックス
ワークツリーワークツリー
コミットコミット
インデックスインデックス
ワークツリーワークツリー
ファイルを変更する
インデックス
•コミットを作る前準備をするところ
•準備ができたところでコミットするとそ
れがコミットになる
コミットコミット
インデックスインデックス
ワークツリーワークツリー
git add
コミット
•復元するために必要なファイルやディレ
クトリ、コミットメッセージ、作成日、
前のコミットなどを保存している
コミットコミット
インデックスインデックス
ワークツリーワークツリー
git commit
ツリーのようなもの
•ファイルツリーがとりだせるようなもの
•コミット
•ツリー
•インデックス
•などなど
Reset
•指しているコミットとインデックスを指
定したコミットのものに変えるコマンド
•--soft の場合は指しているコミットだけ
•--hard の場合はワークツリーも変更
•コミットを指定しない場合は HEAD
コミットコミット
インデックスインデックス
ワークツリーワークツリー
HEAD^
git reset --soft HEAD^
コミットコミット
インデックスインデックス
ワークツリーワークツリー
HEAD^
git reset HEAD^
コミットコミット
インデックスインデックス
ワークツリーワークツリー
HEAD^
git reset --hard HEAD^
reset の弱い順
•git reset --soft
•git reset
•git resset --hard
強い
弱い
インデックスだけ取り消したい
コミットコミット
インデックスインデックス
ワークツリーワークツリー
HEAD
git reset HEAD
インデックスも
ワークツリーも
まとめて戻したい
コミットコミット
インデックスインデックス
ワークツリーワークツリー
HEAD
git reset --hard HEAD
上から切り裂く
Checkout ファイル
• `checkout ブランチ` とは区別して考えて
• ワークツリーとインデックスを変更する
• 指定したファイルをインデックスと同じものに
• `ツリーのようなもの`明示的にを指定すること
もできます
コミットコミット
インデックスインデックス
ワークツリーワークツリー
git checkout ファイル名
コミットコミット
インデックスインデックス
ワークツリーワークツリー
HEAD^
git checkout HEAD^ ファイル
下ふたつだけを自由自在に動かす
一番下を動かすのは危険
少し危険
git commit --amend
A B C
master
git commit --amend
A B C
C'
master
C を辿る手段がない
reflog などで探せますが
master を複製しておく
git branch old
git commit --amend
old
A B C
C'
master
git reset --hard old
で元に戻れる
git rebase
初期状態
origin
A B C
D
master
git rebase origin
origin
A B C
D
D'
master
master を複製しておくと
git branch old
初期状態
old
origin
A B C
D
master
git rebase origin
old
origin
A B C
D
D'
master
git reset --hard old
で元に戻れる
別にコミットのID がわかるなら ブランチは
作る必要はありません
おまけ
•git revert はあるコミットをなかったこ
とにするコミットを作成します
•新しくコミットを作成するコマンド
•git commit の -m はそろそろ卒業しま
しょう
まとめ
• 危険なことをするなら
• 変更がコミットされてるか確認する
• 消えてもいいなら気にしない
• 少し危険なことをするなら
• ブランチを作成しとけば元に戻せる
まとめ
•危険
•git reset --hard
•git checkout ファイル名
まとめ
•少し危険
•git reset コミットのようなもの
•git commit --amend
•git rebase
まとめ
• git reset は ブランチ が指すところを変える
• git checkout ファイル名
• インデックスとワークツリーを変更する
ご清聴ありがとうございました

More Related Content

やりなおせる Git 入門