Mono's C# compiler was forked a few years ago (mid 2003) when we started developing the generic extensions to the language. We did this because the generic specification at the time was still in flux, and this new compiler was sort of a research compiler for us. We did not want to destabilize our production compiler (mcs) with generics at the time, so we kept the new compiler on its own tree (gmcs).
The downside is that ever since, we have had to merge all the improvements and bug fixes done to the generics which required a considerable effort.
Things have luckly changed. The C# generics specification is complete and gmcs is now stable.
This past week Martin and Harinath completed the merging of mcs with gmcs. Now we have a unified source code base, the only place where we have kept the code base divided is the tokenizer and the parser. This is ok, as we are considering writing a hand-written parser instead of the yacc generated parser that we use today.
This effort started because Martin did some major architectural changes in the anonymous method and iterator support.