現在、私はVisualStudioを搭載したWindowsでGitを使用しています。しかし、私はLinuxでGitを最初に少し前に学びました。当初、私は当時働いていた1つのプロジェクトでgit-svnを実行していました。git-svnではすべてのGit機能を利用することはできませんが、Gitを使って自分の道を見つけ、Gitが開発に役立つと確信するのに十分でした。その後、そのリポジトリをSVNからGitに変換することにしました。
Gitの主な利点は、さまざまなワークフローに対応できる柔軟性があることだと思います。したがって、開発チームに最適なものを選択できます。集中型と分散型のどちらを選択するかは、2つの特定のワークフローの間ではなく、考えられるさまざまなワークフローの中から選択できます。SVNと同様の集中型ワークフローを維持することにした場合でも、Gitを使用することにはいくつかの利点があります。
まず、アップストリームとマージする前に変更をコミットします。SVNは、作業をコミットする前に「svnupdate」を実行するように強制します。これは、このマージ中にミスをした場合、作業を失う可能性があることを意味します。SVNでは、現在のマージ状態を破棄して再度やり直すことはできません。また、経験豊富な人に、コンピュータの作業ツリーに直接アクセスできない限り、重要なマージを手伝ってもらうことはできません。
一般に、コミットしてマージすると、変更が行われた実際の状態と、競合をどのように解決したかが示されるため、履歴がより真実になります。欠点は、履歴が線形ではなくなったことです。Gitを使用すると、「git pull --rebase」(デフォルトに設定できます)を実行することで線形履歴を保持できます。これにより、SVNの場合と同様に履歴が線形になります。
SVNの2番目の問題は、中央リポジトリに変更をコミットするときに、他の誰かがその間に変更を加えたかどうかがわからないことです。これらの変更が別のファイルに加えられた場合、SVNはChangeSetを受け入れます。その結果、SVNリポジトリには、誰もテストしていない新しい状態があります。通常、別のファイルに変更を加えても問題は発生しませんが、問題が発生する場合もあります。たとえば、1人の開発者はCヘッダーの一部の関数とそれが使用されるすべての場所を変更しますが、もう1人の開発者はこの関数の新しい使用法を新しいコードに追加します。したがって、各開発者が自分の変更をテストした場合でも、メインの開発ブランチで壊れた状態になる可能性があります。開発者は、誰かが「svn update」と言うまで、この破損にすぐに気付かないかもしれませんが、現時点では、この人は自分自身の変更を持っている可能性があります。
もう1つの便利なGit機能は、トランクに何もコミットせずにアイデアを試すことができることです。それがうまくいかない場合は、それを破棄することができ、誰も気付かないでしょう。他の人から何かを隠すのが好きというわけではありませんが、他の人に自分の作品を私の実験的なものとマージさせたくはありません。さらに、この実験的なコードを削除すると、他の変更と絡み合うため問題が発生します。したがって、SVNを使用する場合、唯一のオプションは、この機能に取り組んでいる間は何もコミットしないことです。ただし、問題が発生した場合に確認して二分する小さな論理的な手順ではなく、最後に巨大なパッチ爆弾が発生します。
ところで、git-bisectは、コード内のトリッキーなリグレッションと戦うのに非常に役立ちます。何かが壊れた場合、何が、なぜかは明らかではないかもしれません。したがって、この問題を引き起こしたコミットを見つける必要があり、git-bisectがこの作業に最適なツールです。
最後に、いくつかの状況をより適切に処理する方法を決定するためのオプションがさらにあります。たとえば、コアチームのメンバーは、変更を直接「トランク」(通常はGitでは「マスター」と呼ばれます)にプッシュできますが、新しく割り当てられた人にレビューなしで変更をプッシュさせたくない場合があります。したがって、同じ中央リポジトリ内の別のブランチに変更をプッシュするように指示してから、メンターに電子メールを送信してください。メンターは、変更が適切である場合は、この変更を確認してマージします。ブランチはGitで本当に安いので、それらを使用することを恐れてはいけません。短期間のトピックブランチがアップストリームにマージされると、通常、その名前は削除されるため、ブランチの名前空間が乱雑になることはありません。