msgmerge を使って現在のブランチにある po/ja.po の内容を先ほど取り出したファイル po/ja.po.c6c3015 のエントリで置き換えて、po/ja.po.new に出力する。つまり po/ja.po に含まれる msgid に対する msgstr を po/ja.po.c6c3015 から探し出して、見つかった場合は po/ja.po の msgstr を po/ja.po.c6c3015 のもので置き換えて po/ja.po.new に出力される。また、 po/ja.po.c6c3015 に含まれて po/ja.po に含まれない msgid は obsolete #~ message として po/ja.po.new に出力される。なお、msgid のマッチングは完全一致ではなくfuzzyマッチングなので、これを抑制したい場合は --no-fuzzy-matching を使う。
$ msgmerge -o po/ja.po.new po/ja.po.c6c3015 po/ja.po ................................................................................................................................................................................................................. done. $ msgmerge --no-fuzzy-matching -o po/ja.po.new po/ja.po.c6c3015 po/ja.po
出力された po/ja.po.new には obsolete #~ message が含まれる。これを削除したいわけだが、これらの中には先に述べた po/ja.po.c6c3015 に含まれて po/ja.po に含まれない msgid のほかに、po/ja.po.c6c3015 や po/ja.po で obsolete #~ message だったものも含まれる。まずは msgattrib --only-obsolete を使って元の 2 ファイルに obsolete #~ message が含まれているかを確認すると、含まれていなかったことが分かる。つまり、po/ja.po.new に含まれる obsolete #~ message はすべて po/ja.po.c6c3015 に含まれて po/ja.po に含まれない msgid ということだ。現在のブランチにある po/ja.po には obsolete #~ message がなかったということなので、po/ja.po.new に含まれる obsolete #~ message は削除して、po/ja.po.new2 に出力する。
$ msgattrib --only-obsolete po/ja.po $ msgattrib --only-obsolete po/ja.po.c6c3015 $ msgattrib --no-obsolete -o po/ja.po.new2 po/ja.po.new
現在のブランチにある po/ja.po がマージ作業で正しく po/ja.po.new2 に更新できたか最終的に確認した後、po/ja.po を po/ja.po.new2 で置き換える。
$ vimdiff po/ja.po po/ja.po.new2 $ diff po/ja.po po/ja.po.new2 | vim -R - $ cat po/ja.po.new2 > po/ja.po