ブランチをトランクにマージする


125

SVNに特有の問題が発生していmergeます。開発ブランチからトランクにマージしたい。複数の開発ブランチが同時にトランクから切り離されています。

これらのブランチの1つをこのコマンドでトランクにマージしています:

svn merge trunk branch_1

このブランチの一部ではない変更がトランクにマージされているのがわかります。何が悪いのですか?

SVNバージョン:

Subversionコマンドラインクライアント、バージョン1.6.16-SlikSvn-tag-1.6.16@1076804-WIN32。


7
私はこれが答えではないことを知っていますが、同時に複数のアクティブなブランチがある場合は、おそらくmercurialまたはgitに移動した方がいいでしょう。Ps:私は狂信的ではありません、私は〜7年間svnで働いてきました;-)
zerkms

2
それにはどのような利点がありますか?なぜgitまたはmercurialに移行する方が良い選択なのですか?
Vanchinathan Chandrasekaran 2011

3
gitとmercurialはブランチのサポートがはるかに優れているためです。利点:そのような質問をする必要はなく、ブランチの作成と保守の頭痛が少なくなります(現在私は1000以上のブランチを持つプロジェクトで作業しています
。svnではブランチを操作

回答:


215

あなたのsvn merge構文が間違っています。

の作業コピーをチェックアウトしてからtrunk、次のsvn merge --reintegrateオプションを使用します。

$ pwd
/home/user/project-trunk

$ svn update  # (make sure the working copy is up to date)
At revision <N>.

$ svn merge --reintegrate ^/project/branches/branch_1
--- Merging differences between repository URLs into '.':
U    foo.c
U    bar.c
 U   .

$ # build, test, verify, ...

$ svn commit -m "Merge branch_1 back into trunk!"
Sending        .
Sending        foo.c
Sending        bar.c
Transmitting file data ..
Committed revision <N+1>.

詳細については、マージに関するSVNブックの章を参照してください。


それが書かれた時点で、これは正しい答えでした(そして受け入れられました)が、物事は進んでいることに注意してください。topekの回答、およびhttp://subversion.apache.org/docs/release-notes/1.8.html#auto-reintegrateを参照してください


4
--reintegrateオプションは必須ではありません。ブランチ(1.6)は、 任意の先に任意の回数
レイジーアナグマ

1
本当に?同じチェンジセットを再マージするリスクなしで?このことを裏付ける証拠へのリンクを提供してください。
ニュートリノ

--reintegrate確かに必須ではありませんが、この場合は本当に推奨されます。私はそれなし--reintegrateでそれをやろうとしました、そして、何百もの対立に終わりました。を使用する--reintegrateと、競合は発生せず、すべてが良かったです。
tibo

17
--reintegrateオプションは、シンプルかつ効果的であるが、一度」と指摘していないしなければならない--reintegrateマージがブランチからトランクに行われ、分岐はもはやさらなる作業のために使用可能である。それは、新しいトランクの変更を正しく吸収するために、また、それが適切に再統合することができますことができません再びトランクに。」あなたがリンクした本で説明されているように。
ピノ

3
@daveL、トランクからブランチへの前方マージは私には理にかなっています。ただし、「再反復ブランチを存続させる」ための高度な機能を見つけました(stackoverflow.com/a/10163059/685806を参照)。さらに、新しいクライアントバージョンによって自動的に適用されます。
ピノ

78

作業ディレクトリがトランクを指している場合は、ブランチを次のようにマージできます。

svn merge https://HOST/repository/branches/branch_1

トランクのルートディレクトリでこのコマンドを発行してください。


7
SVN 1.8以降。これが正解です。subversion.apache.org/docs/release-notes/…を
GreenAsJade 14

@blahdiblahコードスニペットには多くの無関係な情報が含まれています。調査の要約が、調査の他のどの部分よりも桁違いに多く読まれるのには理由があります。UXテスト、直帰率の最小化なども同様です。すべて同じ原則です。
ahnbizcad 2015年

1.7を使用すると、-reintegrateオプションを使用せずにマージでき、ブランチで開発を続け、マージを続行できます。悲しいことに、1.8はこれを強制的に再統合し、それを防ぐ方法はないようです。これは、マージするとすぐに、恐ろしい「キープアライブダンス」を通過せずにブランチを使用できないことを意味します
John Little

3
マージ後、トランクの作業コピーをリポジトリにコミットすることを忘れないでください!
ジョン

16

トランクでsvn updateを実行し、リビジョン番号をメモします。

トランクから:

svn merge -r<revision where branch was cut>:<revision of trunk> svn://path/to/branch/branchName

svn logを実行すると、ブランチがトランクからどこで切り取られたかを確認できます

svn log --stop-on-copy

同時に存在する複数の開発ブランチがあるため、これも私には機能しませんでした。このコマンドは、他のブランチからの変更も取り込みました。これはSLik SVNクライアントの問題ですか?
Vanchinathan Chandrasekaran、2011

これは不正確ではありませんが、より新しいバージョンsvn(OPが使用しているバージョンなど)とマージする簡単な方法があります。
blahdiblah

@VanchinathanChandrasekaran、コマンドでブランチ名を指定svn://path/to/branch/branchNameすると、そのブランチからの変更のみがプルされ、他のブランチからはプルされません。もしそうなら、私たちは危険にさらされています!
Fredrick Gauss、

1

構文が間違っています。代わりに

svn merge <what(the range)> <from(your dev branch)> <to(trunk/trunk local copy)>
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.