齐桓公死后,齐国陷入内乱。与此同时,其他诸侯国正在逐渐兴起,其中以北方的晋国和南方的楚国最为强大。公元前633年,宋国被强大的楚国攻打,因国力薄弱,向晋国求救。晋文公得知消息后,亲率部队由棘津(今河南滑县西南)渡河,向楚国的附属国曹和卫进攻,希望以此引来楚军救援,替宋解围。
没过多久,晋文公便占领了卫国全境和曹国都城陶丘。出乎意料的是,楚军不但没有派出援军,反而加紧围攻宋国商丘。
晋文公采纳了先轸的建议,利用秦和齐“喜贿怒顽”的心理,使用外交政策制造秦、齐和楚之间的矛盾。随后,晋文公一面让宋向秦和齐行贿,请两国出面求楚退兵,一面则将曹和卫之地分给宋,以坚定宋抗楚的决心。楚国一看,商丘久攻不下,而曹和卫又被晋送给了宋国,于是拒绝退兵。这样,秦和齐便出兵援助晋国,形成了三强联合对楚的局势。楚成王见大事不妙怕秦国乘机攻其后方,所以退军至申邑,并撤回了围攻商丘和缗邑以及占领谷邑的军队。没想到,围攻商丘的子玉是个极其自负的人,坚持要和晋交战。楚成王一看主将如此坚定,只好同意了他的主张,但死活不肯全力决战,只派了600王室亲兵增援子玉。子玉一直把商丘团团围住,并派人告诉晋国:只要晋国答应让曹和卫复国,楚国就撤兵当时,晋国认为,形势对自己十分有利,便希望和楚国决战,可又担心不答应子玉的条件,会被宋曹和卫三国仇恨。所以,他们一面答应了子玉的条件,并劝说曹、卫与楚国断交;一面又扣留了楚国使臣,故意激怒子玉。子玉一向有勇无谋,看到晋国扣留人质后,果然大怒,率军进逼陶丘。
楚军一进军,晋文公立刻命令往后撤军,晋军中有些将士不理解。原来,当初晋文公流亡到楚国时,楚成王曾经帮助过他,并问他如果得到君位,将如何报答楚国。晋文公许下诺言,说如果今后双方在战场相见,晋国会主动退避三舍。
晋军一直撤退了90里,到了城濮(今山东鄄城西南),和秦、齐军队会合。四月初一这天,子玉率军来到城濮。此时的楚军已经疲惫不堪,双方一交战,楚军便节节败退。楚军败退到连谷,子玉自杀。
这一场胜仗,主要是因为晋文公及先轸等人能够事先充分运用外交谋略;在决战中,又能按先弱后强的顺序,将敌军各个击破。城濮之战后,楚国多年不敢进攻中原,晋国则声威大震,成为了中原新的霸主。