テーマ別 git Tips!
デザインアカデミー 2014/5/25
自己紹介
• 出川幾夫 (Degawa, Ikuo)
• 慶應大学院理工学研究科 M2
• スローガンでインターンしてます(エンジニア
• 15年からレバレジーズに勤務
• Apple信者
• 好きなアイドル:東條希
Twitter @ikuwow
Facebook: hashiki.ikuwow
今日は・・・
• gitをつかっていてよくある困るシーンがあり
ます
• そんなシーン別にgitをどう操作すれば良いの
かを説明します!
gitを使っていて現れるシーン
1. 「やべっ、消しちゃった!」
2. 「この行何?誰がこんなコード書いたの?」or「いつ俺こ
んなの書いたっけ?」
3. 「このクラス名ってどこでどれぐらい使われてる?」
4. 「この修正、前のコミットにいれたかったなあ」
5. 「パスワードを入れたファイルをgithubに公開して
た・・・・(^ω^;;;)」
何でもは知りません
知ってることだけ。
はじめまーす!
適当なリポジトリでいじりながらやりましょ
う。
その1
「やべっ、あのファイル消しちゃった!」
「やべっ、編集しなきゃよかった!」
「全てを元に戻したい・・・」
どんなとき?
• 変な編集してわけわけわかんなくなった。最
後にコミットした時に戻りたい。
• 前々回のコミットに戻したい・・。
git reset
• リポジトリ、インデックスを戻す
• git reset --hard
• git reset --soft
• git reset --mixed (デフォルト)
git reset --hard:
指定のコミットまで完全リセット
$ git reset --hard 	
### コミットを指定しないとHEADが指定される	
!
ワーキングツリー インデックス リポジトリ
ファイル1
ファイル2
ファイル3
ファイル1
ファイル2
ファイル1
ワーキングツリー インデックス リポジトリ
ファイル1
ファイル2
ファイル3
ファイル1
ファイル2
ファイル1
git reset --hard
(ステージング)
←git管理下に無い(untracked)ので変更なし
git reset --soft:
HEADのみを前回のコミットに戻す
$ git reset --soft
ワーキングツリー インデックス リポジトリ
ファイル1
ファイル2
ファイル3
ファイル1
ファイル2 ファイル1
ワーキングツリー インデックス リポジトリ
ファイル1
ファイル2
ファイル3
ファイル1
ファイル2 ファイル1
git reset --soft HEAD
(ステージング)
HEAD
ファイル1
HEAD
ファイル1
ORIG_HEAD
HEAD
git reset --mixed:
HEADとインデックスを指定したコ
ミットに変更
$ git reset --mixed
ワーキングツリー インデックス リポジトリ
ファイル1
ファイル2
ファイル3
ファイル1
ファイル2 ファイル1
ワーキングツリー インデックス リポジトリ
ファイル1
ファイル2
ファイル3
ファイル1
ファイル1
git reset --mixed HEAD
(ステージング)
HEAD
ファイル1
HEAD
ファイル1
ORIG_HEAD HEAD
:未変更
:変更あり
間違えてgit reset --hard
しちゃたら
$ git reset --hard ORIG_HEAD	
!
# 万事解決
git reflog:
HEADの指してきたコミットの履歴を
見る
$ git reflog	
48585a2 HEAD@{0}: commit: phpのパスを変更、php53に	
2faa5b5 HEAD@{1}: commit (merge): merged.	
bb8e098 HEAD@{2}: checkout: moving from lablab to master	
df46799 HEAD@{3}: checkout: moving from master to lablab	
bb8e098 HEAD@{4}: commit: vim-fugitiveをインストール	
c72ed79 HEAD@{5}: clone: from ssh://git@ikuwow.com:26457/home/git/
repos/dotfiles.git
注意
• 未コミットの変更は消えます( --hard)
• どこがリセットされるのかをきちんと確認し
ておきましょう
• 複数人で開発しているときにgit resetしまくる
とわけわかんなくなりがちなので、git revert
を使いましょう
その2
「この行何?誰が書いたの?」
「これ書いたのいつだっけ?」
git blame
• 犯人探しに使えるコマンド!
• 指定の行を誰がいつ変更したかがわかる!
git blame [ファイル名]
最後に編集された履歴を追跡する
$ git blame test.sh	
!
$ git blame -s test.sh ## 短いblame	
!
$ git blame -L 3,7 test.sh ## 3行目から7行目のblameを表示
例
tigコマンドなんかもオススメ
$ brew install tig	
!
$ tig blame test.sh
その3
「このクラス名使ってるのどれぐらいあ
るんだろう?」
「この変数どこで使ってる?」
どんなとき?
• CSSゴリゴリ書いてるけど、このクラス名orID
を使ってるとこってどれぐらいあるの?
• このグローバル変数 or 定数どこで使われて
る?
git grep [文字列]
• git管理下のファイルの全ての行を検索して、
指定の文字のある行を表示させる
• Unixコマンドのgrepの拡張
• Unixコマンドのgrepより圧倒的に早い!
git grep
$ git grep -n navbar # “navbar”を行を検索、表示	
!
# 行番号をデフォルトで表示させたいならこれ	
$ git config --global grep.lineNumber true	
!
$ git grep -n -C 3 navbar # -Cでマッチした行の上下3行まで表示	
!
注意点
• git管理下のファイルしか検索できない
(untrackedなファイルは検索できない)
• UNIXコマンドのgrepと違うところが多かった
りする。
その4
「途中で別のブランチの
編集したいなあ・・」
どんなとき?
• いまの開発より優先度の高いタスクが発生し
て、別のブランチの作業に移りたいけど、い
まcommitするタイミングじゃないし、どうし
よう
git stash
• コミットしていない状態のコードをとりあえ
ず別の場所に補完しておくコマンド
• リモートから変更をpullするとコンフリクトが
発生しちゃう場合にも便利
git stash save:
未コミットの状態を
一時的にキューに保存する
$ git status -s	
M data	
!
$ git stash # git stash saveと同じ	
$ git stash save	
!
$ git stash save teststash # teststashという名前でstashを保存	
!
その他 git stash
$ git stash list	
!
$ git stash pop 	
!
$ git stash apply	
!
$ git stash drop 2faa5b5	
!
$ git stash clear
注意
• 濫用に注意(簡単に消せちゃうし)
• git stash clear
その5
いつの間にかパスワードを含んだファ
イルをgithubに上げてた・・・。
どんなとき?
• dotfilesを管理してるんだけど、何ヶ月も
前から.ssh/がgit管理されてしまってい
た・・・。しかもgithubに上げて
る・・・。id_rsa(秘密 )が・・・・。
• 全てのコードを生まれる前に消し去りた
い。すべての宇宙、過去と未来の全ての
コードをこの手で。
git filter-branch
• 過去のコミット全てに対して変更を行って再
コミットするコマンド
• 超便利かつ超危険
DANGER!
git filter branchを使って
過去から今までの全ての
ファイルを消す手順
$ git filter-branch --tree-filter 'rm -f .ssh’ HEAD	
# 全てのファイルから.sshディレクトリを削除	
$ git branch 	
* master	
$ git gc # diff等に表示されないよう削除	
$ git push -f origin master
注意
• 本当に歴史が全部変更されます。全部消えま
す。
• リモートリポジトリのどこかに残っていない
限り、取り消しできません。
まとめ
• git reset
• git blame
• git grep
• git stash
• git filter-branch, git push -f 
気になったらマニュアルを
見ましょう
$ man git-reset	
!
$ man git-rm
「まったく、gitは最高だぜ」
おわり
Thank you!
以下補足スライド
・・・ゴミスライドとも言う
「すごく小さい修正したけど、
これ前のコミットに入れたかっ
たなあ・・」
git commit --amend
$ git commit --amend
このスライドテンプレートは
• azusa
• 大体いい感じになるKeynoteテンプレート
「Azusa」作った

http://memo.sanographix.net/post/
82160791768
オススメgit本
• gitによるバージョン
管理(オーム社)
• 結構かため。コマン
ドライン使えること
が前提。
• ナチュラルにgitのこ
とが書いてある印象
さらにやるとすれば
• (git cherrypick)
• (git rebase -i ~10)
• (git reflog)
• (git config alias)
「いちいちブランチ名を打ち
こむの面倒くさいんですけ
ど・・・」
git-completion.bash
• https://github.com/git/git/tree/master/
contrib/completion
• これを.bashrc等に追加すればTabキーでコマ
ンド・branch名等が補完できるようになる!

テーマ別Git tips