coding, photo, plant and demo

*僕がよく使うgitイディオム

tech 20130323 085821
まず、~/.gitconfigによく使うコマンドをaliasで登録。
[alias]
        a = add
        br = branch
        ci = commit
        co = checkout
        cp = cherry-pick
        di = diff
        st = status
        k = "log --graph --pretty='%x09%h %ci %cn%x09%s %Cred%d'"
では個人的によく使いそうなイディオム、あるいは自分がhelpを引かずに打てるコマンドを書きだしてみる。

git diff
今の作業中の差分なんだっけ、とかコミット前に差分を整えたりとか。

git st
これも作業状況の確認。
どのブランチに居るかとかも分かるけど、自分はshellのステータスに常にブランチを出しているからその目的では使わない。

git k
コミットログ一覧をグラフ付きで。
ただ、androidのようなプロジェクトだとmerge commitだらけで役立たないことが多いけど。

git log -p
差分付きでログが見たい。

git log --oneline --no-merges android-4.2.1_r1..android-4.2.2_r1
android4.2.1から4.2.2の差分って何があるんだっけ?
とりあえずマージコミット抜いて一覧が欲しい。

git di --stat android-4.2.1_r1..android-4.2.2_r1
差分がありすぎてよく分からんから、どのあたりのファイルが変更されてるのかだけ知りたい。

git di android-4.2.1_r1..android-4.2.2_r1 -- hoge
それでも差分多いなあ。
気になるhogeディレクトリ以下の差分だけ見てみるか。

git co XXXX
リモートブランチやタグもブランチ作らずにcheck outして、作業したくなった時点でブランチ作ればok。タグやハッシュのcheck outならブランチ作らずにHEADを延ばして後でブランチを作っても良いし。

git br ore-branch
てことで作業したくなったのでブランチを作る。

git co -b ore-branch XXXX
いやいや、今回は最初からブランチ作って作業やる気まんまんですよ。

git stash
ブランチ切り替える前にstashで今のテンポラリだけ念のため退避。
ちゃんとしたものだったらブランチ切ってコミットだけど、後で要るかも程度の、そこまで手間を掛けるほどではない一時的なものはstash。

git stash pop
popで戻し。

git ci -av
今ある差分を全部コミット。
コミットする際に差分を表示してチェック出来るようにする。

git co -- iranai
なんかゴミ差分出てるファイルがあるな。戻しておこう。

git a XXX
git ci -v
作業にゴミが混じってるから、一部のファイルだけコミット。

git a -p XXX
git ci -v
一部のファイルの一部分だけをコミット。
この1行の変更だけは別コミットがいいかな、とかいう時。

git ci --amend
コミットログ、タイポしとるやん。直そう。

git reset HEAD^
今のコミットなし!やり直し。
これで手直ししてからcommitするとか、やっぱ破棄するとか。
ちょっとした手直しならgit commit --amend -aでも良いけど。

git reset --hard HEAD^
今のコミット駄目だこりゃ、もう君とは二度と会わない。削除。どうしてもまた会いたくなったらreflogで探す。

git revert XXX
やばい!もうpushしちゃった奴、ビルブレしてるぞ。
手元で再現しないし、とりあえずリバートコミット作ってpushだ。

git cp XXX
なんかこのブランチ、もうコミット制限かかってるし、必要最小限なセキュリティパッチだけ本線から入れとくわ。

git show
ええと、さっきコミットしたログなんだっけ。

git rebase -i HEAD~5
ちょっと最近のコミットの順番とか、いろいろ整理したい感じ。

git rebase master
今の作業ブランチ、マスターに移動しちゃえ。
fetchした後、origin/masterにrebaseとかも多い。
branchするときに--trackつけてpullしてもいいけど、勝手にmergeされるのが嫌だから自分はfetch+手動でrebase or merge派。

git merge --ff XXXXX
このブランチはFast forwardで取り込もう。
プロジェクト的にできるだけコミットグラフを一直線にしてるときは、rebaseしてmergeって形になると思う。

git merge --no-ff XXXXX
このブランチは後からも延ばしたいしブランチの形状をmasterに残したいから、マージコミットを残しておこう。
successful git branch的な運用では必須。

git clone URI
これがないと基本始まらなかった。
他所様のレポジトリを持ってくる。

git init
パパ、新しくgitレポジトリ作っちゃうぞー、ってとき。

git init --bare hoge
バックアップ用とか、中央レポジトリ用にpushできる先作っとこう、というときにそのサーバ側でベアレポジトリを作成。

git remote add REMOTENAME URI
ちょっと他のレポジトリを取り込むか、ってときにまずはremote addでuri登録。

git remote -v
一体どんなリモートホストを登録したのか忘れた。

vi .git/config
リモートホストとか編集したい。gitのコマンド覚えてないので直接configいじっちゃう。

git fetch REMOTENAME
実際にリモートから取り込んでみる。

git br -r
リモートのブランチ一覧。

git k --all
とりあえず全コミットグラフを見てみるか。

git log --author=HOGE
HOGEさんのコミット一覧。

git br --contains XXXX
XXXXっていうコミット、どのブランチに入っているんだっけ。

git tag --contains XXXX -l android*
XXXXっていうコミット、どのタグに入っているんだっけ。
androidタグに限定するとどれだ?(タグが有り過ぎるときに有効)

git push REMOTEHOST ore-branch:omae-branch
よし、REMOTEHOSTへ手元にあるore-branchをomae-branchとしてpushだ。
ブランチの一部だけpushしたいときは、ore-branchじゃなくてハッシュを指定。
普通は同じブランチ名でpushするから、:以降は省略する。

git tag TAG XXX
XXXにタグ打っとくか。

git push REMOTEHOST TAG
タグをpushしとくか。
git push --tagsはテンポラリのtagまでpushされて悲惨なことになったことがあるので、もう二度と使わない!

git push REMOTEHOST TAG:
やばい、タイポしたタグをpushした。消そう。
ブランチも同じ要領で。
ただ、まともなレポジトリサーバだと取り消しは許されないし、そうでなくとも誰かがfetchしてると非常に面倒くさいことになるので、普通はやったらアカン。つまり、push前は慎重に。

git reflog
git co HEAD@{1}
やばい、rebaseしたら訳わからんことになった!とかいう時はこれでどっかに戻す。

git show android-4.1.1_r1:Android.mk
android-4.1.1のAndroid.mkってどんなんだったっけ?

git show android-1.6_r1:
Donutsの頃のディレクトリ構成を懐かしみたいわー、というとき。


くらいかな。他に思い出したら追加します。
他にもfilter-branchとか強力なコマンドもあるけど、日常では使わないからググらないと使い方わかりません。

git最強のオプション filter-branch
http://qiita.com/items/f60c391b5dbf569a1d12