Skip to content

Instantly share code, notes, and snippets.

@tomykaira
Created July 21, 2012 12:16
Show Gist options
  • Star 3 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save tomykaira/3155668 to your computer and use it in GitHub Desktop.
Save tomykaira/3155668 to your computer and use it in GitHub Desktop.
SCMBC 3rd の闇LT資料です

git の一歩その先に

git を自分色に染めあげる

by. @tomy_kaira (License: CC-BY-SA)

git 使いへの道

  • git いれる
  • コミットしたりしてみる
  • 他人と一緒に作業する
  • コマンドをカスタマイズする
  • 規模のあるプロジェクトを管理する
  • git を拡張する
  • git のコミッタになる
  • Hamano さんに勝つ

git 使いへの道

  • git いれる
  • コミットしたりしてみる
  • 他人と一緒に作業する
  • コマンドをカスタマイズする
  • 規模のあるプロジェクトを管理する
  • git を拡張する
  • git のコミッタになる
  • Hamano さんに勝つ

このへんのおはなし

Agenda

  • git のなりたち
  • git config
  • 拡張の方針
  • git のコマンド拡張
  • そのほか

git のなりたち

C + shell script で書かれている。

それぞれのサブコマンドに対応する実行可能ファイルがある。

  • git show/usr/local/libexec/git-core/git-show (バイナリ)
  • git pull/usr/local/libexec/git-core/git-pull (shell script)

git config

Unix like OS なら ~/.gitconfig

名前の記載とかがあるはず。

[user]
  name = tomykaira
  email = tomykaira@gmail.com

どのリポジトリでも使うデフォルト設定を書く。

git config - alias

今回使うのは alias。

[alias]
  co = checkout
  aa = add .

コマンドの別名を決める。

  • git cocheckout
  • git aaadd . (カレントディレクトリ下のすべてのファイルを add)

拡張の方針

  1. 短くせよ

    git のコマンドは全体的に長すぎるので、よくつかうものをどんどん短縮する。

  2. Good default

    git のコマンドはひとつが複数の意味に対応している。 便利なデフォルト値をもったコマンドを作る。

  3. 打ち間違い対策

拡張の方針 - 短く

git 長い

alias g=git # shell の設定

git のコマンド名だけにしてしまう人もいる。

addgit add

拡張の方針 - 短く

checkout 長い → co

svn のデフォルト短縮を参考に

co = checkout br = branch ci = commit d = diff cl = clone

拡張の方針 - 短く

$ git checkout

タイプ数 1/3

$ g co

拡張の方針 - Good default

$ git status

# On branch github-usage
# Changes not staged for commit:
#   (use "git add/rm <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#       deleted:    index.rst
#       modified:   install.rst
#
no changes added to commit (use "git add" and/or "git commit -a")

みにくい

拡張の方針 - Good default

alias: st = status -sb

$ git st

## github-usage
 D index.rst
 M install.rst

拡張の方針 - Good default

よく使うコマンドをまとめる

vlog = log --pretty=format:'%C(red)%h%Creset %C(cyan)<%an>\
       %Creset -%C(yellow)%d%Creset %s %Cgreen(%cr)%Creset'\
       --abbrev-commit --date=relative

色付き(要心の目):

109b7e3 <tomykaira> - (HEAD, origin/github-usage, github-usage) スペルなどを訂正 (10 days ago)
9f8d7a6 <tomykaira> - push の注釈を追加 (10 days ago)
8fbe67b <tomykaira> - github でのリポジトリ作成、clone についての説明 (10 days ago)
10a2ebf <cynipe> - (origin/scmbc-tokyo3) Githubの設定で冗長な見出し区切りをやめた (13 days ago)
14c69b1 <cynipe> - Githubのスクリーンショットを追加 (13 days ago)
a953024 <cynipe> - Read the Docsのデフォルトテーマ対応をしてみた (13 days ago)
8003717 <cynipe> - Githubアカウントの作成、設定について記述し、gitのインストールを別ファイルに移動、体裁を整えた (13 days ago)
bce2a19 <cynipe> - リポジトリ外のファイルが設定にあったので外した。 (13 days ago)
64cb0cc <bleis-tift> - (origin/master, origin/HEAD, master) READMEをとりあえず追加 (8 months ago)

拡張の方針 - Good default

コマンドにいろんな意味があって使いにくい。 意味ごとにコマンドをつくる。

  • commit

      cih = commit --amend -C HEAD
      cim = commit -m
      ciam = commit -am
    
  • rebase

      rb = rebase
      rbh = rebase HEAD
    

拡張の方針 - 打ち間違い対策

高速で g add を打つと

$ g add
$ ga dd
$ g ad

いろいろおこる。

拡張の方針 - 打ち間違い対策

bash:

alias ga="git"

git:

[alias]
  aa = add .
  ad = add
  dd = add

空気を読んでもらう。 (ga なんてコマンドは… Global Armaments?)

コマンド拡張

git-hoge という名前のスクリプト / バイナリにしてパスのとおったところに置く。 git hoge で呼びだせる。

ひとつのコマンドでは不可能な動作をまとめて実行する。

git-flow とかかなり大きなものも実現可能。

コマンド拡張

たとえば…

  • git-mergeto: こないだ作った gist:3111090
  • git-now : かの有名な

コマンド拡張 - 例 git-mergeto

「おまえはいままでにしたマージの回数を覚えているのか?」

$ git checkout master
$ git merge --no-ff topic_branch
$ git branch -d topic_branch
$ git checkout -b new_branch
   :

この動作をまとめる

#!/bin/sh -e

BRANCH=`git symbolic-ref HEAD 2>/dev/null | cut -d/ -f3`
if [ x$1 = 'x' ]; then
  TO='master'
else
  TO=$1
fi
git checkout $TO
git merge $BRANCH --no-ff
git branch -d $BRANCH

コマンド拡張 - 例 git-now

なう! ってすると、現状をとりあえずコミットしてくれる。

$ git now
[github-usage 3688bad] [from now] Mon Jul  9 23:59:43 JST 2012
 2 files changed, 1 insertion(+), 14 deletions(-)
 delete mode 100644 index.rst

master / develop のような long life branch では now させない。 topic branch だけにして、 now を push しちゃう事故防止。

BRANCH=`git symbolic-ref HEAD 2>/dev/null | cut -d/ -f3`
test -z "$BRANCH" -o "$BRANCH" = "master" -o "$BRANCH" = "develop" &&
   echo "You are on branch $BRANCH." && exit

「あ、まちがって master に汚いの push しちゃった!みんなちょっとまって!」 みたいなことがなくなる(実話)

そのほか - 補完をかしこく

git-completion.bash

コマンド名、ブランチ名、リモートリポジトリの名前など、通常の補完ができない部分をカバー

をカスタマイズ

  • git add と来たら未ステージのファイルしか来ない
  • git checkout -- と来たら変更済みのファイルしか来ない

みたいなヒューリスティックを盛り込んだ。 ファイル単位での add が超高速になって便利。

gist:1504934 (フル) gist:1504938 (パッチ)

zsh のことはしりませんが、たぶんだいたい使える。

そのほか - emacs で使う

「そもそもなんでコマンド打ってんの?」

そのほか - gitsum

github:tomykaira/gitsum

  • すでにトラックされているファイルの部分ステージングとコミットが主な仕事。
  • エディタ上でステージしたい部分を区切ることができる。
  • push もできる。
  • git.el と連携して全般的なファイル操作(add とか)ができる。
  • ワンキーで起動、コマンド叩かなくてよい。
  • Good bye git diff status add commit

そのほか - gitsum

  1. gitsum を呼ぶ
  2. diff 形式の変更点が羅列されるので、必要ないものを選択して k
  3. c でコミットコメント入力画面
  4. コメント入力して C-c C-c

そのほか - gitsum

元がふるいので、いろいろなおした版

tomykaira/gitsum

  • trailing whitespace
  • コメント編集して amend
  • サブディレクトリで作業している時にコミット失敗するバグ

まとめ

文字を入力するようにコミットすることが大事

そのためには速度が大事

速度のためにはカスタマイズが必須

という名のもとで、自分のツール・カスタマイズ自慢でした。 #ステマ

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment