at_yasu's blog

ロード的なことを

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を使った方が理解しやすいですね。