ここの情報は古いです。ご理解頂いた上でお取り扱いください。

Changes between Version 3 and Version 4 of pne-book-9-2


Ignore:
Timestamp:
Feb 15, 2008, 3:21:05 PM (12 years ago)
Author:
imoto
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • pne-book-9-2

    v3 v4  
    11= ブランチとマージ =
     2
     3解説:海老原[[BR]]
     4
     5文:井本
     6 === 概要 ===
     7OpenPNE開発では、SVNを用いてソースコードの管理やバグの修正の管理などを行っています。なかでも、これから紹介するブランチとマージはOpenPNE開発において非常に効率よく開発を進める手段として使っています。
     8
     9そこで、今回は、OpenPNE開発で実際に使われているSVNの使い方をOpenPNEのTracを一部参照しながらブランチとマージを紹介していきます。
     10{{{
     11OpenPNE開発情報
     12http://trac.openpne.jp/
     13}}}
     14
     15 === 目次 ===
     16
     17== OpenPNEのTrac ==
     18 === 概要 ===
     19それではまず、OpenPNEのTracを見てみましょう。[[BR]]
     20OpenPNEのTrac(http://trac.openpne.jp)にアクセスすると、TracのTOP画面に来ます。
     21
     22[[Image(https://trac.openpne.jp/svn/prj/pne-book/pne-book-9/pne-book-9-2/1-trac-top.jpg,650)]]
     23
     24
     25
     26
     27 === root ===
     28次に、上のグローバルメニューから「Browse Source」をクリックすると、Tracで管理されているOpenPNEのソースを見ることが出来ます。(http://trac.openpne.jp/browser)
     29ここはrootディレクトリで一番上にのディレクトリです。
     30このrootディレクトリは、大きく分けて二種類のディレクトリ構成になっています。一つ目がOpenPNE本線開発のディレクトリ(/OpenPNE)で、もう一つはOpenPNE本線開発とはことなるプロジェクトです。(NEKOGET_PNESKIN、PNEMonster)
     31
     32{{{
     33root
     34
     35NEKOGET_PNESKIN
     36OpenPNE
     37OpenPNE_specification
     38PNEMonster
     39prj
     40sandbox
     41smtp2pne
     42work
     43}}}
     44
     45 === root/OpenPNE ===
     46それでは、OpenPNE本線開発のディレクトリを見ていきましょう。[[BR]]
     47OpenPNE以下のディレクトリにはbranches、tags、trunkと3つのディレクトリがあります。まず、一番下にあるtrunkはOpenPNE本線開発のメインディレクトリです。基本的に開発版のリリースはこのtrunkでされます。
     48
     49次に、一番上にあるbranchesですが、直訳すると「枝」です。このbranchesは安定したバージョンの開発や、各個人がもっている機能追加やプロジェクトなどに使われている作業用ディレクトリです。[[BR]]
     50最後に、tagsはOpenPNEの開発でバージョンを固定した場合にこのディレクトリにソースコードを残しておくためのディレクトリです。
     51
     52{{{
     53root/OpenPNE
     54
     55branches
     56tags
     57trunk
     58}}}
     59
     60 === root/OpenPNE/branches ===
     61まず、一番上にある、branchesから見ていきましょう。[[BR]]
     62branchesディレクトリは安定したバージョンの開発や、各個人がもっている機能追加やプロジェクトなどに使われている作業用ディレクトリです。[[BR]]
     63主に三種類のディレクトリがあります。[[BR]]
     64
     65{{{
     66prj:プロジェクトとしてチームで開発するためのディレクトリ
     67stable-x.x.x:安定版のバグ修正などを行うディレクトリ
     68work:個人で行う小さな機能開発を行うディレクトリ
     69}}}
     70
     71prjディレクトリとworkディレクトリは基本的には新しい機能の開発に使われるディレクトリです。[[BR]]
     72具体的にどのようにprjディレクトリとworkディレクトリが使われているか実際のOpenPNE開発事例を参照しながら説明していきます。[[BR]]
     73stable-x.x.xは安定版の機能修正やバグ修正などを行うためのディレクトリです。[[BR]]
     74例えば、stable-2.10.0で何かバグが発見されたとします。するとまず、stable-2.10.xディレクトリで発見されたバグなどを修正します。そして、一通り修正が終わったら、tagsディレクトリ(root/OpenPNE/tags)にソースを移して、stable-2.10.1として正式にリリースされます。[[BR]]
     75この様に、stable-x.x.xディレクトリでは、安定版のバグ修正などを行う一時的なディレクトリとなります。
     76
     77それでは、具体的にどのようにprjディレクトリとworkディレクトリがどの様に使われているか実際のOpenPNE開発事例を参照しながら説明していきます。
     78
     79{{{
     80root/OpenPNE/branches
     81
     82prj
     83stable-2.6.x
     84stable-2.8.x
     85stable-2.10.x
     86work
     87}}}
     88
     89
     90
     91 === root/OpenPNE/branches/prj ===
     92まず、prjディレクトリから見ていきます。[[BR]]
     93現在prjディレクトリには以下のような主要プロジェクトがあります。[[BR]]
     94
     95このprjディレクトリはプロジェクトごとの機能開発に使用されているディレクトリです。ですので、そのプロジェクトに所属しているメンバーであれば基本的に誰でもソースコードを修正することが許されています。
     96
     97現在OpenPNEではOpenIDを外部認証として使うことが出来ます。そのときに開発用ディレクトリとして使用されていたディレクトリがこのprjディレクトリにあるopenidディレクトリです。[[BR]]
     98このopenidのディレクトリのリビジョンを見てもらうと分かると思いますが、ogawa、maruyama、ebiharaなど複数の人でチームを組んでOpenIDの機能開発を行っていたことが分かります。
     99
     100[[Image(https://trac.openpne.jp/svn/prj/pne-book/pne-book-9/pne-book-9-2/2-openid.jpg,650)]]
     101
     102
     103この様に、prjディレクトリは複数人で行う大きな機能追加や機能修正をプロジェクトとしてこのディレクトリで管理しています。
     104
     105{{{
     106root/OpenPNE/branches/prj
     107
     108openid
     109opensocial
     110pne-api
     111slavepne2
     112xhtmlcss
     113
     114
     115
     116}}}
     117
     118 === root/OpenPNE/branches/work ===
     119
     120次に、workディレクトリを見ていきましょう。
     121まず、このディレクトリを見て分かるのは個人名が多いということです。基本的にこのworkディレクトリは個人で行う小さな機能開発を行うディレクトリです。
     122ですので個人が比較的自由にこのディレクトリを使うことが出来るので、小さな機能開発以外にも、OpenPNEで追加してみたい実験的な機能開発や、プロジェクトの機能開発だがprjにソースをマージ(あとで説明)させるほど完成度が高くないソースをここで改良するなどの使い方があります。
     123prjディレクトリにあったxhtmlcssディレクトリはこのworkディレクトリである程度開発したあとで、prjディレクトリに移動したという経緯があります。
     124また、workディレクトリは基本的には各個人のディレクトリですので、他の人がソースを書き換えるということはありません。
     125
     126{{{
     127root/OpenPNE/branches/work
     128
     129ebihara
     130imoto
     131ishida
     132kimura
     133kiwa
     134ogawa
     135
     136
     137
     138}}}
     139
     140例として、work以下のebiharaディレクトリを見てみます。[[BR]]
     141主にebiharaディレクトリでは、プロジェクトに移す前段階でのソースコードを管理しています。ディレクトリのprj_というのは「プロジェクトに移行させるためのディレクトリですよ」ということを表しています。[[BR]]
     142現在はすべてprj_がついたディレクトリ名ですが、個人的にOpenPNEに取り込んで欲しい機能などがあれば分かりやすい機能名のディレクトリを作って開発することもあります。[[BR]]
     143prj_dashboadというディレクトリは主にダッシュボード改善プロジェクトの個人開発用として作ったディレクトリです。ダッシュボード改善プロジェクトというプロジェクトが立ち上がった段階でまず、このebiharaディレクトリにprj_dashboadというディレクトリを作ります。ここである程度ソースコードが完成した段階で、prjにソースコードを移してプロジェクトを進めています。[[BR]]
     144
     145リビジョンを見てもらうと分かると思いますが、ここはebiharaディレクトリで、ebiharaが管理しているので、修正は基本的にebiharaしか行っていません。[[BR]]
     146
     147{{{
     148root/OpenPNE/branches/work/ebihara
     149
     150prj_auth_container_mybox
     151prj_dashboad
     152prj_debug_2_6_7
     153prj_dev26_bizfix
     154prj_dev28_bizfix
     155
     156
     157
     158}}}
     159
     160この様に、prjとworkにはプロジェクトで開発するか個人で開発するかかという大きな特徴があります。
     161この特徴に注目しながらtrac.openpne.jpを見ていただけると、「お!この機能はプロジェクトとして動いてるんだ」「この機能はogawaさんが個人で開発しているけど本線に取り込まれるのかな」などまたOpenPNEの最新の動向と今後の方向性も見えてくるかも知れません。
     162
     163== ブランチ ==
     164 === 概要 ===
     165それでは、OpenPNE開発ではどのようにしてブランチを作っているか、どのような方法でブランチを作っているかを実際にブランチを作りながら紹介します。
     166現在、OpenPNE開発者は主に二種類の方法でブランチを作っています。二種類の方法とは「TortoiseSVNでブランチを作る方法」と「SVNコマンドでブランチを作る方法」です。
     167OpenPNE開発者には、Eclipseなどの開発環境を使っている人もいますし、vimなどを使ってコマンドラインで開発している人もいます。ですので、それぞれに適したブランチの作り方があります。
     168そこでこの章ではWindowsクライアントであるTortoiseSVNでブランチを作る方法とsvnコマンドでブランチを作る方法の二種類の方法を紹介するので、ぜひ環境に合わせて使いやすい方法でブランチを作ってみてください。
     169
     170今回、Subversionの詳しいインストールは割愛しますが、
     171Debian系であればapt-get、CentOS系であれば、yumで取得できると思います。
     172{{{
     173Debian系
     174apt-get install subversion
     175}}}
     176
     177{{{
     178CentOS系
     179yum install subversion
     180}}}
     181詳しくは、マニュアルを参照してください。
     182{{{
     183Debian ユーザ文書
     184http://www.debian.org/doc/index.ja.html
     185
     186CentOS Documentation
     187http://www.centos.org/docs/
     188}}}
     189
     190 === TortoiseSVNでブランチを作る方法 ===
     191  ==== 概要、前提条件(TortoiseSVNのインストール) ====
     192「TortoiseSVNでブランチを作る方法」では、TortoiseSVNというSubversionのWindowsクライアントソフトを使用します。ですので、ここではTortoiseSVNがインストールされていることを前提条件としています。まだインストールをされていない人はTortoiseSVNの日本語翻訳マニュアルがあるのでそちらを参考にしてインストールしてください。
     193
     194{{{
     195TortoiseSVN Subversion クライアント for Windows
     196http://tortoisesvn.net/docs/nightly/TortoiseSVN_ja/index.html
     197}}}
     198
     199  ==== ブランチの作成 ====
     200それでは早速ブランチの作成に入ります。
     201今回はroot/OpenPNE/branches/work/ebihara以下に個人用ブランチを実際に作りながら、説明していきます。
     202
     203{{{
     204root/OpenPNE/branches/work/ebihara
     205
     206prj_auth_container_mybox
     207prj_dashboad
     208prj_debug_2_6_7
     209prj_dev26_bizfix
     210prj_dev28_bizfix
     211
     212
     213
     214}}}
     215
     216
     217例として、ここにOpenPNEグローバル変数改善プロジェクトを作っていくことにします。
     218
     219[[Image(https://trac.openpne.jp/svn/prj/pne-book/pne-book-9/pne-book-9-2/3-drectory.png,650)]]
     220
     221まず、ローカル環境でOpenPNEのソースをコピーしてきたいディレクトリに移動します。[[BR]]
     222次に、そのディレクトリで右クリックして、メニューの中から「Repo-browser」をクリックします。[[BR]]
     223※ディレクトリを移動しなくても右クリックでメニューが出ますが後にその場所にチェックアウト(ソースのダウンロード)することになるので移動しておいたほうがいいと思います。
     224
     225
     226[[Image(https://trac.openpne.jp/svn/prj/pne-book/pne-book-9/pne-book-9-2/4-repo.png,650)]]
     227
     228クリック後に、URLというウィンドウが出てくるので、そのURL欄にSVNのURLを入力します。
     229
     230{{{
     231https://trac.openpne.jp/svn/
     232}}}
     233
     234入力後に「Repository Browser」という新しいウィンドウが開きSVNを見ることが出来る様になります。[[BR]]
     235
     236[[Image(https://trac.openpne.jp/svn/prj/pne-book/pne-book-9/pne-book-9-2/5-repo2.png,650)]]
     237
     238
     239次に、OpenPNEの最新安定版からブランチを作ります。[[BR]]
     240
     241現在OpenPNEプロジェクトでは、タグ(OpenPNE/tags)からブランチを作ることを推奨しているので今回はOpenPNE/tags/stable/OpenPNE-2.10.3からブランチを作ることにします。OpenPNE-2.10.3上で、右クリックをすると、下記の画像のようなメニューが表示されるので、今回は「Copy to...」を選択します。[[BR]]
     242
     243
     244[[Image(https://trac.openpne.jp/svn/prj/pne-book/pne-book-9/pne-book-9-2/6-copy_to.png,650)]]
     245
     246
     247この「Copy to...」を選択したら、「New name:」という入力フォームが出るのでコピー先を指定します。[[BR]]
     248
     249今回は、workディレクトリ以下のebiharaディレクトリに作業用ディレクトリ(prj_remove_globals)を作るので下記のURLを指定して「OK」ボタンを押します。[[BR]]
     250
     251Logが出るのでprj_remove_globalsを追加したメッセージを残します。[[BR]]
     252
     253このログを残したら、prj_remove_globalsディレクトリが作成され、OpenPNE-2.10.3のソースコードがコピーされています。[[BR]]
     254
     255指定したバージョンがコピーされているか不安な場合はwebapp/version.phpを開いてOPENPNE_VERSIONを確認してみるといいと思います。[[BR]]
     256
     257
     258{{{
     259https://trac.openpne.jp/svn/OpenPNE/branches/work/ebihara/prj_remove_globals/
     260}}}
     261
     262[[Image(https://trac.openpne.jp/svn/prj/pne-book/pne-book-9/pne-book-9-2/7-input_url.png,650)]]
     263
     264[[Image(https://trac.openpne.jp/svn/prj/pne-book/pne-book-9/pne-book-9-2/8-url.png,650)]]
     265
     266{{{
     267<?php define('OPENPNE_VERSION', '2.10.3'); ?>
     268}}}
     269
     270
     271  ==== チェックアウト ====
     272これで、SVN上ではブランチを作ることが出来ました。[[BR]]
     273
     274後は、このSVN上にあるソースコードを先ほどのローカルディレクトリに移動してチェックアウトします。[[BR]]
     275
     276チェックアウトとは、 Subversionリポジトリ上で管理されたファイルをローカルファイルに取得する作業のことです。[[BR]]
     277
     278それではチェックアウトしていきます。[[BR]]
     279
     280まず、チェックアウトしたいローカルディレクトリに移動して、右クリックでメニューを表示し、「SVN Checkout...」をクリックします。[[BR]]
     281
     282[[Image(https://trac.openpne.jp/svn/prj/pne-book/pne-book-9/pne-book-9-2/9-checkout_migi.png,650)]]
     283
     284クリックすると、Caeckoutという新しいウィンドウが表示されます。[[BR]]
     285
     286「Repository」の中に「URL of repository」「Checkout directory」とあるので項目を入力します。
     287
     288{{{
     289URL of repository
     290リポジトリのURL
     291例)https://trac.openpne.jp/svn/OpenPNE/branches/work/ebihara/prj_remove_globals/
     292Checkout directory
     293チェックアウトしたいローカルディレクトリ
     294例)\\colinux\co3k\Programming\sns\prj_remove_globals
     295}}}
     296
     297OKを押すと、チェックアウトが始まります。[[BR]]
     298
     299チェックアウトが終了すると、ローカルのprj_remove_globalsディレクトリにソースがコピーされています。
     300あとは、このソースコードを修正などしたりし、コミットすれば、branches/work/ebihara/prj_remove_globals/のソースコードが修正されています。[[BR]]
     301
     302コミットとは作業した結果をリポジトリに登録することです。[[BR]]
     303フォルダ上で右クリックから「SVN Commit...」メニューを選択し、OKを押せば簡単に作業した結果をリポジトリに反映することが出来ます。
     304
     305
     306  ==== コメント ====
     307  この様に、TortoiseSVNを使用することで、GUIで簡単にブランチの作成、チェックアウト、コミットを行うことが出来ます。[[BR]]
     308
     309今回の事例ではcolinuxを使用していますが、XAMPPなどを用いてWindowsで開発している人でもTortoiseSVNを使用することが出来るの非常に導入しやすく、使いやすいツールだと思います。
     310
     311
     312 === SVNコマンドでブランチを作る方法 ===
     313  ==== 概要 ====
     314次に、SVNコマンドでブランチを作る方法を紹介していきます。
     315
     316
     317  ==== ブランチの作成 ====
     318まずは、作業ディレクトリに移動してください。
     319
     320{{{
     321co3k@colinux:~/Programming/sns$
     322}}}
     323
     324
     325次に、SVNのsvn copyコマンドを使ってコピーします。[[BR]]
     326
     327svn copyコマンドは半角スペースの後にSVNのコピー元URL、また半角スペースの後に続けてSVNのコピー先URLを指定します。これで、リポジトリのコピーが完了しました。[[BR]]
     328
     329
     330{{{
     331svn copy SVNのコピー元URL SVNのコピー先URL
     332
     333例)
     334co3k@colinux:~/Programming/sns$ svn copy https://trac.openpne.jp/svn/OpenPNE/tags/stable/OpenPNE-2.10.3/ https://trac.openpne.jp/svn/OpenPNE/branches/work/ebihara/prj_remove_globals/
     335}}}
     336
     337
     338  ==== チェックアウト ====
     339次に、リポジトリのソースをローカルにチェックアウトします。
     340先ほどはcopyコマンドを使いましたが、チェックアウトはcheckoutコマンドを使用します。チェックアウトしたいディレクトリに移動して、チェックアウトコマンドを実行するだけでそのディレクトリにチェックアウトすることが出来ます。
     341
     342{{{
     343svn checkout SVNのリポジトリURL
     344
     345例)
     346co3k@colinux:~/Programming/sns/ $ svn co https://trac.openpne.jp/svn/OpenPNE/branches/work/ebihara/prj_remove_globals/ prj_remove_globals
     347}}}
     348
     349  ==== コマンドの説明 ====
     350
     351SVNにはsvnコマンドと呼ばれるさまざまコマンドがあります。
     352詳しくはSVNのヘルプを参照してください。
     353SVNのコマンドヘルプ
     354{{{
     355svn --help
     356}}}
     357
     358SVNのコピーコマンドヘルプ
     359
     360{{{
     361svn copy --help
     362}}}
     363
     364
     365  ==== コメント ====
     366
     367SVNコマンドでブランチを作る方法は非常にシンプルでコマンドを覚えればすばやくブランチを作ったりチェックアウトすることが可能になります。[[BR]]
     368普段vimなどで開発している人はsvnコマンドを使う方が効率が上がると思います。
     369実際、OpenPNE開発者はsvnコマンドを使っている人が多くいます。
     370 
     371== マージ ==
     372 === 概要 ===
     373
     374マージする方法を説明していきます。[[BR]]
     375
     376マージは直訳すると、「合併する」「融合する」といった意味がありますが、ここでは、ソースコードとソースコードを融合させることをいいます。[[BR]]
     377基本的には、先ほどブランチとしてtrunkから派生させたコードをまたtrunkに融合させるという作業をOpenPNEでは使っています。しかし、マージはその他にもさまざまな使い方があります。[[BR]]
     378例えば、2.10.0から派生した個人作業ディレクトリのブランチでのんびり機能追加を開発していたが、trunkが2.11.6になっていたときに、その追加機能をtrunkに取り込んでも動かないということがないように、ある程度trunkの開発が進んだときに、個人作業ディレクトリにtrunkをマージさせておけばtrunkにマージさせたときに現在のtrunkのバージョンと相性が悪いから動かないということがなくなります。
     379
     380マージは基本的に、あるリビジョンからあるリビジョンでの変更箇所を取り込む作業になります。ファイルをそれぞれ変更するのではなく、修正されている箇所だけ取り込むという作業です。
     381
     382それでは、ブランチと同じく、「TortoiseSVNでマージする方法」と「SVNコマンドでマージする方法」の2種類を紹介します。[[BR]]
     383マージにはさまざまな種類がありますが、ここでのマージは、個人のローカル作業用ディレクトリにTrunkの変更箇所をマージする方法を紹介します。
     384
     385 === TortoiseSVNでマージする方法 ===
     386  ==== 概要 ====
     387  ==== マージ ====
     388まず、TortoiseSVNでマージする方法ですが、先ほどのブランチでの使い方同様TortoiseSVNのメニューは右クリックをすることでメニューを開くことが出来ます。
     389今回はマージさせたいディレクトリの上で、右クリックをし、「TortoiseSVN」を選択し「Merge...」を選択します。
     390
     391[[Image(https://trac.openpne.jp/svn/prj/pne-book/pne-book-9/pne-book-9-2/11-merge_migi.png,650)]]
     392
     393「Merge...」を選択したらMergeウィンドウが表示されます。
     394マージをする上で一番分かりにくい点は、このFromとToだと思います。先ほど、「マージは基本的に、あるリビジョンからあるリビジョンでの変更箇所を取り込む作業」の述べましたが、それがここと一致します。このFromとToの間で変更された箇所を取り込みます。URLには、取り込みたい先のリビジョンのURLを指定します。
     395
     396{{{
     397From:マージしたい範囲の最初のリビジョン
     398To:マージしたい範囲の最後のリビジョン
     399}}}
     400
     401[[Image(https://trac.openpne.jp/svn/prj/pne-book/pne-book-9/pne-book-9-2/12-merge.png,650)]]
     402
     403この様にFromとTo指定して、Mergeを押すだけで、そのリビジョン間の変更箇所がローカルの作業ディレクトリにマージされます。
     404
     405ここで悩む人が多いのが一箇所の変更です。一箇所のリビジョンを変更したいときは、その前のリビジョンから変更したいリビジョンをFromとTo指定に指定します。
     406例えば、リビジョン5115の修正を取り込みたいときは、画像のように、
     407{{{
     408From:5114
     409To:5115
     410}}}
     411
     412
     413[[Image(https://trac.openpne.jp/svn/prj/pne-book/pne-book-9/pne-book-9-2/13-merge2.png,650)]]
     414
     415
     416
     417
     418 === SVNコマンドでマージする方法 ===
     419  ==== 概要 ====
     420  SVNコマンドでマージする方法を紹介していきます。[[BR]]
     421  それではTortoiseSVNと同じように、リビジョンを指定して変更箇所をローカルの開発ディレクトリにマージしていきます。
     422
     423  ==== マージ ====
     424
     425まずは、作業ディレクトリに移動してください。
     426
     427{{{
     428co3k@colinux:~/Programming/sns$
     429}}}
     430
     431
     432次に、SVNのsvn mergeコマンドを使ってマージします。[[BR]]
     433
     434svn mergeコマンドは下記のように指定します。この-rオプションというのはリビジョン指定をするときには必要なので忘れない様に注意が必要です。[[BR]]
     435この例を解説すると、trunkの5114から5115の変更点をローカルのprj_remove_globalsディレクトリにマージするという意味になります。
     436
     437{{{
     438svn merge -r 最初のリビジョン:最後のリビジョン SVNのURL マージ先のローカルディレクトリ名
     439
     440例)
     441co3k@colinux:~/Programming/sns$ merge -r 5114:5115 https://trac.openpne.jp/svn/OpenPNE/trunk/ prj_remove_globals
     442}}}
     443
     444
     445
     446 === 逆マージ ===
     447  ==== 概要 ====
     448逆マージとはマージの逆をすることで、SVNで誤った操作などをしたときに修正する方法です。[[BR]]
     449なぜ、削除ではなく逆マージをするのかというと、記録を残すためです。誰が何をどう変更したかという記録を残すために修正も逆マージをして誰が修正したのかということをログとして残します。[[BR]]
     450ここでは、TortoiseSVNを用いた逆マージを紹介します。
     451  ==== マージ====
     452
     453
     454マージをするときに、「マージは基本的に、あるリビジョンからあるリビジョンでの変更箇所を取り込む作業」と説明しましたが、このマージの性質を利用して逆マージを行います。[[BR]]
     455逆マージは、FromとToのリビジョンを変えるだけです。[[BR]]
     456先ほどのリビジョン5115のマージを失敗して違うところにマージしてしまったというときには。先ほどは、Fromを5114、Toを5115にしていましたが、逆マージはその逆のリビジョンを指定します。
     457
     458{{{
     459From:5115
     460To:5114
     461}}}
     462
     463この様に、FromとToを逆に指定するだけで、失敗などを取り消す逆マージをすることが出来ます。[[BR]]
     464また、svnコマンドを使用した場合の逆マージも同じくFromとToを逆に指定するだけで逆マージをすることが出来ます。
     465
     466(画像 逆マージ)
     467
     468
     469
     470 === tags間でのマージ ===
     471  ==== 概要 ====
     472  その他にも、OpenPNE開発でよく使われるのがtags間でのマージです。[[BR]]
     473  簡単にバージョンアップをすることが出来て、便利な機能です。[[BR]]
     474
     475    例えば、ローカルの開発環境にあるOpenPNE-2.10.3をOpenPNE-2.10.4にバージョンアップしたいときに使用すると、非常に簡単にバージョンを上げることが出来ます。[[BR]]
     476  それでは実際にOpenPNE-2.10.3をOpenPNE-2.10.4にバージョンアップする方法を見ていきましょう。
     477
     478  ==== マージ ====
     479  これまでのマージと同じように、マージしたいディレクトリ上で右クリックしてメニューをだし、Margeウィンドウを出してください。[[BR]]
     480  先ほどまでは、リビジョンを指定していましたが、このtags間でのリビジョンは基本的にHEAD Rebisionです。ですので、ラジオボタンがRebisionに指定されている場合はFrom、To共にHEAD Rebisionに変更してください。[[BR]]
     481  そして、次にURLですが、Fromに前のバージョンのURLを指定し、Toに更新したいバージョンのURLを指定します。[[BR]]
     482  あとは、普通のマージと同じで、「Merge」ボタンでマージしてください。[[BR]]
     483
     484  このとき、Toの「Use"From:"URL(revision range is selectable in the above log dialog)」というチェックボックスが外れていないと、URLを入力できないので注意が必要です。
     485 
     486{{{
     487例)
     488From:https://trac.openpne.jp/svn/OpenPNE/tags/stable/OpenPNE-2.10.3/
     489To:https://trac.openpne.jp/svn/OpenPNE/tags/stable/OpenPNE-2.10.4/
     490}}}
     491
     492
     493[[Image(https://trac.openpne.jp/svn/prj/pne-book/pne-book-9/pne-book-9-2/14-merge_tags.png,650)]]
     494
     495== まとめ ==