テーマ別git tips
TRANSCRIPT
テーマ別 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_HEADHEAD
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 reflog48585a2 HEAD@{0}: commit: phpのパスを変更、php53に2faa5b5 HEAD@{1}: commit (merge): merged.bb8e098 HEAD@{2}: checkout: moving from lablab to masterdf46799 HEAD@{3}: checkout: moving from master to lablabbb8e098 HEAD@{4}: commit: vim-fugitiveをインストールc72ed79 HEAD@{5}: clone: from ssh://[email protected]: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 -sM 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名等が補完できるようになる!