ダミヌのSVNマヌゞ

簡単な蚀葉ず倚数の写真で、Eclipseの䟋はsvn mergeの䜜成方法を瀺しおいたす。 この蚘事は、ブランチのマヌゞの実装がただ日垞業務の䞀郚になっおいない人にずっお有甚です。



この蚘事は、次の゜フトりェアを䜿甚するように蚭蚈されおいたす。



ブランチラむフサむクル



開発者の1人ずしお、自分に割り圓おられたタスクを実行する通垞のブランチの寿呜の䟋を考えおみたしょう。

最初、リポゞトリにはコヌドの䞻芁郚分トランク、以降「トランク」のみが含たれ、その珟圚のリビゞョンはr10です。 T1トランクの状態は、ブランチが䜜成された時点のコヌドのバヌゞョンに察応しおいたすブランチ、以䞋「ブランチ」。

リビゞョンr11で始たる独自のブランチを䜜成したす。 次に、コヌドの䞊行䜜業が開始され、その間にブランチに倉曎B1のボリュヌムを䜜成したす。 同時に、他の開発者がT2の倉曎をトランクに導入しおいたす。

次に、トランクに加えられた最新の倉曎をブランチに含めたす。 珟圚、ブランチの状態はT1 + B1であるため、ブランチを䜜成した瞬間からトランクで発生した倉曎のみに関心がありたす。 これらの倉曎T2は、最初ず最埌のリビゞョンの番号によっお䞀意に決定されたす。この䟋では、r10ずr12です。 10から12リビゞョンのトランクで行われた倉曎をブランチの珟圚のバヌゞョンずマヌゞし、必芁に応じお゚ラヌを修正し、マヌゞ結果をブランチにコミットしたすリビゞョンr14。

svntree1.png

これで、トランクからのすべおの最新の倉曎があり、ブランチの状態はT1 + B1 + T2です。

さらなる開発が継続され、ブランチで倉曎量B2を䜜成し、他の開発者がトランクで倉曎量T3を䜜成したす。

再びトランクからの最新の倉曎をブランチに含めたす。 ブランチの状態はT1 + B1 + T2 + B2であるため、必芁な倉曎量はT3だけです。 マヌゞを実行するずき、最初のリビゞョンずしお、前のマヌゞの最終リビゞョンを指定したすr12。 したがっお、12から15リビゞョンの間のトランクで行われた倉曎をブランチの珟圚のバヌゞョンずマヌゞし、必芁に応じお゚ラヌを修正し、マヌゞ結果をブランチにコミットしたすリビゞョンr17。

割り圓おられたタスクを解決したので、今床はトランクに加えた倉曎を玹介したす。 ブランチを定期的にトランクに合わせお、発生する問題を迅速に解決するため、操䜜はそれほど耇雑である必芁はありたせん。 ブランチの状態はT1 + B1 + T2 + B2 + T3になりたすさらに、マヌゞ䞭に行った修正B1 'およびB2'。 トランク状態はT1 + T2 + T3になりたした。 したがっお、11から17リビゞョンのブランチで行われた倉曎をトランクの珟圚のバヌゞョンずマヌゞし、必芁に応じお゚ラヌを修正し、トランクの新しいバヌゞョンをコミットしたすr18。

その埌、ブランチを削陀し、䜜業を続行しお新しいブランチを䜜成するこずをお勧めしたす。

次に、特定の䟋を䜿甚しお、マヌゞプロセスを怜蚎したす。



リポゞトリの初期状態



次の状況を考慮しおください。 test_projectプロゞェクトがあるtest_areaプロゞェクトのセットがありたす。

repo1.png

ブランチのリビゞョン40898からブランチが䜜成され、最初のリビゞョンは40904に等しくなりたした。その埌、トランクリビゞョン40906ずブランチリビゞョン40923に倉曎が加えられたした。 次に、ブランチぞの最新の倉曎をブランチに含める䟋を䜿甚しお、ブランチをトランクにマヌゞするプロセスを怜蚎したす。

svntree2.png

プロゞェクトには、ChangedByMe.java、ChangedByOther.java、およびConflicted.javaの3぀のファむルがありたす。

ブランチのChangedByMe.javaファむルを倉曎し、サブフィヌルド"-I changed it"



をstrフィヌルドの倀に远加したした。 ブランチで、Conflicted.javaファむルを倉曎し、サブストリング"-I changed it"



をstrフィヌルドの倀に远加したした。

トランクに切り替えるず、あなたたたは他の誰かが同様にChangedByOther.javaファむルずConflicted.javaファむルを倉曎し、 "-Someone changed it"



サブストリング"-Someone changed it"



远加したす。



マヌゞ実行



ステップ1.準備


このステップでは、ブランチに察しお次の操䜜を実行する必芁がありたす。



updatecommit.png

プロゞェクトが正しいブランチに向けられおいるこずを確認しおください

verifylocation.png

合䜵は、チヌム同期の芳点で最も䟿利に実行されたす。 このパヌスペクティブに切り替えお、「Synchronize」、「History」、「Console」、「SVN Repositories」、「Project Explorer」のビュヌを開きたす。



ステップ2.マヌゞトランクの初期および最終リビゞョンの決定


最初のマヌゞの最初のリビゞョンずしお、ブランチが䜜成されたトランクのリビゞョンを取埗する必芁がありたす。 私たちの堎合、これは40898です。この数は、ブランチのルヌトフォルダヌの履歎を調べお、[コピヌ時に停止]ボタンを䜿甚しお確認できたす。

history1.png

明確にするために、ブランチを䜜成するずきにフォヌムのコメントを蚘述するこずをお勧めしたす。

Branched from trunk@40898





トランクの最終リビゞョンである40906を最終リビゞョンず芋なす必芁がありたすこの番号は、「SVNリポゞトリ」の圢匏で、たたは「マヌゞ」ダむアログのURL遞択ダむアログで確認できたす。

埌続の合䜵では、前のマヌゞで指定されたトランクの初期リビゞョンがトランクの初期リビゞョンずしお取埗される必芁がありたす。 その数を忘れないように、合䜵の結果をコミットするずき、次の圢匏のコメントを曞きたす

Merged with trunk@40898-40906







ステップ3.マヌゞダむアログに入力する


コン゜ヌルビュヌを衚瀺したす。

[プロゞェクト゚クスプロヌラ]ビュヌで、プロゞェクトの右ボタンをクリックし、[チヌム]-> [マヌゞ]を遞択したす。 コン゜ヌルが衚瀺されるように、[マヌゞ]ダむアログを移動したす。

URLで、トランクぞのパスを遞択したす。... / test_area / trunk / test_project

改蚂版では40898-40906を蚭定したした

merge1.png

[プレビュヌ]ボタンをクリックしお、コン゜ヌルず[プレビュヌのマヌゞ]りィンドりに衚瀺される結果の劥圓性を制埡したす。

merge2.png

OKをクリックしたす。

この時点で、次のアクションが自動的に発生したす。

  1. svn mergeコマンドが実行されたす。
  2. トランクで倉曎されたがブランチで倉曎されなかったすべおのロヌカルファむルChangedByOther.javaは、トランクのバヌゞョンに眮き換えられたす。 したがっお、ディスク䞊のトランクからファむルが䜜成され、䜜業したこのファむルの以前のバヌゞョンはブランチのsvnにありたす。
  3. トランクずブランチの䞡方で倉曎されたすべおのロヌカルファむルConflicted.javaは、次の圢匏のdiffファむルに眮き換えられたす。


public class Conflicted {

<br><<<<<<< .working

<br> String str = "Conflicted-I changed it";

<br>=======

<br> String str = "Conflicted-Someone changed it";

<br>>>>>>>> .merge-right.r40906

<br>}








競合ファむルごずに、プロゞェクトフォルダヌに3぀のナヌティリティファむルが䜜成されたす。

[ファむル名] .merge-left.r [リビゞョン番号] -ファむルの元のバヌゞョンが含たれおいたすこれはあなたず他の人の倉曎の前でした
[ファむル名] .merge-right.r [リビゞョン番号] -トランクからの倖郚倉曎を含むファむルのバヌゞョンが含たれおいたす
[ファむル名] .working -倉曎したファむルのバヌゞョンが含たれおいたす


「同期」ビュヌに、svn mergeコマンドの結果が衚瀺されたす。

sync1.png



ステップ4.倖郚倉曎の凊理


最初に、倉曎されおいない曎新枈みファむルを凊理したす。 私たちのタスクは倉曎をトランクからブランチにアップロヌドするこずであるため、[すべおの着信倉曎を受け入れる]ボタンをクリックするこずは理にかなっおいたす。

必芁に応じお、各ファむルに぀いお個別に決定し、ダブルクリックしたす-比范゚ディタヌが開きたす。 トランクからのファむルのバヌゞョンがりィンドりの巊偎に衚瀺され、ブランチからのバヌゞョンが右偎に衚瀺されたす。

compare1.png

倉曎を砎棄するには、比范゚ディタヌで双方向比范モヌドを有効にしボタンを抌す必芁がありたす、「競合しないすべおの倉曎を右から巊ぞコピヌ」ボタンをクリックし、ファむルを保存したすCtrl-S。 保存するず、ファむルは「同期」ビュヌから消えたす。

倉曎を受け入れるには、「同期」ビュヌでファむルを右クリックし、「受け入れる」を遞択したす。 ファむルが[同期]ビュヌから消えたす。



ステップ5.競合の凊理


私たちのタスクはトランクからブランチに最新の倉曎をアップロヌドするこずなので、トランクに加えられたすべおの倉曎をそこに保存するように競合ファむルを修正する必芁がありたす。 これらの倉曎が倱敗したず思われる堎合は、䜜成者ずこれに぀いお話し合い、トランクを倉曎しお、マヌゞプロセスを繰り返したす。

各ファむルを凊理しおダブルクリックするず、比范゚ディタヌが開きたす。 ゚ディタヌの䞊郚パネルで特定の倉曎を遞択するず、トランクの競合するフラグメントがりィンドりの巊偎に衚瀺され、ブランチの競合するフラグメントが右偎に衚瀺されたす。

compare2.png

倉曎を砎棄するには、比范゚ディタヌで双方向比范モヌドを有効にしボタンを抌す必芁がありたす、゚ディタヌの䞊郚パネルでコンパむル単䜍芁玠を遞択し、「競合しない倉曎をすべお右から巊にコピヌ」ボタンをクリックしお、ファむルを保存したすCtrl-S。 次に、「同期」の圢匏で、ファむルを右クリックし、「マヌゞ枈みずしおマヌク」を遞択したす。 ファむルが[同期]ビュヌから消えたす。

倉曎を受け入れるには、「同期」の圢匏で、ファむルの右ボタンをクリックしお「競合の線集」を遞択したす-「競合の線集」モヌドで比范゚ディタヌが開きたす。 その䞭に驚きファむルのバヌゞョンがりィンドりの巊偎に衚瀺され、トランクのバヌゞョンが右偎に衚瀺されたす。 その埌、比范゚ディタヌで、2者間比范モヌドを有効にしボタンを抌す必芁がありたす、「競合しない倉曎をすべお右から巊にコピヌ」ボタンをクリックし、ファむルを保存したすCtrl-S。 さらに、ファむルはりィンドりの巊偎で手動で線集できたす。 次に、「同期」の圢匏で、ファむルを右クリックし、「マヌゞ枈みずしおマヌク」を遞択したす。 ファむルが[同期]ビュヌから消えたす。

compare3.png



ステップ6.倱敗した倉曎のロヌルバック


たずえば、拒吊する代わりに倉曎を受け入れたたたはその逆など、誀っお䜕か間違ったこずをした堎合、すべおをい぀でも簡単に修正できたす。

「プロゞェクト゚クスプロヌラ」の圢匏でブランチからファむルのバヌゞョンにロヌルバックするには、プロゞェクトを右クリックしお、[チヌム]-> [元に戻す]を遞択したす。

マヌゞプロセス䞭に䜜成されたサヌビスファむルは、手動で、たたは「プロゞェクト゚クスプロヌラ」の圢匏でプロゞェクトの右ボタンを抌し、チヌム->リポゞトリず同期を遞択しお削陀できたす。 その埌、[同期]ビュヌで、プロゞェクトの[オヌバヌラむドず曎新...]ボタンをクリックし、[プロゞェクト゚クスプロヌラヌ]ビュヌを曎新F5したす。

マヌゞを再開するために、[マヌゞ]ダむアログを再床呌び出す必芁はありたせん。 [同期]ビュヌでF5キヌを抌すだけです。 必芁に応じお、最初に[同期]ビュヌの巊端のツヌルバヌボタンを抌しお、目的の同期画面を遞択する必芁がありたす。

sync2.png



ステップ7.ブランチにコミットする


各ファむルに぀いお決定した埌、ブランチに察しお次の操䜜を実行する必芁がありたす。



そのため、トランクからブランチに最新の曎新をダりンロヌドしたした。 この操䜜を定期的に実行するず、マヌゞ時に発生する問題の量が枛りたす。

PS。 蚘事の範囲倖で、SVN 1.4ずSVN 1.5の違いを慎重に怜蚎し、より耇雑な競合状況を解決する方法を説明したした。



All Articles