ちょっと真面目に git を触る必要が出てきたので,今回は Subversion (svn) と git でのディレクトリの区切り方の違い,所謂 trunk/branches/tags の管理方法(方針)ついてメモします.
Subversion における trunk/branches/tags
svn では,root (または,各プロジェクトのルートディレクトリ)の直下に trunk/branches/tags と言う 3 種類のディレクトリを作成する慣習がありました.各ディレクトリの役割は下記のようになります.
- trunk
- そのプロジェクトにおけるメインとなるソースコードを管理する.
- branches
- プロジェクトの(メインの)ソースコードに対して実験的な修正・拡張を行う場合に,trunk(または別の branch)から派生させて派生元には影響を与えないようにする.
- tags
- 新バージョンをリリースする際などに,その時点でのスナップショットを保存しておく.
ただし,svn においては上記は慣習と言うか運用上のテクニック(概念)であって,svn での操作自体は svn copy や svn merge などの古典的(?)なコマンドを活用するだけでした.
git における trunk/braches/tags
一方,git においては,システムがこの慣習を強く意識しており,git branch や git tag と言うコマンドが用意されています.そのため,svn では実質的には「ただのコピー」であった branches や tags が git ではもう少し賢く(?)管理されているようです.
ただし,git には trunk と言う概念はないようです.git init や git clone コマンドで初期化処理を行ったときに,master と呼ばれるベースとなるものが作成されますが,この master も branch のひとつであるようです.git では trunk を設けずに branch の中で主従関係を決め,主 branch に該当する側を trunk 的に使うことによって svn の trunk/branches/tags と同様の運用を実現しています.
gitのルートディレクトリの trunk ディレクトリがあるのはあまり一般的ではないように思います。svn では trunk, branches, tags が普通のディレクトリとして扱われるのに対して git では tag, branch が組み込みになっているので、git(hub) の master = svn の trunk という風にするとよいかと。(※コメント欄より引用)
404 Blog Not Found:tips - svnメイン、でもgithubでも公開したい場合の最小手順
主従関係にある branch 間(trunk <-> branch)で修正を共有する際には,svn と同様に git merge コマンドや git pull コマンドを使うことになるのですが,それ以外の方法として,主 branch (trunk) の修正を従(派生)branch に反映するには git rebase コマンドを使用するのが楽であるように思われます.
例の場合、ブランチAから派生したブランチBに対して、「変更α」と「変更β」、「変更γ」という3回のコミットを行っている。また、ブランチBを作成したのち、ブランチAには複数のコミットが行われている。このような状態でブランチBに対し「get rebase ブランチA」を実行すると、ブランチAの最新版に対して、ブランチBを作成してからブランチBの最新版までの間に加えられた変更(この場合変更αと変更 β、変更γ)が適用され、それがブランチBの最新版となる。
http://sourceforge.jp/magazine/09/03/16/0831212/5
リモートブランチ
上記の従(派生)branch はローカルホスト上に作成されます.しかし,従(派生)branch に対して複数人が修正を行うような場合にはそれではうまく機能しません.このような場合には,リモートブランチと呼ばれる機能を使用するようです.リモートブランチとは,その名の通りサーバ上のリポジトリに(派生)branch を作成します.
リモートリポジトリにブランチを作るには、ローカルのbranchに変更をcommit後、
git push origin remotebranchとします。
Yoshimopedia
以上,ざっとですが git でのバージョン管理方針について(svn と比較しながら)調べてみました.まだ,実際にあまりコマンドを叩いていないので不安ですが,少しずつ git にも慣れていこうと思います.