( ꒪⌓꒪) ゆるよろ日記

( ゚∀゚)o彡°オパーイ!オパーイ! ( ;゚皿゚)ノシΣ フィンギィィーーッ!!!

.gitconfigに設定してるaliasなどのまとめ

22:56 @thinca さんからの指摘を追記



「そんな.gitconfigで大丈夫か?」
f:id:yuroyoro:20101006140122p:image


そんなわけで、仕事でもモリンモリンに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

他にも「こんなのが便利!」というのがあったらコメントもらえるとありがたいです。


「大丈夫だ。問題ない。」
f:id:yuroyoro:20101006140123p:image


以下、特に便利!とかおもろい!とかおもったものを紹介します。

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とかウゼェってときに、こんな風に見ることが出来て重宝します。
f:id:yuroyoro:20101008185108p:image

サンプルとしてtwitter4jを使わせてもらいました。GitXで見るとこんな感じです。ほぼいっしょですね。
f:id:yuroyoro:20101008185216p:image

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を汚染することなく自分だけ無視したいファイルを設定できます。