公子重耳流亡的时候,曾投奔过楚国。楚成王对重耳十分友好,待他以国君之礼。楚成王求报,重耳承诺:“如果能借君王的威望复国,愿同贵国永结百年之好,以利百姓安居乐业。万一两国交战,我将退避三舍(一舍为三十里),以此作为报答。”
楚国大将子玉听说后,觉得重耳很不简单,或许将来会成为楚国的后患,就建议楚成王趁早把他杀掉。楚成王没有同意。
后来,重耳在秦穆公的帮助下回晋国做了国君,就是晋文公。他一心一意治理国家,晋国逐渐强大起来。
楚国当时正在大力扩张,经常侵犯别的国家。公元前633年,楚国借宋国投靠晋国为名,纠集陈、蔡、郑、许等国的军队攻打宋国。宋成公赶紧派人向晋国求援。
晋文公召集群臣商议这件事该如何处理。大将军先轸说:“现在能和晋国抗衡的只有楚国,主公想要实现称霸诸侯的愿望,就一定要把楚国打败。”狐偃说:“楚国不久前刚把曹国拉过去,又和卫国结成儿女亲家,现在他们三国正是关系最好的时候。曹、卫两国跟主公结过仇,我们出兵去攻打这两个国家,楚国一定会来救。这样一来,宋国的围就可解了,我们的仇也报了,岂不一举两得吗?”这个意见得到大家的赞同,晋文公决定去攻打曹、卫。
晋文公在公元前632年攻下了曹国和卫国。以前在逃难时,他曾经在这两个国家受过侮辱,现在这口气总算出了。
楚成王听说晋国接连打下曹、卫两国,怕领兵在外的大将子玉有个闪失,就派人叫他班师回去,还告诉他:“重耳在外头跑了十九年,现在已六十多岁了。他吃过苦,凡事很有经验,我们与他打仗未必能占上风。你躲着他点儿,趁早回来吧。”子玉不服这口气,派人向楚成王奏道:“宋国早晚能拿下来,请主公再等几天,我一定打了胜仗回来见您。如果军队遇到晋国军队,愿决一死战。倘若打败,我甘愿受军法处置。”
晋文公为了称霸中原,又耍了些手腕。他一面打发人去联络秦国和齐国,请他们一起来帮助中原的诸侯抵御“楚蛮”;一面逼迫曹、卫两国国君与楚绝交。曹、卫两国迫于无奈,给子玉写了一封绝交信。子玉本来打算为这两国向晋国求情,没想到他们来信与楚国绝交,气得差点背过气去。他跺着双脚大嚷:“老贼!老贼!今天不是你死就是我活!马上撤军,找重耳老贼算账去。”他带领兵马,撤了对宋国的包围,气势汹汹地向晋军扑来。
两军相遇,晋军中军大将先轸打算立即开战。狐偃阻拦说:“当初主公在楚王面前许过愿:要是两国交战,晋国要退避三舍。主公既然不失信于中原,也不能失信于楚国。”众将士全部反对:“这不行,晋国的国君怎么能在楚国的臣子面前退避呢?”狐偃说:“咱们不能忘记当初楚王对主公的厚待。退避三舍是向楚王表示友好,不是向子玉退缩。出兵打仗,理直才能气壮,理亏士气就会低落。他们理亏我们理直,打起仗来,必将对我们有利。”将士们没有再说话了。
晋文公传令:“三军俱退!”
晋军退后九十里,恰好是三舍之远,安营扎寨在城濮(今山东濮县),秦、齐、宋的兵马也先后到这里会合。
晋军的后退,被子玉误认为是害怕楚军。子玉手下一位大将劝子玉说:
“晋国国君躲避我们这些楚国的大臣,咱们已经很有面子了。大王早就吩咐我们回去,我们不能太固执,见好就收吧!”子玉回答道:“现在回师已晚,不如打个胜仗,还可以将功折罪。”于是,楚军紧逼而去,一直追到城濮。
两军在城濮相接,先轸诈败。子玉一向不把晋军放在眼里,犯了轻敌的错误,不顾一切地追了过去。
先轸把楚军引诱到设有埋伏的地方,伏兵齐出,切断了他们的后路。先轸回兵,杀得楚军七零八落。晋文公叫先轸吩咐将士们只要把楚国人赶跑就行了,不许追赶滥杀,免得辜负了楚王先前的情义。这叫做留有余地,日后还可以跟楚国和好。
晋军联合秦、齐、宋的军队打败了楚军,楚将子玉羞愧得无地自容,自杀了。晋文公得胜后,周天子派使臣慰劳诸国军队。晋文公借着招待使臣,在践土(今河南荥泽)邀集十来个诸侯签订盟约,正式做了霸主。