晋文公在周襄王二十年,也就是文公五年(公元前632年)初,率军从棘津(河南省滑县西南)渡河,攻打附楚的曹、卫,试图引诱楚帮助解宋围。正月占卫五鹿(河南清丰西北),二月进入敛盂(河南濮阳东南)与齐昭公会盟,都城楚丘(河南滑县东北)卫人逐其君降晋。三月占领曹都陶丘(山东定陶西北)。但楚军没有被调动,而是加强了对商丘的围攻。宋向晋告急,晋文公用先云建议,利用秦、齐“喜贿怒顽”的心理,利用外交战略制造秦、齐、楚之间的矛盾。宋重贿秦、齐,请两国出面求楚退兵,同时分曹、卫之地与宋,坚决抗楚。商丘未能攻下,曹、卫之地又被晋送到宋国,楚因此拒绝退兵。秦、齐遂出兵助晋,形成三强联合对楚的战略格局。
楚成王见形势不利,怕秦乘机攻后,退至申邑(河南荥阳西北),并将商丘围攻、占领谷邑的楚军撤退。但围攻商丘的主将子玉骄傲自负,坚持与晋一战。楚成王决心动摇,同意子玉的建议,但拒绝全力决战,只派600名王室亲兵增援子玉。子玉派人与晋交涉:如晋许曹,卫复国,楚即解宋之围。晋国君臣认为形势有利,希望决战,但恐怕不允许子玉条件,将遭到宋、曹、卫三国的仇恨。于是暗许曹、卫复国,劝他与楚绝交,并拘留楚使臣激怒子玉。子玉果怒而求战,率军进逼陶丘。晋文公为疲惫的楚军,诱使子玉轻敌深入,以便在预定战场上与楚决战。后退三舍(古代一舍30里,三舍90里),到城濮与秦齐军会合。
四月初一,楚军进城濮,初二,双方对阵。在秦、齐军的支持下,晋军分配为上、中、下三军;楚军以陈、蔡军为右军,申、息两军为左军,主力精锐为中军。晋统帅首先下令首先击败弱小的楚右军;让晋上军假装撤退,在阵后拖柴扬尘,制造后军撤退的假象,诱使楚左军进攻,暴露侧翼,然后返回军队与中军进行联合攻击,击败楚左军。为了避免中军败溃,子玉及时收住兵力。楚军退到连谷(河南西华境)时,子玉自杀。在这场战争中,晋文公和先云在决战前充分利用了外交战略,这是从实力制胜到战略制胜的转折点;在决战中,晋军先弱后强。他们都打破了它们,示利诱敌,并在战术上发展起来。子玉以为晋军害怕,率军追城濮。两军对峙,晋军分上、中、下三军部署:上军在右,下军在左,中军在中,先云和晋文公坐在中军指挥下。
楚联军还按左、中、右三军配置:陈、蔡军为右军,实力较弱;楚军为左军,战斗力强;中军是楚军的精英,由子玉指挥。二十一年四月初二,决战开始。晋下军将马蒙上虎皮,首先向楚右军发起猛攻,陈、蔡军一触即溃,全军瓦解。这时,晋上军竖起两面大旗,阵后扬起尘土,假装后退。子玉不察虚实,命令左军追击。晋元帅首先指挥中军暴露翼侧攻击,断其退路,晋上军也回头攻击。楚左军大部分被歼灭。子玉见两翼均败,大势已去,急忙下令收兵,退回楚地。城濮一战以晋胜楚败告终。战后晋文公被周襄王策命为侯伯,一跃成为中原霸主。
春秋五霸晋文公称霸的关键战役是什么?