重耳即位以后,迅速整顿吏治,大力发展生产,晋国很快强盛起来,开始向中原地区发展。这时,齐国已经衰落,南边的楚国却强大起来,黄河以南的大片土地都成为楚国的势力范围,楚成王还不断把自己的势力向北渗透。这样一来,晋楚两国的矛盾和冲突就变得越来越尖锐。
这年冬天,周王朝内部发生了叛乱,周朝的天子周襄王派人来讨救兵。原来周襄王有个异母兄弟叫太叔带,联合了一些大臣,向狄国借兵,夺了王位。周襄王无奈,只好向晋文公求救。晋文公马上发兵往东打过去,把狄人打败,又杀了太叔带和他那一帮人,护送天子回到京城。周襄王为答谢晋文公,摆设盛大礼宴来款待他,又把周朝管辖的四个邑送给他,这样晋国的疆域又扩展到了黄河北岸。晋文公安定了周王室,称霸中原的信心更足了。
过了两年,宋襄公的儿子宋成公来讨救兵,说楚国派大将成得臣率领楚、陈、蔡、郑、许五国兵马攻打宋国。晋文公早就看出,要当上中原霸主,就得打败楚国。于是他就积极扩充队伍,建立了上中下三个军,浩浩荡荡去救宋国。公元前632年,晋军首先打下了归附楚国的两个小国——曹国和卫国,把两国国君都俘虏了。楚成王本来并不想同晋文公交战,听到晋国出兵,立刻下命令叫成得臣退兵。可是成得臣以为宋国迟早可以拿下来,不肯半途而废。楚成王心里很不痛快。成得臣先派人通知晋军,要他们释放卫、曹两国国君。晋文公却暗地通知这两国国君,答应恢复他们的君位,但是要他们先跟楚国断交。曹、卫两国果真言听计从。成得臣得知消息,气得他双脚乱跺,立即下令,催促全军赶到晋军驻扎的地方去。楚军一进军,晋文公立刻命令往后撤。晋军有些将士想不明白,狐偃解释说:“当初楚王曾经帮助过主公,主公在楚王面前答应过:要是两国交战,晋国情愿退避三舍。今天后撤,就是为了实现这个诺言啊。要是我们对楚国失了信,那么我们就理亏了。我们退了兵,如果他们还不罢休,步步进逼,那就是他们输了理,我们再跟他们交手还不迟。”晋军一口气后撤了九十里,到了城濮(今山东鄄城西南),才停下来,布置好了阵势。成得臣见晋军一再后撤,以为对方不敢和自己交战,得意非凡,还派人向晋文公下战书,措词十分傲慢。大战一开始,晋文公指挥军队向后撤退,他们还在战车后面拖着伐下的树枝,战车后退时,地下扬起一阵阵的尘土,显出十分慌乱的模样。成得臣一向骄傲自大,不把晋人放在眼里。他不顾一切地直追上去,正中了晋军的埋伏。晋军的精锐猛冲过来,把成得臣的军队拦腰切断。原来假装败退的晋军又回过头,前后夹击,把楚军杀得七零八落。成得臣带了败兵残将回到半路上,自己觉得没法向楚成王交代,就自杀了。
城濮大战,晋军俘获楚军战车百辆,士兵千馀人,还有众多粮草,给楚成王以沉重的打击。
晋国打败楚国的消息传到周都洛邑,周襄王和大臣都认为晋文公立了大功。周襄王还亲自到