[Mercurial] このマージいらなくないか?

Android アプリ開発では Mercurial を使用しています。
二人で開発しているときに感じるのが「このマージいらなくないか?」ってことです。



作業者Aが作業開始をして中央リポジトリーを作成しました。
作業者Bが中央リポジトリーからローカルにcloneしました。

作業者AはファイルAを更新しています。
作業者BはファイルBを追加、更新しています。

作業者Aは自分の作業が完了するまで中央リポジトリにはプッシュしませんでした。
作業者Bはローカルにコミットする度に中央リポジトリにプッシュします。

作業者Aが中央リポジトリにプッシュしようとしたら失敗しました。
中央リポジトリから pull して merge します。merge したら commit して・・・
さぁ push しよう!としたら、またプッシュできませんでした。
原因は作業者Bが新しいチェンジセットを中央リポジトリにpushしていたためです。

作業者Aは中央リポジトリから pull して merge して commit して・・・
ようやく中央リポジトリへの push ができました。

このマージ作業必要?作業者Aと作業者Bはまったく関係ないファイルを更新してるんだけど・・・このマージっていう履歴必要?

コンソールで見るとこんなかんじ

特に問題は無いんです。これでもいいんです。不具合がなければそれでいいんです。

今回の例ではマージを2回行いました。この2回やる必要はなかったんじゃないか?とおもいます。

じゃぁどうする?は、別記事で書こうと思います。

これがいい!っていう答えはもってませんのでお許し下さい。

こういうふうにすれば?という情報をお持ちの方はぜひコメントでお知らせください。
飛び跳ねて喜びます。見えないと思いますがw

2 件のコメント:

  1. ファイル単位でしか履歴管理していない CVS などと異なり、Mercurial
    では『ある時点での管理対象ファイルのスナップショット』を管理してい
    ます。

    内部的には、主にリビジョン間の差分を管理しているので、この単位を
    『チェンジセット』とも呼びますが、内部実装上は差分データの格納を主
    体に実現されている、というだけで、あくまでコンセプトとしては『ある
    時点での管理対象ファイルのスナップショット』の管理になります。

    2つのリビジョンをマージする場合、マージ実施リビジョンでは、管理下
    にある各ファイル毎に、マージ対象リビジョンのどちらの内容を反映させ
    るのか?あるいは全く別の第3の内容に改変するのか?ということを記録
    する必要あります。

    そのため、一見無駄なように見えても、マージリビジョンは必要なのです。

    個人的には、履歴が 100 を超えたあたりから、"hg log" 出力は『全部を
    見る』ものから、『条件指定で抽出した結果を見る』ものに感覚がシフト
    します。

    例えば:

    - "hg log -M": マージ以外のリビジョンを表示
    - "hg log -M foo/bar": foo/bar 配下のファイルのマージ以外のリビジョン
    - "hg log -b hoge -M": 名前付きブランチ hoge のマージ以外のリビジョン

    みたいな感じですね。

    どうしても『マージリビジョンを作りたくない』のであれば、rebase や
    MQ といったエクステンションの利用を検討してみては如何でしょうか?

    返信削除
    返信
    1. コメントありがとうございます。

      マージ以外のリビジョンを表示・・・っていうことができたんですね^^

      マージリビジョンを作りたくないというよりは、履歴を見た時に「マージしました」とかいうのが鬱陶しく感じてたので、マージする回数を減らせばいいんじゃないかな?なんて思ってました。

      履歴の見方を考えたほうが気が楽になれそうです。

      ありがとうございます。

      削除