2

どのようにおよび/またはなぜGitでのマージがSVNよりも優れているのかを読んだ後? まだわかりません。維持しているバージョンが複数あるとしましょう(すべてを本番環境で維持する必要があります)。

  • v1.0
  • v1.1
  • v1.2
  • v1.3
  • v1.4

今、私はv1.0にバグ修正をコミットします(そして私はすべての次のバージョンでこのバグ修正が必要です)。

gitとsvnの両方で、次の論理演算を実行する必要があります

  1. x = 1
  2. 次のブランチv1にマージします。(x)
  3. v1のすべてが正常であることを確認します(テスト、ビルド)。(x)
  4. x ++ goto(2)最後のブランチまで

その(またはgerrit)にgitを使用する主な利点は何ですか?次のブランチへのマージコミットテストの論理演算は同じです!では、何が違うのでしょうか?(マージアルゴリズムのマイナーな改善だけであれば、それほど重要ではありません。Subversionでの競合の自動マージ解決はかなり優れています。また、Subversionでマージを行うためにブランチv1.1をチェックアウトしてもかまいません。私のためにそれを行ういくつかのユーティリティを持っているので、私はそれに時間を費やしません)。

4

3 に答える 3

5

gitは他のバージョン管理システムのようにデルタを保存しないため、各コミットで各ファイルのコンテンツ全体を保存します(非常に圧縮された効率的な方法で、ただし、物事を単純にするために、保存しないことに注意してください)デルタを保存します。繰り返して申し訳ありませんが、これがgitを初めて使用するほとんどの専門家が混乱する理由です)。

また、マージする必要がある場合は、あるブランチの最後の100コミットのデルタ/差分(コンテキストが変更された)を別のブランチに適用しようとする代わりに、各ブランチの最後の状態/スナップショットと共通ベースの祖先を3方向にマージします。

はるかに単純なアプローチであり、はるかに効果的であり、ユーザーに100の競合が発生することはありません。

于 2012-04-26T20:22:03.230 に答える
3

この点は、SVNとGitの非難機能を比較するとわかると思います。私の会社はSVNを使用しています(そして私はそれに不満を持っています)。私たちの開発者は独自のマージを行わないため、コードは常に別の人によってマージされます。「誰がその行を変更したのか、そしてその理由は?」とよく聞かれます。だから私はsvnのせいを実行します。その行が別のブランチからのマージを介して入った場合、表示されるコミットは、その行を編集した人ではなく、マージのコミットです。だから私はその枝を見つけてそれを責めようとしなければなりません。上記の例では、v1.4で追跡を開始した場合、変更を見つけるためにv1.0に戻るまで半日を無駄にする可能性があります。

Gitのせいは、変更を加えた人のコミットメントを常に与えてくれます。それが私たちが見つけようとしていることだからです。これは説明責任にとってはるかに優れています。

これが、上記の「svnにはマージとブランチの概念がない」という意味だと思います。マージが発生したときに行われたコミットのみが表示され、適切な非難を行うために履歴をそれよりも先にさかのぼることはできません。

于 2012-07-26T17:54:15.070 に答える
0

あなたがしていることは同じように見えますが、違いは、gitがそのようなすべてのステップでどこにマージしているのかをネイティブに追跡できることです。したがって、「v1.4」を更新すると、バグ修正が元々v1.0に対して行われ、次にv1.1(および誰がどのように)にマージされ、次にv1.2、v1.3、そして最後にマージされたことがわかります。 v1.4。

svnには、それ自体でマージとブランチの概念はありません。v1.4の最終製品は、コンテンツの「branches/v1.4」ディレクトリを変更する別のツリーリビジョンになります。最近のsvnリリースは、特定のリビジョンが実際に別のブランチからの変更をマージすることを何らかの方法で追跡することでこの問題に対処しようとしましたが、それは後で組み込まれるものであり、あまりうまく機能しません。

もう1つの重要な違いは、2つのブランチで1つの単純な変更を行った場合に、あなたが言及したプロセスにかかる時間を測定した場合(その時点ではかなり異なっていました)、svn / svnmergeでは30分、gitでは11分かかったことです。 *。これの多くは、svnがリモートサーバーからすべての履歴情報をフェッチする必要があるという事実とおそらく関係があり、gitはローカルおよびネイティブ(=効率的な)データ構造にすべてを持っています。

(*これは、テストなどを実行するワークフロー全体でした。それ自体では、svnmergeコマンドとgitmergeコマンドの時間差は1.5分対<1秒でした。)

于 2012-04-26T20:14:20.523 に答える