楚成王即位以后,楚国日益强盛。楚将子玉率师攻晋。楚国还胁迫陈、蔡、郑、许四个小国出兵,配合楚军作战。
子玉率部浩浩荡荡向晋国进发,晋文公闻讯,分析了形势。他对这次战争的胜利并没有把握,楚强晋弱,其势汹汹,他决定暂时后退,避其锋芒。对外假意说道:“当年我被迫逃亡,楚国先君对我以礼相待。我曾与他有约定,将来如我返回晋国,愿意两国修好。如果迫不得已,两国交兵,我定先退避三舍。现在,子玉伐我,我当实行诺言,先退三舍。”
他撤退九十里,已到晋国边界城濮,仗着临黄河,靠太行山,足以御敌。他已事先派人往秦国和齐国求助。
子玉率部追到城濮,晋文公早已严阵以待。晋文公已探知楚国左、中、右三军,以右军最薄弱,右军前头为陈、蔡士兵,他们本是被胁迫而来,并无斗志。子玉命令左右军先进,中军继之。楚右军直扑晋军,晋军忽然又撤退,陈、蔡军的将官以为晋军惧怕,又要逃跑,就紧追不舍。忽然晋军中杀出一支军队,驾车的马都蒙上老虎皮。陈、蔡军的战马以为是真虎,吓得乱蹦乱跳,转头就跑,骑兵哪里控制得住。楚右军大败。晋文公派士兵假扮陈、蔡军士,向子玉报捷:“右师已胜,元帅赶快进兵。”子玉登车一望,晋军后方烟尘蔽天,他大笑道:“晋军不堪一击。”其实,这是晋军诱敌之计,他们在马后绑上树枝,来往奔跑,故意弄得烟尘蔽日,制造假象。子玉急命左军奋力前进。晋军上军故意打着帅旗,往后撤退。使楚左军陷于晋国伏击圈,又遭歼灭。待子玉率中军赶到,晋军三军合力,已把子玉团团围住。子玉这才发现,右军、左军都已被歼,自己已陷重围,急令突围。虽然他在猛将成大心的护卫下,逃得性命,但部队伤亡惨重,只得悻悻回国。