torutkのブログ

ソフトウェア・エンジニアのブログ

ソースコード管理ツールをSubversionからGitへ変更して感じたこと

少人数チームでのソフトウェア開発でソースコードを管理するリポジトリにGitを適用して1,2ヶ月ほど経過しました。Gitを開発に使用するのは今回が始めてで、みなSubversionを使っていたメンバーです。

開発環境

OS Linux、たまにWindows
開発言語 Java
プログラミングツール NetBeans 7.4
Gitクライアント NetBeans標準搭載のGit機能、たまにコマンドラインWindowsではたまにTortoiseGit
Gitサーバー apacheでgit-http-backend、Redmineと認証統合

現在の使用状況


GitapacheHTTP

masterclonemastermasterpush

使SubversionpushGit使SubversionGitSubversionpushpushorigin/mastermastermergepush


GitSubversion

Git調GitGit

分散リポジトリは、開発者が便利とは思わないかも


GitSubversionGit



使GitSubversion

Gitの真髄はブランチにあり?


Git調Subversion


Subversiontrunkbranches

Subversion

1ABAaaaABBAaaa

2辿



GitSubversion

ブランチ運用の参考


Git"A successful Git branching model"URL
http://keijinsonyaban.blogspot.jp/2010/10/successful-git-branching-model.html

masterdevelopment2
Hotfix
master
developdeveloppushmaster
developdevelop
developdevelopmaster
masterdevelopmaster

使いかたのイメージ

この"A successful Git branching model"をベースにして、チケット駆動開発では次のような手順を考えました。

通常の機能開発
  • 機能開発のチケット(#1231)を作成し、着手する
  • 共有リポジトリから自分の開発マシンにクローンしてローカルリポジトリを作成する
    • 既に自分の開発マシンに共有リポジトリのクローンがあれば、fetchして最新にする
  • developブランチからフィーチャーブランチ(名前は"feature/#1231")を作成する
    • ブランチの命名規約を、ブランチ種類 + '/' + #チケット番号 とした
  • フィーチャーブランチ(feature/#1231)で変更を実施、適宜ローカルでコミットする
  • 機能開発が完了したら、共有リポジトリとローカルリポジトリを整合させる(fetch)
  • ローカルリポジトリのdevelopへフィーチャーブランチ(feature/#1231)をマージする
    • Fast-forwardマージにはしない(--no-ffを指定)
    • コンフリクトが出たら編集・解決する
  • ローカルのdevelopを共有リポジトリのdevelopへpushする
  • フィーチャーブランチ(feature/#1231)を削除する(残しておいてもいいですが・・・)
機能開発中にチームメートの成果を取り込み

上述のフィーチャーブランチ(feature/#1231)で変更実施中

  • 共有リポジトリからfetchする
  • ローカルのdevelopブランチをフィーチャーブランチへマージ
    • ここはrebaseの方がよいかも?





#1272



fetch


develop"bug/#1272"

 + '/' + # 


bug/#1272

fetch

developbug/#1272

Fast-forward--no-ff




developdeveloppush

feature/#1272

バグ修正(緊急修正)

リリースした製品のバグを緊急に修正(バグ修正バージョンをリリース)する場合のワークフローです。

  • 共有リポジトリから自分の開発マシンにクローンしてローカルリポジトリを作成する
    • 既に自分の開発マシンに共有リポジトリのクローンがあれば、fetchして最新にする
  • masterブランチの対象リリースタグからホットフィックスブランチ(名前はhotfix/1.2.1)を作成する
    • 命名規約は、ブランチ種類 + '/' + このホットフィックスのリリース番号
  • ホットフィックスブランチ(名前はhotfix/1.2.1)で変更を実施、適宜ローカルでコミットする
  • バグ修正が完了したら、共有リポジトリとローカルリポジトリを整合させる(fetch)
  • ローカルリポジトリのmasterへホットフィックスブランチ(名前はhotfix/1.2.1)をマージする
    • Fast-forwardマージにはしない(--no-ffを指定)
    • コンフリクトが出たら編集・解決する
  • ローカルリポジトリのmasterでタグをつける(1.2.1)
  • ローカルのmasterを共有リポジトリのmasterへpushする
  • ローカルリポジトリのdevelopへホットフィックスブランチ(名前はhotfix/1.2.1)をマージする
    • Fast-forwardマージにはしない(--no-ffを指定)
    • コンフリクトが出たら編集・解決する
  • ローカルのdevelopを共有リポジトリのdevelopへpushする

SubversionとGitの履歴管理イメージ


SubversionJavaArrayListtrunkbranches

GitID2
補足(2014-01-25)

上の文章は、SubversionとGitを内部構造を知らずブラックボックス的に使っているときに感じるイメージで、内部構造を言及しているものではありません。