質問

枝が幹に再統合されると、その枝は実質的に死んだことになりますか?

再統合後にブランチに変更を加え、後日それらをトランクにマージして戻すことはできますか?

役に立ちましたか?

解決

ブランチが死んだり無効になったりしていなければ、技術的には実行できますが、再統合後にブランチからトランクにマージすることはお勧めできません。

その理由に関する完全な議論はここで見つけることができます。 Subversion マージ再統合

基本的に、変更をトランクに再度マージすることが可能であると記載されていますが、再統合では再統合操作の前にトランクからブランチにマージする必要があるため、Subversion 1.5 では非常に問題となるリフレクティブ/循環マージに直面することになります。 。
記事によると、再統合後すぐに再統合されたブランチを削除し、代わりに同じ (または異なる) 名前で新しいブランチを作成することが推奨されています。

これは既知の Subversion の動作であり、将来のバージョン (おそらく 1.6) で対処される予定です。


他のヒント

実際には、次のことを行う必要があります。 --record-only トランクから、によって作成されたリビジョンのブランチにマージします。 --reintegrate 専念:

$ cd trunk
$ svn merge --reintegrate ^my-branch 
$ svn commit

Committed revision 555. 
# This revision is ^^^^ important

そして今、あなたはそれを録音します

$ cd my-branch
$ svn merge --record-only -c 555 ^trunk 
$ svn commit

今すぐブランチを維持していただいて結構です

詳細については、 第4章。分岐とマージ、高度なマージ.

ブランチからトランクに再統合した後、次の 2 つのいずれかを実行する必要があります。

  • ブランチを削除する. 。これは最も簡単ですが、ブランチの履歴を確認するのが難しくなります。

  • 再統合コミットをマージしないようにブランチに指示します. 。トランクに再統合し、リビジョン X としてコミットすると、ブランチで次のコマンドを実行できます。 svn merge --record-only -c X url-to-trunk. 。ただし、マージ自体以外のコミットの一部として変更を行った場合は、これを行うべきではありません。その他の変更はブランチに戻されることはありません。

誰かがブランチに複数回変更を加えた場合に、変更を元に戻すためのアドバイス (1.5 より前): どのリビジョンでマージを行ったかを覚えておいてください!リビジョン番号をどこかに書き留めるか、 または (そのほうが簡単です) タグを作る. 。(もちろん後から調べることもできますが、それはPITAです。)

例:

次のようなリポジトリ レイアウトがあります。

/your_project
  /trunk
  /branches
  /tags

これが Web アプリケーションであり、リリースを計画しているとします。タグを作成し、そこから (またはトランクから) バグ修正を行うブランチを作成します。

/your_project
  /trunk
  /branches
    /1.0.0-bugfixes
  /tags
    /1.0.0

このようにすることで、トランクに新しい機能を統合できます。すべてのバグ修正はバグ修正ブランチ内でのみ行われ、各リリースの前に現在のバージョン (現在はバグ修正ブランチから) のタグを作成します。

かなりの量のバグ修正を行って実稼働サーバーにリリースし、現在のトランクにこれらの機能の 1 つがどうしても必要になったと仮定します。

/your_project
  /trunk
  /branches
    /1.0.0-bugfixes
  /tags
    /1.0.0
    /1.0.1
    /1.0.2

これで、1.0.0 と 1.0.2 の間の変更をトランクに統合することができます (作業コピーにいると仮定して)。

svn merge http://rep/your_project/tag/1.0.0 http://rep/your_project/tag/1.0.2 .

これは覚えておくべきことです。1.0.0 と 1.0.2 の間の変更はすでにトランクにマージされています。現在の製品リリースにはさらに変更があると仮定しましょう。

/your_project
  /trunk
  /branches
    /1.0.0-bugfixes
  /tags
    /1.0.0
    /1.0.1
    /1.0.2
    /1.0.3
    /1.0.4

これで、トランクから新しいバージョンをリリースする準備が整いましたが、バグ修正の最後の変更がまだ見つかりません。

svn merge http://rep/your_project/tag/1.0.2 http://rep/your_project/tag/1.0.4 .

今、あなたは持っています 全て 変更がトランクにマージされ、リリースを行うことができます (最初にテストすることを忘れないでください)。

/your_project
  /trunk
  /branches
    /1.0.0-bugfixes
    /1.1.0-bugfixes
  /tags
    /1.0.0
    /1.0.1
    /1.0.2
    /1.0.3
    /1.0.4
    /1.1.0

ここで誰もがすでに言っているように、ブランチは死んでいないので、ブランチへのコミットは問題なく続行できます。

ただし、マージ後にブランチを強制終了したい場合もあります。唯一確実な解決策はブランチを削除することです。欠点は、たとえば歴史的な理由から、ブランチを確認したい場合に、そのブランチを再度見つけるのが難しくなることです。そのため、多くの人は「重要な」ブランチを放置し、変更しないという合意を取り付けたままにします。ブランチをデッド/読み取り専用とマークして、追って通知があるまで誰もそのブランチにコミットできないようにする方法があればいいのにと思います。

いいえ、枝はまだ生きていますが、その時点では幹とまったく同じです。ブランチ上で開発を続ける場合は、後で自由にトランクと再マージできます。

ブランチからトランクへ、またはトランクからブランチへ、何度でもマージできます。

まず、Subversion 1.7 以前をまだ使用している場合は、Subversion クライアントとサーバーをアップグレードする必要があります。非常に古い Subversion リリースを使用する理由はありません。2016 年の現在のバージョンは Subversion 1.9 です。SVN 1.8 も現在サポートされており、引き続きバグ修正が行われています。

あなたが尋ねている問題は、Subversion 1.8 で解決されました。SVN 1.8 以降、 --reintegrate オプションが追加されました 廃止された. 。再統合マージが実行されるようになりました 自動的に. 。見る Subversion 1.8 リリースノートの改善に関するエントリ.

読む svnbook 1.8 |ブランチの再統合:

トランクに再統合した後にブランチを削除しないことを選択した場合、トランクから同期マージを実行し続けてから、再びブランチを再統合することができます。これを行うと、最初の再統合後の枝に加えられた変更のみがトランクに統合されます。

...

Subversion 1.8 のみがこの機能ブランチの再利用をサポートしています。以前のバージョンでは、機能ブランチを複数回再統合する前に、特別な取り扱いが必要です。詳細については、この章の以前のバージョンを参照してください。 http://svnbook.red-bean.com/en/1.7/svn.branchmerge.basicmerging.html#svn.branchemerge.basicmerging.reintegrate

マージを行うときは、ターゲットを指定します。必要に応じて、TreeA と TreeB の相違点を TreeC にマージできます。Chris が示唆しているように、あなたの質問はそれほど意味がありません。ブランチをトランクにマージしても、ブランチはそのまま残ります。後でブランチが必要なくなった場合は、削除できます。

ブランチ上で開発を続けることができます。必要な機能は次のとおりです。 マージトラッキング これは Subversion 1.5 にあります。これは、ブランチからの追加のマージには新しい変更のみが含まれることを意味します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top