SlideShare una empresa de Scribd logo
1 de 51
Descargar para leer sin conexión
テーマ別 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名等が補完できるようになる!

Más contenido relacionado

La actualidad más candente

Gitを使ったRoute53の管理
Gitを使ったRoute53の管理Gitを使ったRoute53の管理
Gitを使ったRoute53の管理
Sugawara Genki
 
Dentoo.LT #3 超やさしい Git Hooks
Dentoo.LT #3 超やさしい Git HooksDentoo.LT #3 超やさしい Git Hooks
Dentoo.LT #3 超やさしい Git Hooks
Dong Oi
 
Pythonista による Pythonista のための Scala 紹介 in BPStudy #49
Pythonista による Pythonista のための Scala 紹介 in BPStudy #49Pythonista による Pythonista のための Scala 紹介 in BPStudy #49
Pythonista による Pythonista のための Scala 紹介 in BPStudy #49
shoma h
 
Groovy base
Groovy baseGroovy base
Groovy base
Akura Pi
 

La actualidad más candente (20)

Gitを使ったRoute53の管理
Gitを使ったRoute53の管理Gitを使ったRoute53の管理
Gitを使ったRoute53の管理
 
Gitを使いこなしてみよう!
Gitを使いこなしてみよう!Gitを使いこなしてみよう!
Gitを使いこなしてみよう!
 
プロ生ちゃんbotを作ろう!
プロ生ちゃんbotを作ろう!プロ生ちゃんbotを作ろう!
プロ生ちゃんbotを作ろう!
 
とりあえずこれだけ知っていればお仕事ができる(であろう)gitガチ入門
とりあえずこれだけ知っていればお仕事ができる(であろう)gitガチ入門とりあえずこれだけ知っていればお仕事ができる(であろう)gitガチ入門
とりあえずこれだけ知っていればお仕事ができる(であろう)gitガチ入門
 
MT東京 ぱくたそ/PAKUTASO
MT東京 ぱくたそ/PAKUTASOMT東京 ぱくたそ/PAKUTASO
MT東京 ぱくたそ/PAKUTASO
 
WindowsでもVagrantとChefでLaravelのローカル環境を(自分で)つくりたい!
WindowsでもVagrantとChefでLaravelのローカル環境を(自分で)つくりたい!WindowsでもVagrantとChefでLaravelのローカル環境を(自分で)つくりたい!
WindowsでもVagrantとChefでLaravelのローカル環境を(自分で)つくりたい!
 
Dentoo.LT #3 超やさしい Git Hooks
Dentoo.LT #3 超やさしい Git HooksDentoo.LT #3 超やさしい Git Hooks
Dentoo.LT #3 超やさしい Git Hooks
 
LT 手作りGit
LT 手作りGitLT 手作りGit
LT 手作りGit
 
PyPy 紹介
PyPy 紹介PyPy 紹介
PyPy 紹介
 
OSS Study#19_LT
OSS Study#19_LTOSS Study#19_LT
OSS Study#19_LT
 
Q planet
Q planetQ planet
Q planet
 
Pythonista による Pythonista のための Scala 紹介 in BPStudy #49
Pythonista による Pythonista のための Scala 紹介 in BPStudy #49Pythonista による Pythonista のための Scala 紹介 in BPStudy #49
Pythonista による Pythonista のための Scala 紹介 in BPStudy #49
 
スクレイピングとPython
スクレイピングとPythonスクレイピングとPython
スクレイピングとPython
 
git初心者からgit-flowを使えるレベルになって、リリースとレビューを効率化しよう
git初心者からgit-flowを使えるレベルになって、リリースとレビューを効率化しようgit初心者からgit-flowを使えるレベルになって、リリースとレビューを効率化しよう
git初心者からgit-flowを使えるレベルになって、リリースとレビューを効率化しよう
 
30分でサボれるGit
30分でサボれるGit30分でサボれるGit
30分でサボれるGit
 
GitHub Travis-CI Go!
GitHub Travis-CI  Go!GitHub Travis-CI  Go!
GitHub Travis-CI Go!
 
IPAmj明朝の漢字を検索
IPAmj明朝の漢字を検索IPAmj明朝の漢字を検索
IPAmj明朝の漢字を検索
 
Qt小技(修正版)
Qt小技(修正版)Qt小技(修正版)
Qt小技(修正版)
 
Hubotで遊ぶ
Hubotで遊ぶHubotで遊ぶ
Hubotで遊ぶ
 
Groovy base
Groovy baseGroovy base
Groovy base
 

Destacado

言葉のデザイン
言葉のデザイン言葉のデザイン
言葉のデザイン
Asuya Kohno
 
ネットワーク運用自動化の実際〜現場で使われているツールを調査してみた〜
ネットワーク運用自動化の実際〜現場で使われているツールを調査してみた〜ネットワーク運用自動化の実際〜現場で使われているツールを調査してみた〜
ネットワーク運用自動化の実際〜現場で使われているツールを調査してみた〜
Taiji Tsuchiya
 
機会学習ハッカソン:ランダムフォレスト
機会学習ハッカソン:ランダムフォレスト機会学習ハッカソン:ランダムフォレスト
機会学習ハッカソン:ランダムフォレスト
Teppei Baba
 

Destacado (7)

言葉のデザイン
言葉のデザイン言葉のデザイン
言葉のデザイン
 
集合知プログラミング勉強会 7章(前半)
集合知プログラミング勉強会 7章(前半)集合知プログラミング勉強会 7章(前半)
集合知プログラミング勉強会 7章(前半)
 
集合知プログラミング勉強会 第五章 最適化
集合知プログラミング勉強会 第五章 最適化集合知プログラミング勉強会 第五章 最適化
集合知プログラミング勉強会 第五章 最適化
 
ネットワーク運用自動化の実際〜現場で使われているツールを調査してみた〜
ネットワーク運用自動化の実際〜現場で使われているツールを調査してみた〜ネットワーク運用自動化の実際〜現場で使われているツールを調査してみた〜
ネットワーク運用自動化の実際〜現場で使われているツールを調査してみた〜
 
機会学習ハッカソン:ランダムフォレスト
機会学習ハッカソン:ランダムフォレスト機会学習ハッカソン:ランダムフォレスト
機会学習ハッカソン:ランダムフォレスト
 
こわくない Git
こわくない Gitこわくない Git
こわくない Git
 
いつやるの?Git入門
いつやるの?Git入門いつやるの?Git入門
いつやるの?Git入門
 

Similar a テーマ別Git tips

130427 kansai-emacs-github
130427 kansai-emacs-github130427 kansai-emacs-github
130427 kansai-emacs-github
Yuki Shibazaki
 
今日から始めるGithub
今日から始めるGithub今日から始めるGithub
今日から始めるGithub
lion-man
 
@s_ssk13さん向けGitHub入門
@s_ssk13さん向けGitHub入門@s_ssk13さん向けGitHub入門
@s_ssk13さん向けGitHub入門
Takashi Imagire
 
vimプラグインでよりよい(ry
vimプラグインでよりよい(ryvimプラグインでよりよい(ry
vimプラグインでよりよい(ry
soh335
 

Similar a テーマ別Git tips (20)

Yapc2012資料
Yapc2012資料Yapc2012資料
Yapc2012資料
 
Git超入門
Git超入門Git超入門
Git超入門
 
130427 kansai-emacs-github
130427 kansai-emacs-github130427 kansai-emacs-github
130427 kansai-emacs-github
 
SnapDishの事例
SnapDishの事例SnapDishの事例
SnapDishの事例
 
Git & GitHub & kintone でウルトラハッピー!
Git & GitHub & kintone でウルトラハッピー!Git & GitHub & kintone でウルトラハッピー!
Git & GitHub & kintone でウルトラハッピー!
 
今日から始めるGithub
今日から始めるGithub今日から始めるGithub
今日から始めるGithub
 
@s_ssk13さん向けGitHub入門
@s_ssk13さん向けGitHub入門@s_ssk13さん向けGitHub入門
@s_ssk13さん向けGitHub入門
 
Git tutorial
Git tutorialGit tutorial
Git tutorial
 
gitを使って、レポジトリの一部抽出forkしてみました
gitを使って、レポジトリの一部抽出forkしてみましたgitを使って、レポジトリの一部抽出forkしてみました
gitを使って、レポジトリの一部抽出forkしてみました
 
2018 07-18 git-hub講座
2018 07-18 git-hub講座2018 07-18 git-hub講座
2018 07-18 git-hub講座
 
Git地図
Git地図Git地図
Git地図
 
ぎっと、これから
ぎっと、これからぎっと、これから
ぎっと、これから
 
日本androidの会 中国支部 29回勉強会 github
日本androidの会 中国支部 29回勉強会 github日本androidの会 中国支部 29回勉強会 github
日本androidの会 中国支部 29回勉強会 github
 
社内勉強会用Gitのスライド#02
社内勉強会用Gitのスライド#02社内勉強会用Gitのスライド#02
社内勉強会用Gitのスライド#02
 
一人でもはじめるGitでバージョン管理
一人でもはじめるGitでバージョン管理一人でもはじめるGitでバージョン管理
一人でもはじめるGitでバージョン管理
 
vimプラグインでよりよい(ry
vimプラグインでよりよい(ryvimプラグインでよりよい(ry
vimプラグインでよりよい(ry
 
2015年2月23日 wbtoyama 勉強会 はじめようgit
2015年2月23日 wbtoyama 勉強会 はじめようgit2015年2月23日 wbtoyama 勉強会 はじめようgit
2015年2月23日 wbtoyama 勉強会 はじめようgit
 
Python for Data Analysis第1回勉強会(+git入門)
Python for Data Analysis第1回勉強会(+git入門)Python for Data Analysis第1回勉強会(+git入門)
Python for Data Analysis第1回勉強会(+git入門)
 
Gitの使い方あれこれ
Gitの使い方あれこれGitの使い方あれこれ
Gitの使い方あれこれ
 
Github時代のgitのはなし
Github時代のgitのはなしGithub時代のgitのはなし
Github時代のgitのはなし
 

テーマ別Git tips