Upgrade to PRO for Only $50/Year—Limited-Time Offer! 🔥

Git workflow and activity

Git workflow and activity

Git のワークフローを紹介して、チームの状態やメンバーのアクティビティを把握するための方法やツールを発表した。
Git のリポジトリから取得できる情報を使ってブランチ毎の状態を把握するコマンドを作って紹介した。
dRuby と daemontools を使い、分散オブジェクトのサーバとクライアントを作り、update フックを介して、リジトリには直接は含まれないブランチとタグの操作を追記していく簡単なタイムラインツールを作り、使い方を発表した。

# スライド中のリンク

* http://nvie.com/posts/a-successful-git-branching-model/
* http://scottchacon.com/2011/08/31/github-flow.html
* https://github.com/blog/1557-github-flow-in-the-browser
* https://github.com/blog/1335-tidying-up-after-pull-requests
* https://github.com/blog/1476-get-up-to-speed-with-pulse
* http://blog.gitlab.org/gitlab-5-dot-3-released/
* http://gitstats.sourceforge.net/
* https://github.com/blog/1484-check-the-status-of-your-branches
* https://github.com/grauwoelfchen/timeline

Yasuhiro Asaka

July 14, 2013
Tweet

More Decks by Yasuhiro Asaka

Other Decks in Programming

Transcript

  1. • 開発中のメインブランチ develop • --no-ff でマージして、ブランチで開発されたこ とという情報を残す • develop から分岐して作成、使い終わったら

    削除される、機能追加のための features ブラ ンチ • develop から分岐して作成される製品リリース のための releases ブランチ • release ブランチからはリリースのためにした 変更を最後に master と develop にマージさ れる • hotfix は develop と master の計画的でない 変更や修正のために作成されるブランチ これ も最後に master と develop にマージされる
  2. • master はいつもすぐにデプロイ可能 • 新しい作業を始めるときは、説明的な名前でブランチをmaster から作成する • ローカル上で作成したブランチにコミットし、サーバーの同じ名前のブランチへも 作業内容を 定期的に

    push する • フィードバックや助言が欲しい時、ブランチをマージしてほしいと思ったときは、 Pull Request を作成する • 他の誰かがレビューをして機能に OK を出してくれたら、コードをmasterへマー ジすることができる • マージして maste rへ push したらデプロイする github / github-services
  3. % cat ~/.zshrc ### commands - experiment {{{ function stats-branch()

    { local branch remote ahead behind if [[ -n $1 ]]; then remote=$1 else remote="upstrm" fi git for-each-ref --format="%(refname:short)" refs/heads refs/remotes | \ while read branch do ahead=`git rev-list remotes/"${remote}"/master..${branch} --count 2>/dev/null` behind=`git rev-list ${branch}..remotes/"${remote}"/master --count 2>/dev/null` printf "%-30s %16s | %-15s %s\n" "$branch" "(behind $behind)" "(ahead $ahead)" "remotes/${remote}/master" done } # }}}
  4. % stats-branch origin master (behind 0) | (ahead 1) remotes/origin/master

    stumpish-notifier (behind 0) | (ahead 1) remotes/origin/master origin/HEAD (behind 0) | (ahead 0) remotes/origin/master origin/master (behind 0) | (ahead 0) remotes/origin/master origin/stumpish-notifier (behind 0) | (ahead 1) remotes/origin/master origin/v2.0 (behind 16) | (ahead 1) remotes/origin/master origin/v2.0_refactorings (behind 16) | (ahead 35) remotes/origin/master upstrm/gh-pages (behind 1519) | (ahead 3) remotes/origin/master upstrm/master (behind 0) | (ahead 5) remotes/origin/master upstrm/v2.0 (behind 16) | (ahead 1) remotes/origin/master upstrm/v2.0_refactorings (behind 16) | (ahead 46) remotes/origin/master
  5. % cat ~/.gitconfig ... [alias] ... ls-branch = "!(for i

    in `git branch -a | colrm 1 2 | awk '{print $1}'` ; do echo `git log --date=iso8601 -n 1 --pretty='format:[%ai] %h' $i` $i ; done) | sort -r " % git ls-branch [2013-06-17 11:33:59 +0200] 67be380 remotes/upstrm/master [2013-06-14 08:10:03 -0700] b99ccc2 remotes/upstrm/v2.0_refactorings [2013-06-10 14:12:26 +0200] 1aa6fdf remotes/upstrm/gh-pages [2013-06-06 16:12:40 +0900] 48566d4 stumpish-notifier [2013-06-06 16:12:40 +0900] 48566d4 remotes/origin/stumpish-notifier [2013-06-06 16:12:40 +0900] 48566d4 master [2013-05-31 00:13:17 -0700] 6363368 remotes/origin/master [2013-05-31 00:13:17 -0700] 6363368 remotes/origin/HEAD [2013-05-22 01:27:14 +0200] fdbb652 remotes/origin/v2.0_refactorings [2013-04-20 22:54:57 +0200] 31a4956 remotes/upstrm/v2.0 [2013-04-20 22:54:57 +0200] 31a4956 remotes/origin/v2.0
  6. % cat client.rb require "drip" user,action,target,name,date = ARGV MyDrip =

    DRbObject.new_with_uri("druby://localhost:54321") MyDrip.write([action, target, name, date], user) % cat server.rb require 'drip' require 'drb' drip = Drip.new(".drb") DRb.start_service("druby://localhost:54321", drip) DRb.thread.join % git clone https://github.com/grauwoelfchen/timeline.git
  7. % pry [1] pry(main)> require 'drb' => true [2] pry(main)>

    MyDrip = DRbObject.new_with_uri("druby://localhost:54321") => #<DRb::DRbObject:0x000000026b3008 @ref=nil, @uri="druby://localhost:54321"> [3] pry(main)> MyDrip.read(0, 2) #=> Queue 構造になっていて `head` メソッドも便利 ;) => [[1373569317719130, ["create", "branch", "master", "e64c41f63586a0020552dc0ba07a1d25f1e309b9", "timeline.git", "Fri Jul 12 04:01:57 JST 2013"], "yasuhiro"], [1373569650654906, ["create", "branch", "create-server-script", "ecd0afee973ce623b873e0a31b6988d69d50bcb9", "timeline.git", "Fri Jul 12 04:07:30 JST 2013"], "yasuhiro"]]