不出意外,晋文公答应出兵。由于卫国夹在晋和曹之间,晋文公开始想直接打曹国报仇,便向卫国借路,卫国不同意,晋军只好迂回,南渡黄河,绕到另一边,攻打卫国的五鹿。犹记得当年晋文公路过五鹿讨饭的时候,当地人给了他一碗土,现在他回来了,真的把五鹿人打得吃土。卫国被晋军痛扁,可是子玉偏偏不来救援,晋文公很轻松地占据了卫国大片领土。
看到楚军无动于衷,晋文公又率军攻打曹国。曹国倒是个难啃的骨头,让晋军损失不少,不过没有楚军的支援,曹国还是被攻破。宋、楚都曾对晋文公有恩,晋文公既不想直接攻打楚国救援宋国,也不想放弃宋国,所以想攻打楚国盟国吸引楚国注意力,让他们先动手,可是楚国就是不来,怎么办呢?先轸想了个好办法,他建议将这些曹、卫的土地分给宋国,晋文公照做,楚成王果然着急了,准备撤军。
灰溜溜地撤军,子玉肯定不同意,因为楚国国内对他有很多质疑声,说他不堪大用。子玉为了证明自己,坚决请求与晋一战,并请求国内派兵增援。楚成王其实已经不太想打了,只派了一小队人马增援,子玉管不了太多,带着楚国大军就直奔晋军而去。
晋文公当年流落楚国的时候,曾答应楚成王如若日后两军交战,己方军队先避让九十里路。老狐狸狐偃提醒晋文公履行这个承诺,这就是“退避三舍”成语的来源。晋文公“退避三舍”一方面说话算话,一方面向后撤到自己的有利位置,缩短自己的补给路线,引诱楚军深入,一石二鸟。
“城濮之战”一触即发,这次战争规模空前,九国参战,总人数共计二十多万。晋国方面,晋联合齐国,又用土地收买秦国,加上宋国,组成了联军。楚国方面,还有陈、蔡、郑、许四国盟军。不要觉得二十几万还少,在当时那个年代,人口本来就少,大多战争就是数万人在打来打去,这里的二十几万,已经凝聚了主要诸侯国的大部分兵力。
公元前632年4月,晋楚双方在城濮严阵以待,晋元帅先轸先发制人,他让下军佐胥臣把虎皮罩在马上,首先冲击楚军右翼的陈、蔡联军。陈、蔡联军本来战意就不强,看到晋军的战马都变成了老虎,吓得魂都没了,顿时溃不成军,楚军右翼轻松被破,可以说是:“我还没出力,你就倒下了。”
子玉见右翼溃败,便加强对晋中军和上军的攻势。晋上军统帅狐毛竖起将、佐二面旗帜,并令二旗后退,引诱楚军。耿直的子玉觉得晋军虚了,赶紧让司马子西带着楚军左翼追击。等到楚军左翼深入,佯退的晋上军和原地待命的中军联合夹击子西带领的左军,两个打一个,子西自然撑不了多久,楚军左翼很快被歼。子玉看到左、右两军被灭,感到大势已去,命令中军撤退,晋文公也没有穷追不舍。
总的来说这次晋楚争霸,楚国失败的原因有很多。一是外交方面,晋国先攻取楚国盟国曹、卫,联合大国齐、秦,而楚国方面的盟国陈、蔡、郑、许都是小国。二是谋略方面,从退避三舍,到大战中的狡诈奇谋,晋军战术灵活多变,古板的楚军无法应对。三是楚成王自己的立场不坚定,作战态度暧昧,似战非战,这也极大影响了楚军的士气。
楚国本是实力超强的大国,如果作战方针得当,确实有实力征服中原,但是经过城濮一战,楚成王努力了十几年的结果功亏一篑,反倒成为了晋文公登上霸主的垫脚石。楚军大败后,楚成王一时恼怒,命子玉自裁,但是子玉是楚国难得的将星,楚成王马上后悔并传令收回命令,可是没赶上,子玉已经奉命自裁。失去子玉可以说是楚国这次战争最大的损失,晋文公听到子玉自杀后开心地说:“莫余毒也已。”(意思是没有人能再害我了),说明了子玉的重要性,确实,此后楚成王再无良将可用。