Bazzar の Push と Merge
良いスレ(【bzr】Bazaarでバージョン管理 Rev 2)があって、pushとMergeの解りやすい説明があったからコピペ。
180 :デフォルトの名無しさん:2010/05/12(水) 01:40:55 コミットログとpullの動作で質問 共有リポジトリにtrunkブランチをinitして、 そのtrunkを異なる3つのフォルダに落とす。 dir:work_T => trunkログ確認用。 dir:work_A => あるファイルを変更 dir:work_B => work_Aで触っていない別のファイルを変更 として、AとBをpushしたら、work_Aのコミットログが消えました。 すぐ試せるコマンド書くんで、自分がおかしいのかbazaarがおかしいのか(仕様)なのか 教えてください。 (改行多いので次のカキコ) 181 :デフォルトの名無しさん:2010/05/12(水) 01:45:18 mkdir sb cd sb bzr init-repo --no-trees PROJECT bzr init PROJECT/trunk bzr branch PROJECT/trunk work_T bzr branch PROJECT/trunk work_A bzr branch PROJECT/trunk work_B cd work_T echo "A" > txt_A.txt echo "B" > txt_B.txt bzr add bzr commit -m "init." bzr push ../PROJECT/trunk cd ../work_A bzr pull cd ../work_B bzr pull cd ../work_A echo "AA" > txt_A.txt bzr commit -m "this is work_A rev2 commit" bzr push ../PROJECT/trunk 182 :デフォルトの名無しさん:2010/05/12(水) 01:47:24 cd ../work_T bzr pull echo "ここでthis is work_Aのログはあるが、work_Bを取り込んだ後だと無い" bzr log cd ../work_B echo "BB" > txt_B.txt bzr commit -m "this is work_B rev2 commit" bzr push ../PROJECT/trunk bzr merge --pull bzr commit -m "this is work_B rev2 diverged-branches => merge --pull => push" bzr push ../PROJECT/trunk cd ../work_T bzr pull echo "ここでthis is work_Aのログが無い" bzr log type txt_A.txt type txt_B.txt 183 :デフォルトの名無しさん:2010/05/12(水) 07:59:21 >>180 仕様だよ。 merge --pullを実行してるけど、これは、「pullできる時はpullして、できない時はmergeするよ」、という意味。 今回はpullはできない状況だから、mergeが実行されている。 mergeした後にcommitすると、途中で枝分かれして再統合された形のログになる。 今回の場合ならこんな感じのログになっているはず。this is work_Aのリビジョンは消えたわけじゃなく、 枝分かれした先に存在している。 3 this is work_B rev2 diverged-branches => merge --pull => push 2 this is work_B rev2 commit 1.1.1 this is work_A rev2 commit 1 init. bzr logだと、履歴のメインラインしか表示しないので、this is work_Aのリビジョンは表示されない。 かわりに、bzr log -n 0とオプションをつけるか、bzr qlogを使えばいい。 ちなみに、pullとmergeについては、Mercurialの場合とコマンドの位置づけが違うので、Mercurialを 知ってるとかえって混乱するらしい。オレはMercurialは使ってないから詳しくは分からないけど。 184 :180:2010/05/13(木) 00:12:32 >>183 ありがと!一つだけわからないことが。 >今回はpullはできない状況だから、mergeが実行されている。 これは、直前にpushして送ろうとしたらエラーになったから、 pullをしたんだけど、 work_Aではtxt_Aを編集 work_Bではtxt_Bを編集したんだから、 互いの修正ファイルがかぶってないからpush出来てよさそうなんだけど、 だめなの? 185 :デフォルトの名無しさん:2010/05/13(木) 23:51:35 >>184 だめ。 修正ファイルがかぶってるかどうかは関係なくて、履歴が分岐してしまった時点でpullはできなくなる。 (手元のブランチにしかないリビジョンがある場合はpullできない) rebaseコマンドを使えば、枝分かれした履歴を無理やり分岐の無い形にまとめることもできるけど、 特に理由が無ければ素直にmergeを使えばいいと思うよ。 ブランチXの履歴が A→B→C、ブランチYの履歴がA→B→D→E だとして、Yの変更をXに取り込みたい 場合、普通はmergeを使ってこういう履歴にするんだけど、 C −− F / / A−B−D−E rebaseを使ってこういう履歴を作ることもできますよ、ってこと。 A−B−D−E−C 186 :180:2010/05/17(月) 01:09:01 >>185 なるほどよくわかりました、ありがとう! mregeを使った方が理解しやすいですね。