晋文公五年春天,楚成王联合部分诸侯国围攻宋国,宋国无力抵抗,最后只好向晋国告急求救,晋文公本想援救宋国,但是这样就必须与楚国交战,而楚国在他流亡期间救过他,所以他并不想与楚国发生正面冲突,然而他流亡在外的时候,宋国也曾对他有恩,他如果丢下宋国不管,情理上也说不过去,为此他犹豫不决。这个时候,元帅先轸说:“我们可以先拿住曹伯,把曹、卫两国的土地分给宋国,这样,楚国势必因急于援救曹国和卫国,放弃攻打宋国。”晋文公听从了他的建议,楚成王果然撤去了围攻宋国的部队。
楚将子玉说:“当年大王对晋侯的接待真是太好了,现在他明知道楚国急于与曹、卫结盟,却故意攻打他们,太不重视大王了。”楚成王说:“晋侯流亡在外十九年,历尽苦难,备尝艰辛,最终得以回国,他对各种情况下的危险和困难全都有所了解,又能正确地使用它的人民,这是上天要使他兴旺,没有谁可以阻止啊。”子玉请求说:“虽然不敢说一定能成功,但是我还是想在有机会的时候,堵一堵那些奸佞小人的嘴。”子玉的固执使楚成王十分生气,因而在给他留下了少量的军队之后,自己先回国了。
于是,子玉便派宛春去通知晋国说:“请你们恢复卫侯的地位,并且保存曹国,这样我们也放弃包围宋国。”狐偃说:“子玉也实在太无礼了,我们晋国是君,竟只得到了一份好处,他楚国是臣,却要求有两份好处,不能答应他。”先轸说:“礼能安定人民,楚国一句话安定了曹、卫、宋三国,而您一句话却让他们全部灭亡,这样是我们无礼,然而,如果不答应楚国的条件,则等于抛弃了宋国,所以不如私下里答应卫国和曹国,允许他们复国,借以引诱他们,但却扣押宛春以激怒楚国,待两国交战之后,再见机行事,算计楚国。”晋侯听从了先轸的高明计策,于是将宛春囚禁在卫国,私下里则答应允许曹、卫两国复国,曹、卫两国果然马上宣布与楚国绝交。
子玉获悉这些情况之后,大为恼怒,立即挥兵向晋军发起了进攻,晋军还没有与楚军接触就向后退却,将领们不明就里,都纷纷问道:“为什么还没有交战就撤退呢?”晋文公说:“当年我流亡到楚国的时候曾经答应过他们,将来万一晋、楚两国之间发生战争,我将退避三舍以示谦让,我们不能违背承诺。”
这时楚王也要求子玉撤兵,但子玉并没有听从,不久,晋文公和宋、齐、秦等国的军队在城濮会师,联合抗击楚军,楚军大败,子玉只好收拾残兵退走,甲五年,晋师回到了衡雍,定都于践土,晋军焚烧战死的楚军尸体,大火好几天都没有熄灭,晋文公为此连连叹息,他身边的人说:“我们已经战胜了楚国,可是国君您为什么还这么忧虑呢?”晋文公说:“我听说,能战胜敌人,而且在战胜敌人之后能安然无虑的,只有圣人,我不是圣人,所以感到恐惧,并且,子玉依然活着,难道有什么值得我高兴的吗?”
子玉战败回国后,楚成王对他不听命令,贪图与晋国交战十分痛恨,因而狠狠地责备了他,子玉最终恼羞难当,自*而亡,晋文公得知后说:“我从外面进行打击,楚国自己从内部诛*,这真可以说是内外呼应。”这时,他才面露喜色。