.gitconfigに設定してるaliasなどのまとめ
22:56 @thinca さんからの指摘を追記
@yuroyoro あとお節介ですが、n個前とdiffなら HEAD^ より HEAD~ の方がいいと思いますよ。両者では若干意味が違います。~なら HEAD~3 と数字が書けるのも利点です。あと個人的にはwhatchangedよりlog --statの方が見やすくて好きです。
2010-10-08 22:30:52 via Tween to @yuroyoro
@yuroyoro URL このgitconfigの記事に関して質問なのですが、core.excludesfile は $HOME で動きますか?以前試した時ダメで、~/ なら動いたのでこちらを使ってるんですが。
2010-10-08 22:20:49 via Tween to @yuroyoro
そんなわけで、仕事でもモリンモリンにgitしてるわけですが、わからないことがある度についったーにポストしてみなさまの好意とネットの集合知に助けられているゆろよろですこんにちウォー。
で、この前「gitの便利な設定知りたいから.gitconfig晒してください。」とお願いしたらいろいろな人から情報を頂いたのでまとめます。@kenchan さん、@mincemaker さん、@kiy0taka さんありがとウォー。
[user] name = ozaki email = ozaki@yuroyoro.com [color] # colorの設定(以下のコマンドは自動で色つける) status = auto diff = auto branch = auto interactive = auto grep = auto [push] default = tracking # defaultのpush先はtrackingしているリポジトリ [core] excludesfile = ~/.gitignore # globalな.gitignoreの指定 autocrlf = input # CRLFを自動変換 [alias] st = status sh = show so = remote show origin ft = fetch up = pull --rebase # pull rebase rbm = rebase master # masterへのrebaseはよく使うのでalias ad = add ci = commit -a # modifiedなファイルを全てstageへ cam = commit -a --amend # 直前のcommitを修正 co = checkout # branch関連 br = branch ba = branch -a # originも含めた全てのbranchを表示 bm = branch --merged # merge済みのbranchを表示 bn = branch --no-merged # mergeしてないbranchを表示 # log関連 wc = whatchanged # logに変更されたファイルも一緒に出す ls = log --stat # logに変更されたファイルも一緒に出す lp = log -p # diffも一緒に出す la = log --pretty=\"format:%ad %h (%an): %s\" --date=short # ざっくりログ出す lr = log origin # originのlog oneline = log --pretty=oneline ranking = shortlog -s -n --no-merges # logをtree表示 log-graph = log --graph --date=short --pretty=format:'%Cgreen%h %cd %Cblue%cn %Creset%s' log-all = log --graph --all --color --pretty='%x09%h %cn%x09%s %Cred%d%Creset' # diff関連 dm = diff master # masterとのdiff dw = diff --color-words # 単語単位でいろつけてdiff dc = diff --cached # addされているものとのdiff ds = diff --staged # 同上(1.6.1移行) d1 = diff HEAD~ # HEADから1つ前とdiff d2 = diff HEAD~~ # HEADから2つ前とdiff d3 = diff HEAD~~~ # HEADから3つ前とdiff d4 = diff HEAD~~~~ # HEADから4つ前とdiff d5 = diff HEAD~~~~~ # HEADから5つ前とdiff d10 = diff HEAD~~~~~~~~~~ # HEADから10前とdiff # mergeの際にconflictが起きたファイルを編集 edit-unmerged = "!f() { git ls-files --unmerged | cut -f2 | sort -u ; }; vim `f`" # mergeの際にconflictが起きたファイルをadd add-unmerged = "!f() { git ls-files --unmerged | cut -f2 | sort -u ; }; git add `f`" # grep関連 gr = grep gn = grep -n
dotfile関連は.gitconfigも含めてGitHubに置いてありますんで。
http://github.com/yuroyoro/dotfiles/blob/master/.gitconfig
他にも「こんなのが便利!」というのがあったらコメントもらえるとありがたいです。
以下、特に便利!とかおもろい!とかおもったものを紹介します。
CUIでもLogをtree表示
# logをtree表示 log-graph = log --graph --date=short --pretty=format:'%Cgreen%h %cd %Cblue%cn %Creset%s' log-all = log --graph --all --color --pretty='%x09%h %cn%x09%s %Cred%d%Creset'
branchがいっぱいあったりしてツリーがどうなってんの?ってときにグラフィカルに見れたら便利ですよね。gitkとかGitXでも見ることができますが、サーバー上で作業してたりしてXとかウゼェってときに、こんな風に見ることが出来て重宝します。
サンプルとしてtwitter4jを使わせてもらいました。GitXで見るとこんな感じです。ほぼいっしょですね。
1つ前や2つ前のcommitとのdiff
@mincemaker さんからパクらせてもらいました。^^^とか入力めんどいのでなるほどと思いました。
d1 = diff HEAD~ # HEADから1つ前とdiff d2 = diff HEAD~~ # HEADから2つ前とdiff d3 = diff HEAD~~~ # HEADから3つ前とdiff d4 = diff HEAD~~~~ # HEADから4つ前とdiff d5 = diff HEAD~~~~~ # HEADから5つ前とdiff d10 = diff HEAD~~~~~~~~~~ # HEADから10前とdiff
あと、HEAD^とHEAD~は微妙に動作が異なることを@thinca さんから指摘してもらいました。
このあたりはGit と GitHub を体験しながら身につける勉強会行ってきた - 予定は未定Blog版に非常にわかりやすく解説してあります。この記事はgit使うなら必読です。
conflictが起きたときのファイルを編集/addする
conflictが起きてmergeが必要になったときに、対象のファイルを一括して編集したりaddしたりします。
# mergeの際にconflictが起きたファイルを編集 edit-unmerged = "!f() { git ls-files --unmerged | cut -f2 | sort -u ; }; vim `f`" # mergeの際にconflictが起きたファイルをadd add-unmerged = "!f() { git ls-files --unmerged | cut -f2 | sort -u ; }; git add `f`"
logにそのコミットで変更されたファイルも一緒にだす
git whatchangedで、こんな感じでlogに変更されたファイルも一緒に出すことができます。地味に便利。
commit e903c577fb3401b4c66037dfc477e73e6851e8e1 Author: Yusuke Yamamoto <yusuke@mac.com> Date: Wed Apr 21 20:23:16 2010 +0900 added some logging message :100644 100644 bfe6eb9... 33b8ce3... M twitter4j-core/src/main/java/twitter4j/internal/http/HttpClientFactory.java commit 925ada673cd56f9d49f1451c7ca192f039d897de Author: Yusuke Yamamoto <yusuke@mac.com> Date: Wed Apr 21 01:41:16 2010 +0900 TFJ-342 Streaming API: wait time for TCP level error is always initialized to 250ms :100644 100644 d3694e1... 6e6a7bd... M twitter4j-core/src/main/java/twitter4j/TwitterStream.java commit 5169a3363b4808f3b0ee498534511530e3b9318b Author: Yusuke Yamamoto <yusuke@mac.com> Date: Tue Apr 20 23:17:41 2010 +0900 TFJ-341 StackOverFlowError at RequestToken.hashCode() - fixed infinite loop in hashCode() :100644 100644 955250a... 5766efb... M twitter4j-core/src/main/java/twitter4j/http/RequestToken.java :100644 100644 7239976... ac6f381... M twitter4j-core/src/test/java/twitter4j/http/OAuthTest.java
@thinca さんにlog --statというものがあると教えてもらいました。確かにこちらの出力のほうが見やすいですね。
ozaki@yuroyoro-MacBook $ git log --stat (git)-[master][~/sandbox/java/twitter4j] commit e903c577fb3401b4c66037dfc477e73e6851e8e1 Author: Yusuke Yamamoto <yusuke@mac.com> Date: Wed Apr 21 20:23:16 2010 +0900 added some logging message .../twitter4j/internal/http/HttpClientFactory.java | 4 ++++ 1 files changed, 4 insertions(+), 0 deletions(-) commit 925ada673cd56f9d49f1451c7ca192f039d897de Author: Yusuke Yamamoto <yusuke@mac.com> Date: Wed Apr 21 01:41:16 2010 +0900 TFJ-342 Streaming API: wait time for TCP level error is always initialized to 250ms .../src/main/java/twitter4j/TwitterStream.java | 10 ++++++---- 1 files changed, 6 insertions(+), 4 deletions(-) commit 5169a3363b4808f3b0ee498534511530e3b9318b Author: Yusuke Yamamoto <yusuke@mac.com> Date: Tue Apr 20 23:17:41 2010 +0900 TFJ-341 StackOverFlowError at RequestToken.hashCode() - fixed infinite loop in hashCode() .../src/main/java/twitter4j/http/RequestToken.java | 20 -------------------- .../src/test/java/twitter4j/http/OAuthTest.java | 1 + 2 files changed, 1 insertions(+), 20 deletions(-)
Globalな.gitignoreと、プロジェクト固有で自分だけ無視したいファイルの設定
core.excludesfileに.gitignoreを指定することで、全てのプロジェクトで無視したいファイルを設定できます。
で、$HOME/.gitignoreには書きたくなくて、プロジェクトのリポジトリにはプロジェクト固有の.gitignoreが登録されていて、自分だけそのプロジェクトで無視したいファイルを指定したいしたいときには、プロジェクト内の".git/info/exclude"に指定すればよいそうです。(@kenchan さんありがとウォー)
/vendor/plugins/b/ *.bak
このように".git/info/exclude"に書いておくと、プロジェクト固有の.gitignoreを汚染することなく自分だけ無視したいファイルを設定できます。