「SVN脳患者から見たGit」という、Subversion ユーザが Git を理解するのが難しい現象を説明している良記事があります。
私は Git のことがよくわかっていないのですが、私がこの記事の言う「SVN 脳」であるせいでよくわからないのか、という点を考えてみました。
さて、この記事の結論部分にはこうあります。
で、僕の場合は「コミットをパッチとみなすことができる」という点が一番ひっかかりポイントだったよ、ということです。
Subversionではブランチ=タグ=ディレクトリなんだけど、これは本当にGitのブランチを理解する弊害になるよね・・・。
私がここに引っかかっているかどうかというと、おそらく No です。
Subversionにとって、そしてSVN脳患者にとってマージとはスナップショット同士の比較であり、2つのディレクトリのdiffをとって、そのdiffをもとにブランチで行った修正を抽出して取り込む作業であり
たしかにこう述べられているように、Subversion ではブランチがディレクトリであり「ディレクトリの diff が取れてしまう」ものです。
しかし私は「ディレクトリの diff を取り込む」という考え方をしません。
私がこの図における branch-a 全体を trunk にマージしようとしたら、「r10 時点の trunk と r10 時点の branches/branch-a との差分(diff 1)」ではなく、「branches/branch-a における r5 と r10 との差分(diff 2)」をマージしよう、という感覚になります。
したがって私は、ブランチやタグがディレクトリであることによって理解が難しい、というわけではなさそうです。
なぜ私がマージについてこのような感覚を持つようになったのか辿ってみたところ、次のような経験によるものと思われます。
-
CVS を使っていたから
CVS では CVSWeb の Revision Graph を見ることで、ファイルごとの成長(例: src/sys/conf/newvers.h)を確認することができました。また CVS においては「ディレクトリ全体の状態」を表すリビジョンがなかったので、ディレクトリ全体という意識が薄かったのだと思います。
さらに、CVS ではブランチポイントタグを付けてからブランチを切っていたと思います。そのため Subversion を使うようになっても「そのブランチにおける成長の歴史」というものを意識しているのだと思います。 -
FreeBSD の開発でコミット単位でマージするのを見てきたから
FreeBSD では CURRENT から STABLE 開発用のブランチが分岐し、分岐したブランチ全体が CURRENT に合流するということがありません。CURRENT で行われたとある修正が security fix で、それが STABLE にも必要であれば、その修正だけが STABLE にマージされていきます。例を挙げると FreeBSD-SA-05:21.openssl や FreeBSD-SA-14:14.openssl のように、必要な差分だけがコミットされていきます。
図で言うと「trunk の r9(r8:9の差分)を branches/branch-a に持ってくる」に相当するマージを見て育ってきたことになります。これは「コミットはパッチである」に通ずる考え方に思えます。
編集履歴
- 2021/07/21 CvsGraph, FreeBSD-SA の例を追記
- 2021/07/21 図を修正