テーマ別git tips

51
テーマ別 git Tipsデザインアカデミー 2014/5/25

Upload: ikuo-degawa

Post on 28-May-2015

531 views

Category:

Engineering


4 download

TRANSCRIPT

Page 1: テーマ別Git tips

テーマ別 git Tips!デザインアカデミー 2014/5/25

Page 2: テーマ別Git tips

自己紹介• 出川幾夫 (Degawa, Ikuo)

• 慶應大学院理工学研究科 M2

• スローガンでインターンしてます(エンジニア

• 15年からレバレジーズに勤務

• Apple信者

• 好きなアイドル:東條希

Twitter @ikuwow Facebook: hashiki.ikuwow

Page 3: テーマ別Git tips

今日は・・・• gitをつかっていてよくある困るシーンがあります

• そんなシーン別にgitをどう操作すれば良いのかを説明します!

Page 4: テーマ別Git tips

gitを使っていて現れるシーン1. 「やべっ、消しちゃった!」

2. 「この行何?誰がこんなコード書いたの?」or「いつ俺こんなの書いたっけ?」

3. 「このクラス名ってどこでどれぐらい使われてる?」

4. 「この修正、前のコミットにいれたかったなあ」

5. 「パスワードを入れたファイルをgithubに公開してた・・・・(^ω^;;;)」

Page 5: テーマ別Git tips

何でもは知りません知ってることだけ。

Page 6: テーマ別Git tips

はじめまーす!

適当なリポジトリでいじりながらやりましょう。

Page 7: テーマ別Git tips

その1 「やべっ、あのファイル消しちゃった!」 「やべっ、編集しなきゃよかった!」 「全てを元に戻したい・・・」

Page 8: テーマ別Git tips

どんなとき?• 変な編集してわけわけわかんなくなった。最後にコミットした時に戻りたい。

• 前々回のコミットに戻したい・・。

Page 9: テーマ別Git tips

git reset • リポジトリ、インデックスを戻す

• git reset --hard

• git reset --soft

• git reset --mixed (デフォルト)

Page 10: テーマ別Git tips

git reset --hard: 指定のコミットまで完全リセット

$ git reset --hard ### コミットを指定しないとHEADが指定される!

Page 11: テーマ別Git tips

ワーキングツリー インデックス リポジトリ

ファイル1

ファイル2

ファイル3

ファイル1

ファイル2

ファイル1

ワーキングツリー インデックス リポジトリ

ファイル1

ファイル2

ファイル3

ファイル1

ファイル2

ファイル1

git reset --hard

(ステージング)

←git管理下に無い(untracked)ので変更なし

Page 12: テーマ別Git tips

git reset --soft: HEADのみを前回のコミットに戻す

$ git reset --soft

Page 13: テーマ別Git tips

ワーキングツリー インデックス リポジトリ

ファイル1

ファイル2

ファイル3

ファイル1

ファイル2 ファイル1

ワーキングツリー インデックス リポジトリ

ファイル1

ファイル2

ファイル3

ファイル1

ファイル2 ファイル1

git reset --soft HEAD~

(ステージング)

HEAD

ファイル1

HEAD~

ファイル1

ORIG_HEADHEAD

Page 14: テーマ別Git tips

git reset --mixed: HEADとインデックスを指定したコ

ミットに変更$ git reset --mixed

Page 15: テーマ別Git tips

ワーキングツリー インデックス リポジトリ

ファイル1

ファイル2

ファイル3

ファイル1

ファイル2 ファイル1

ワーキングツリー インデックス リポジトリ

ファイル1

ファイル2

ファイル3

ファイル1

ファイル1

git reset --mixed HEAD~

(ステージング)

HEAD

ファイル1

HEAD~

ファイル1

ORIG_HEAD HEAD:未変更 :変更あり

Page 16: テーマ別Git tips

間違えてgit reset --hard しちゃたら

$ git reset --hard ORIG_HEAD!# 万事解決

Page 17: テーマ別Git tips

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

Page 18: テーマ別Git tips

注意• 未コミットの変更は消えます( --hard)

• どこがリセットされるのかをきちんと確認しておきましょう

• 複数人で開発しているときにgit resetしまくるとわけわかんなくなりがちなので、git revertを使いましょう

Page 19: テーマ別Git tips

その2 「この行何?誰が書いたの?」 「これ書いたのいつだっけ?」

Page 20: テーマ別Git tips

git blame• 犯人探しに使えるコマンド!

• 指定の行を誰がいつ変更したかがわかる!

Page 21: テーマ別Git tips

git blame [ファイル名] 最後に編集された履歴を追跡する

$ git blame test.sh!$ git blame -s test.sh ## 短いblame!$ git blame -L 3,7 test.sh ## 3行目から7行目のblameを表示

Page 22: テーマ別Git tips

Page 23: テーマ別Git tips

tigコマンドなんかもオススメ

$ brew install tig!$ tig blame test.sh

Page 24: テーマ別Git tips

その3 「このクラス名使ってるのどれぐらいあ

るんだろう?」 「この変数どこで使ってる?」

Page 25: テーマ別Git tips

どんなとき?• CSSゴリゴリ書いてるけど、このクラス名orIDを使ってるとこってどれぐらいあるの?

• このグローバル変数 or 定数どこで使われてる?

Page 26: テーマ別Git tips

git grep [文字列]

• git管理下のファイルの全ての行を検索して、指定の文字のある行を表示させる

• Unixコマンドのgrepの拡張

• Unixコマンドのgrepより圧倒的に早い!

Page 27: テーマ別Git tips

git grep

$ git grep -n navbar # “navbar”を行を検索、表示!# 行番号をデフォルトで表示させたいならこれ$ git config --global grep.lineNumber true!$ git grep -n -C 3 navbar # -Cでマッチした行の上下3行まで表示!

Page 28: テーマ別Git tips

注意点• git管理下のファイルしか検索できない(untrackedなファイルは検索できない)

• UNIXコマンドのgrepと違うところが多かったりする。

Page 29: テーマ別Git tips

その4 「途中で別のブランチの 編集したいなあ・・」

Page 30: テーマ別Git tips

どんなとき?• いまの開発より優先度の高いタスクが発生して、別のブランチの作業に移りたいけど、いまcommitするタイミングじゃないし、どうしよう

Page 31: テーマ別Git tips

git stash• コミットしていない状態のコードをとりあえず別の場所に補完しておくコマンド

• リモートから変更をpullするとコンフリクトが発生しちゃう場合にも便利

Page 32: テーマ別Git tips

git stash save: 未コミットの状態を

一時的にキューに保存する$ git status -sM data!$ git stash # git stash saveと同じ$ git stash save!$ git stash save teststash # teststashという名前でstashを保存!

Page 33: テーマ別Git tips

その他 git stash

$ git stash list!$ git stash pop !$ git stash apply!$ git stash drop 2faa5b5!$ git stash clear

Page 34: テーマ別Git tips

注意• 濫用に注意(簡単に消せちゃうし)

• git stash clear

Page 35: テーマ別Git tips

その5 いつの間にかパスワードを含んだファイルをgithubに上げてた・・・。

Page 36: テーマ別Git tips

どんなとき?• dotfilesを管理してるんだけど、何ヶ月も前から.ssh/がgit管理されてしまっていた・・・。しかもgithubに上げてる・・・。id_rsa(秘密鍵)が・・・・。

• 全てのコードを生まれる前に消し去りた い。すべての宇宙、過去と未来の全てのコードをこの手で。

Page 37: テーマ別Git tips

git filter-branch• 過去のコミット全てに対して変更を行って再コミットするコマンド

• 超便利かつ超危険

DANGER!

Page 38: テーマ別Git tips

git filter branchを使って 過去から今までの全ての ファイルを消す手順

$ git filter-branch --tree-filter 'rm -f .ssh’ HEAD# 全てのファイルから.sshディレクトリを削除$ git branch * master$ git gc # diff等に表示されないよう削除$ git push -f origin master

Page 39: テーマ別Git tips

注意• 本当に歴史が全部変更されます。全部消えます。

• リモートリポジトリのどこかに残っていない限り、取り消しできません。

Page 40: テーマ別Git tips

まとめ• git reset

• git blame

• git grep

• git stash

• git filter-branch, git push -f 

Page 41: テーマ別Git tips

気になったらマニュアルを 見ましょう

$ man git-reset!$ man git-rm

Page 42: テーマ別Git tips

「まったく、gitは最高だぜ」

Page 43: テーマ別Git tips

おわりThank you!

Page 44: テーマ別Git tips

以下補足スライド

・・・ゴミスライドとも言う

Page 45: テーマ別Git tips

「すごく小さい修正したけど、 これ前のコミットに入れたかっ

たなあ・・」

Page 46: テーマ別Git tips

git commit --amend

$ git commit --amend

Page 47: テーマ別Git tips

このスライドテンプレートは• azusa

• 大体いい感じになるKeynoteテンプレート「Azusa」作った

http://memo.sanographix.net/post/82160791768

Page 48: テーマ別Git tips

オススメgit本• gitによるバージョン管理(オーム社)

• 結構かため。コマンドライン使えることが前提。

• ナチュラルにgitのことが書いてある印象

Page 49: テーマ別Git tips

さらにやるとすれば• (git cherrypick)

• (git rebase -i ~10)

• (git reflog)

• (git config alias)

Page 50: テーマ別Git tips

「いちいちブランチ名を打ちこむの面倒くさいんですけ

ど・・・」

Page 51: テーマ別Git tips

git-completion.bash

• https://github.com/git/git/tree/master/contrib/completion

• これを.bashrc等に追加すればTabキーでコマンド・branch名等が補完できるようになる!