Ok heres why you get those nasty borders with linear filtered textures. Nothing to complex, simply that the linear filter interpolates between to texels to make every thing look smooth when texel to pixel isnt one-one, now the problem comes from when it has to intepolate the edge, what value should it use in its calculation if thre isnt a texel in the texture for that picture? I dont know what it does it may use an average of the whole image repeat the edge or something ewse completely. Either way when you have to textures next to each other the edges will be calculated differnetly and hence a visible edge will be seen.
When you turn it to GL_NEAREST, this filtering doesnt happen hance the problem goes away.
One way to get round this would be to put in the border of each texture the corisponding texels from each of its neighbours, a bit of a pain to do but would work. I''m sure there are other ways out the, so look around(sorry I hate it when people post replies saying look around, but well I cant think ofanything else to say and I havent time to look my self).
Well I hope that helps, it may not be techniaccly corect but I hope it gives the meaning of what I Mean

its sunday and writing descent scenteces is a skill I''m lacking.