子玉并非无能之辈,在开战之前,他先派宛春到晋国军营去谈判:“请贵军恢复卫国国君之位,将曹国的土地还给曹国,我就退军解宋国之围。”狐偃本想拒绝,但先轸却看出了其中的阴谋,他说:“如果楚国说了一句话就能平定曹、卫、宋三国的危难,而我们却用一句话拒绝其请求,将三国推入亡国的险境,那就是我们不合礼制了、不得人心了。我们不如私下与曹、卫谈判,给予他们好处,再将宛春抓起来激怒楚国,到时候挑起战端的罪名就是楚国的了。”晋文公采纳了先轸的建议,曹国和卫国果然与楚国绝交了。

子玉知道此事后十分愤怒,下令进攻晋国的军队,晋国的军队却不战反退。士兵们不明白国君为何不敢与楚国令尹正面作战,狐偃便站出来解释:“师出有名、理直气壮的军队才有战斗力,如果没有楚国的帮助,国君有不了今日。当初在楚国,国君曾与楚王约定如果兵戎相见则晋军退避三舍,现在正应当以此来报答楚国。如果我们退让了,楚军还是咄咄逼人,那么就是对方无理挑衅了。”

晋军一路退避,子玉引兵追击,一路到了城濮(今山东范县临濮城),宋成公、齐国将领国归父、秦国将领小子憗率领大军驻扎于此,楚国军队则背靠险山驻扎。晋文公还顾及过去楚成王对自己的恩惠而犹豫不决,狐偃劝他说:“作战吧!如果胜利,我们就可以称霸诸侯,即使战败,于我们晋国的江山也无损。”

这时子玉派人来下战书:“请与君之士戏,君冯轼而观之,得臣(子玉之名)与寓目焉!”晋文公则派使者送去回复,约定明日开战:“敢烦大夫,谓二三子:戒尔车乘,敬尔君事,诘朝将见!”

第二天,春秋时期最大的一次战争爆发了。晋文公下令晋国军队的七百乘战车在莘地以北列阵,派胥臣率领下军抵挡陈国和蔡国。子玉命令若敖氏的一百八十乘战车为中军,命子西率领左军,子上率领右军,并扬言要覆灭晋国。

战争开始以后,晋军首先发起攻击,胥臣用虎皮包裹战马,向陈国、蔡国的军队发起猛烈进攻。陈、蔡的军队很快败退而逃,楚国的右军也随之溃败。为了诱敌轻进,狐毛设下两面大旗伪装撤退,栾枝也命令战车拖着树枝伪装逃遁,子玉果然中计,率军追击。中军的先轸、郤溱率领军队横向冲击,而狐毛、狐偃父子同时率领上军夹击楚军的左翼,楚国左军不敌,很快也溃败了。只剩下子玉率领的中军主力收拾残卒,败逃回了楚国。

城濮之战的失败,虽然并没有给楚国的主力造成严重损失,但是楚国北上中原与晋国争霸的计划遭受了严重打击,令尹子玉也引咎自杀。从此以后,楚国只能将精力集中在经营南方,而晋文公的霸主地位也由此奠定。

城濮之战以后,晋文公并不见喜色,反而不时忧心忡忡地叹气,有人问他:“我们战胜了楚国,国君还忧虑什么呢?”晋文公长叹一声说:“我听说打败别人以后能够安全又安心的只有圣人了,楚国的令尹子玉还活着,不知何时就会卷土重来,我怎么高兴得起来呢?”谁知不久以后竟传来消息,子玉被逼自杀了。

原来城濮之战大败后,子玉率领的中军并没有遭受太大的损失,因此他虽然心情低落,但毕竟胜负乃兵家常事,也没有太过自责,便收拾残部回楚国去了。可是一路到了楚国,楚成王却对他不听命令、一味贪战导致楚军大败的行为十分愤怒,派人到军中取责问子玉:“大夫您如果回国,那么我如何对子弟们随你战死的申、息两地父老交待?”