晋文公即位后不久,周襄王之弟太叔带在翟国的帮助下,赶跑了哥哥,自己占据了洛邑。公元前635年,晋文公亲自统率大军,将洛邑攻破,斩杀太叔带,恢复了襄王的王位。
过了两年,宋国又派人向晋国求救。原来,宋襄公箭伤发作死后,其子继位,就是宋成公。楚成王觉得宋国好欺负,就与大将子玉率领楚、陈、蔡、郑、许五国军队进攻宋国,想夺取一些土地。
公元前632年,晋文公为了报答宋国对他的恩惠,亲自率领大军救援宋国。
文公采纳了子犯的意见,攻打依附楚国的曹国,想让楚国撤兵去救曹国。晋国军队要到曹国,必须从卫国借路。可是卫文公说什么也不同意。晋文公非常生气,就把卫国灭了。
灭卫之后,晋国军队攻入曹国京城。晋文公见曹共公被活捉,就怒斥他当初偷看别人洗澡的无耻行为,然后派人保护曹国贤人僖负羁的府第。
晋文公为了迫使楚军撤兵救曹,就决心把卫、曹两国土地的一部分分给宋国。楚成王听到这个消息,觉得晋文公不好惹,就带兵回国。大将子玉却认为晋文公忘记了楚国的恩惠,不能饶恕他。于是,他不听楚王的命令,率领军队向曹国前进。
晋文公趁机向曹、卫两国国君提出恢复他们的国君之位,条件是他们与楚国绝交。两位国君真的这样做了。子玉大怒,加快了行军的速度。
晋文公听到子玉前来决战的报告,就与群臣商议。先轸提出要与楚国打一仗,彻底打败他们。子犯却说:“国君当初在楚国曾经许诺,如果遇到楚国军队,就要‘退避三舍’。现在我们立即与楚军交战,就是背信弃义。如果我们后退三舍,楚军依然不肯罢休,那我们就带兵打他们。这样一来,我们理直气壮,必定士气高涨。”
于是晋国军队就向后撤退了三舍。楚国军队见到晋国一个劲地撤退,以为晋文公胆小怯懦,更加轻敌,就在后面紧紧追赶。
晋文公退避三舍后,就在城濮(今山东鄄城西南)摆开阵势。这时,子玉也追到这里,派人向晋文公下战书。第二天,晋楚军队正式交战。这场战役被称为城濮之战。
晋、楚两军交战后,晋军元帅先轸派出一支人马避实击虚,攻打楚国阵营中的陈、蔡联军。结果陈、蔡部队被打得溃不成军。这时,晋军大将狐毛冒充主帅先轸,带兵猛攻楚军,然后故意打了败仗,向后撤退。
子玉误以为狐毛率领的“败兵”是晋军的主力,就命令楚军紧紧追赶。这时候,先轸率领部队,把楚军拦腰截为两个部分。狐毛又扭头来,猛攻楚军。楚军被晋国军队杀得大败,所有军粮尽为晋军所得。
晋文公见晋国军队大获全胜,心里非常高兴,就派人对元帅先轸说:“楚军既然已经失败,您就不要再追杀他们了。当初我在楚国时,楚王待我很好,我们不能忘了他对我的恩惠。”先轸接到命令,就下令不再追赶。
子玉落荒而逃,派人向楚成王请罪,原以为楚王会给予他较轻的处分,好让他有机会戴罪立功。没想到楚成王派人对他说:“你打了败仗,还有脸回来吗?”子玉无话可说,只得自杀。
晋文公打完仗后并没有表现出兴奋的样子,听到子玉自杀的消息,才高兴地说:“楚王为我除去了一个心腹大患。”
周襄王知道晋文公打了一个大胜仗,非常高兴,就要亲自去慰劳晋国军队。晋文公大喜,在践土(今河南广武县荥泽城)修建行宫,召集各路诸侯前来会盟。
周襄王到了践土后,晋文公率领齐、宋等各路诸侯朝见他,并将城濮之战中捉获的俘虏和缴获的财物献给他。周襄王封晋文公为“侯伯”,众诸侯也都心悦诚服。这样,晋文公成为新一代的霸主。