公元417年八月二日,东晋太尉刘裕抵达潼关。北伐后秦的五路大军中的新野太守朱超石、宁朔将军胡藩以及冀州刺史王仲德也一同抵达潼关。刘裕主力大军终与驻屯潼关半年之久的龙骧将军王镇恶、冠军将军檀道济会合。刘裕决定兵分两路,一路由朱超石率领,从潼北渡黄河,攻打后秦所属的河东郡蒲坂(今山西省永济市),一路由自己统领,西进攻取关中。刘裕还任朱超石为河东郡(今山西省运城市)太守,令其与振武将军徐猗之、河北郡(今山西省芮城县)太守薛帛会合,一同攻打蒲坂。
后秦驻屯蒲坂的平原公姚璞听报刘裕派朱超石等来攻,一边传令迎战,一边派人向北边驻守匈奴堡的宁东将军姚成都联络,令姚成都率部一同迎战朱超石。姚成都接令后立即率部赶至蒲坂。蒲坂一战,姚璞、姚成都十分英勇,东晋兵马大败。朱超石一路奔回潼关,徐猗之被杀。刘裕决定暂不夺取河东,准备率部入关。这时接替鲁公姚绍的东平公姚赞派后秦扬州刺史司马国播带领北魏兵马一路跟在刘裕兵马之后。
再说龙骧将军王镇恶早就抵达潼关,一直被困在潼关达半年之久不能西进长安。现在随着刘裕大军的抵达,王镇恶请求率一支水军,从渭水溯流而上,直指后秦都城长安,刘裕准许。王镇恶便率所部兵马率先西进,后秦驻守香城(今陕西省大荔县东南)的恢武将军姚难听闻王镇恶逼近,非常害怕,不仅不阻止王镇恶西进,反而率部离开香城,向西撤退。王镇恶传令追击姚难。
王镇恶率先西进的消息也传到长安,后秦皇帝姚泓派镇北将军姚强东出长安,与姚难会合于泾水河畔,一同抵挡王镇恶。姚泓还亲率兵马从灞上向东进驻石桥,以声援姚强、姚难。不久,王镇恶抵达泾水河畔,派将领毛德祖率一支兵马攻打姚强、姚难。泾水河畔一战,毛德祖大胜,姚强战死,姚难逃回长安。
当时,刘裕也亲率大军从潼关西进,后秦东平公姚赞自知不是刘裕对手,为避免伤亡,只得率部西撤到郑城(今陕西省渭南市华州区)。这时姚泓又对防守作了调整,派姚丕防守长安城北的渭水大桥,胡翼度驻屯石积,而让姚赞退驻灞河东畔,姚泓则从石桥回屯长安城西边的逍遥园。从姚泓的部署来看,显然是受到姚强、姚难失败的影响,本来在石桥声援姚强、姚难的,现在反而撤退到长安城西边。再者,后秦最后倚仗的重臣姚赞原本只是撤退到郑城,离长安城还有两百余里,现在姚泓反而令其来到长安城东边的灞东驻屯,而改由胡翼度在郑城的石积防御刘裕,这也可以看出姚泓当时可能想到后秦的兵马已经无法抵挡刘裕大军西进,因而重点防守长安城了。当然姚泓可能还担心长安城也守不了,所以自己才驻屯长安城西,有进一步西撤的打算。
王镇恶的水军所乘的船称"蒙冲小舰",士兵全在舰内,从外面看不到一个人。后秦的百姓看到众多"蒙冲小舰"在渭水中前行,竟然没有看到划船的人,都非常惊讶,以为有神灵相助。八月二十三日凌晨,王镇恶到达渭桥,传令将士早餐后手持兵器登岸,最后一个登岸者斩。当所有将士登岸之后,由于渭水迅急,"蒙冲小舰"倏忽之间就看不见了。面对后秦部署在渭桥以及防守长安的数万兵马,王镇恶演讲了一番背水一战提升士气之类的总动员,然后身先士卒,冲杀在前。将士们都气势高昂,奋勇向前。
驻屯渭桥的后秦将领姚丕看到王镇恶所率的水军从渭桥登岸,立即下令迎战。但东晋士兵背水一战,战斗力远超于平时,再加上王镇恶身先士卒,士兵们更是不畏生死。后秦军队很快就溃败了,原来退驻逍遥园的姚泓接到姚丕兵败渭桥的消息,决定率部迎战王镇恶。也许姚泓认为王镇恶只是一支孤军,因而才敢从长安城西再次来到长安城东。令姚泓没有料到的是,姚丕所部被击败的兵马一路西撤,竟阻挡了姚泓东进,姚泓的士兵看到排山倒海似的败兵西来,竟全都不战而溃。镇西将军姚湛等全都战死,姚泓非常害怕,单人匹马逃回宫中。
在渭桥击败姚丕,又惊溃姚泓,王镇恶知道后秦长安已无兵可战,决定从长安城北的平朔门进入长安。姚泓获报王镇恶入城,非常惊慌,不敢待在宫中,也不敢留在长安城中。姚泓决定向东投奔驻屯在灞东的东平公姚赞。姚泓的儿子姚佛念,当时才十一岁,不想随其父皇逃走。姚佛念对姚泓说道∶"晋国人攻取长安,必将为所欲为,即使投降也是一死,不如自己了断。"姚泓听后,茫然若失,不能回答。姚佛念真的爬上宫墙,跳下摔死。姚泓与姚裕带着后妃在数百骑兵掩护下,逃往长安城东的石桥。
长安城被王镇恶占领的消息传到姚赞那里,姚赞忙将这一消息告诉将士,众将士听后用刀击地,捋袖大哭。姚赞接着传令前往石桥,与皇帝姚泓会合。姚赞尚未抵达石桥,其兵马大都逃散一空。八月二十四日,三十岁的后秦皇帝姚泓得知姚赞的兵马已经溃散,知道已经没有兵马可以抵御刘裕了,只得带着后妃、群臣来到王镇恶大营前请求投降。王镇恶将姚泓等关押起来,等待刘裕到来处置。王镇恶对长安城中六万多户汉人、胡人进行安抚,其兵马也号令严肃,百姓安宁。
九月,刘裕抵达长安。这时据守蒲坂的后秦平原公姚璞、并州刺史尹昭也向刘裕纳降,就连东平公姚赞也带领宗族百余人来向刘裕纳降。刘裕将他们全部杀掉,只将姚泓一人送到建康。姚泓最后被斩于建康街市。