前秦在淝水吃了败仗,北方又陷入一片混乱,太元九年(384)八月,晋太保谢安向皇帝司马曜建议道:“前秦正在土崩瓦解,我们应该抓住有利时机,出师北伐,收复中原失地,继而一统天下。”
司马曜一听很兴奋,当即同意,并任命谢安为都督扬、江、荆、司、豫、徐、兖、青、冀、幽、并、宁、益、雍、梁十五州诸军事,加黄钺,其他官职照旧。东晋当时一共控制着十七个州,谢安一个人就管着十五个州的军事,可以说司马曜是把全国的军队都交给谢安调度了,他对谢安是无比信任的。谢安上书请求辞掉自己的爵位和太保之职,司马曜不许。
之前二月份的时候桓冲去世,当时朝廷内就有声音说应该让谢玄任荆州和江州的刺史,但谢安不同意。他主要有两点顾虑,一是他和侄儿权力都太大的话,会引起朝中人的嫉妒,继而就会引祸入家门;二是经营荆州多年的桓家一旦失去荆州,可能会生乱。于是在谢安的建议下,朝廷任命桓石民(桓豁之子)为荆州刺史,桓石虔(桓豁之子)为豫州刺史,原豫州刺史桓伊为江州刺史。
现在谢安掌管全国军事大权,任命谢玄为前锋都督,率豫州刺史桓石虏北伐。前秦的徐州刺史赵迁听说谢玄率军来伐,不战而逃,谢玄顺利进入彭城。
九月,谢玄命手下大将彭城内史刘牢之率军攻打前秦兖州刺史张崇守卫的鄄城。九月十一日,张崇弃城而逃,前去投奔后燕慕容垂,刘牢之进入鄄城。听闻消息,黄河以南的各城池、坞堡纷纷投降东晋。
谢玄又派阴陵太守高素率军攻打前秦青州刺史苻朗据守的广固城。高素的军队刚抵达琅琊郡,距离广固还有一段距离的时候,慑于晋军的声威,苻朗就已经赶过来投降了。
后燕军刚走,晋军又到,苻丕派人到晋阳征召骠骑将军张蚝、并州刺史王腾来增援自己,但张蚝、王腾因为自身部队人数不多,没有派兵。
苻丕上天无路入地无门,赶紧召集幕僚商议对策。他麾下的司马杨膺说道:“为今之计,投降晋是为上策。”苻丕不同意,连连说:“再想别的对策,再想别的对策。”
正在这时候,苻丕得到了谢玄派刘牢之占据碻磝(qiāo áo),派郭满占据滑台,派将军颜肱、刘袭进驻河北的消息,便派桑据进驻黎阳,抵抗晋军。刘袭夜袭桑据,桑据败逃,刘袭进驻黎阳。
苻丕军已经筋疲力尽,无力再战了。面对步步紧逼的晋军,苻丕感到十分害怕,就写了一封信,派堂弟苻就和参军焦逵给谢玄送过去,信中说:“我欲向你借道求粮,西赴国难,等你们的军队到达,我就把邺城让给你们。如果西路不通,长安陷没,请您率军保卫邺城。”
焦逵和另一个参军姜让秘密对杨膺说道:“如今我们身处困境,长安音讯皆无,存亡与否无人得知,现在就算我们卑躬屈膝,也不知道能不能得到粮食,但王爷不肯低头,仍然以平等的口气给晋写信,此行肯定不会成功。我们应该把信改为奏章,以臣属的口气许诺,说等晋军到达,我们将一同随他们回到南方,到时候如果王爷不答应,我们就发动兵变,把他捆绑起来交给晋军。”杨膺是苻丕的大舅子,自认为以自己的实力能制服苻丕,于是就依此计,把书信修改后送了出去。
谢玄派晋陵郡太守滕恬之北上守卫黎阳。这时候,兖、青、司、豫四州已经平定,晋廷任命谢玄为都督徐、兖、青、司、冀、幽、并七州诸军事。
之前慕容垂撤军,是想让苻丕主动撤走回长安去,但他看苻丕仍然不走,就又率军包围了邺城,不过还是留出了西边的道路,想要放苻丕一条生路。
焦逵前来拜见谢玄,送出了修改后的苻丕的信件。谢玄见信后将信将疑,不放心,要求苻丕把儿子送来做人质,然后才会发兵。焦逵一再向谢玄表明苻丕的诚心,后来又和盘托出了自己和杨膺等人的打算,谢玄这才相信,派刘牢之、腾恬之等率两万人马前去支援邺城,会战慕容垂。同时,谢玄还命人通过水路和陆路给邺城送去了两千斛粮食。
刘牢之率军到达枋头,这也是桓温北伐前燕时到的地方,距离邺城只有两百多里路程,两地之间一马平川。但这时候,杨膺、姜让的计划泄露,苻丕大怒,把他们逮捕后处决了。刘牢之得到消息犹豫不决,停驻不前。
刘牢之攻打后燕将军刘抚据守的孙就栅(位于黎阳西北),慕容垂得知后,留下慕容农继续包围邺城,亲自率军去解救刘抚。刘牢之和慕容垂都是勇将,他们俩相遇,真是棋逢对手,将遇良才,两军互有伤亡,谁都没有占到便宜。最终,刘牢之退回黎阳,慕容垂退回了邺城。
太元十年(385)四月,刘牢之率军往邺城前进,到达邺城城外后,和慕容垂再次交锋,慕容垂战败,撤退到了新兴城。四月八日,慕容垂放弃新兴城北逃,刘牢之追击,苻丕也派军尾随。
四月十三日,刘牢之在董唐渊这个地方追上了慕容垂。慕容垂看到避无可避,就激励众将士道:“秦和晋现在暂时苟合在了一起,但他们联合的基础非常脆弱,并非真正团结。他们一方获胜,双方都扬扬得意;若一方失败,则双方必争相逃窜。现在两军一前一后,还没有形成合力,我们应该孤注一掷,全力进攻晋军。”
慕容垂命令部队放弃辎重,以此吸引晋军,然后趁机攻击。刘牢之带领部队强行军二百里,到达了五桥泽,这时候士兵们又饥又渴,急需修整,他看到慕容垂的辎重丢弃得到处都是,便下令说:“慕容垂空有虚名,看到我军就狼狈而逃,我们收拾完这些辎重,再就地休息。”
可就在刘牢之的部队在收捡辎重的时候,慕容垂率军突然杀来,晋军猝不及防,被杀死数千人,刘牢之单人独骑逃走,幸好遇到了从后面赶来的前秦军,才幸免于难。
邺城城中发生严重饥荒,苻丕率队到枋头接收晋援助的粮食,刘牢之则进入邺城稍做休息。这时候不断有逃出战场的散兵前来报到,晋军的士气稍微振作了一点,但因为之前刘牢之大败,晋廷将他招回去了。
后燕、前秦在邺城已经打了一年多的仗,幽州、冀州民不聊生,食物严重缺乏,甚至出现了人吃人的现象。后燕的士兵也有很多被饿死,慕容垂甚至用桑葚充作军粮。
一年后,晋廷认为北伐大军征战时间过久,人民负担过重,命令谢玄率军回淮阴,谢玄的北伐宣告结束。