鲁僖公二十八年,即公元前632年春,晋文公率领晋军出征。按照计划,晋国军队的第一个攻击目标是曹国,晋国与曹国之间隔着卫国,因此攻打曹国最近的路线是从卫国穿过去,晋国于是向卫国借道,但是卫国此时与楚国同盟,知道这是晋国的假虞伐虢之策,因此拒绝了晋国的借道要求。晋国军队只得向南行军,渡过南河,然后向东,攻击曹国。正月初九日,晋军攻占了五鹿城。
二月,中军元帅郤縠在军中去世,晋侯破格提拔下军佐先轸担任中军元帅,由大夫胥臣接替先轸的下军佐岗位。
在攻打曹国的同时,晋文公邀约齐昭公在卫国的敛盂城会盟,他把晋军此次出击援救宋国、齐国的计划大致向齐昭公进行了介绍,让齐侯放心,随着晋军攻击作战的深入,齐国、宋国的压力就会减低。卫成公已经看到了晋军的威力,担心卫国的安危,也希望能够加入盟会,但被晋侯拒绝了。晋文公心里有一千个理由要惩治卫国,怎么能和卫国会盟呢。卫成公无奈,为了生存,只能继续结好于楚国和鲁国,但卫国的大夫民众不答应了,他们赶走了卫成公,以取悦晋国。卫成公从都城逃奔了卫国的襄牛城暂避。此时晋军不费一兵一卒,已经可以在卫国境内随意驰骋。
鲁僖公此时看到了晋军攻打曹国的形势,知道曹国兵败是早晚的事,宋、齐得到晋国这样的强援,局面开始变得复杂了。僖公问臧文仲:“晋国出兵中原,鲁国可就夹在楚、晋中间了,如何是好?”文仲回到:“国君,鲁国现在不是夹在晋楚之间,鲁国现在是与楚结盟,晋国攻打曹、卫,目的是为宋、齐解困。楚国必会要求鲁国出兵救援曹、卫,那咱们鲁国不就与晋国直接对垒了?”
僖公道:“寡人要避免那样的情况发生。晋国自从改革田制、军制以来,国力显著提升,晋侯归国后,经过五年的治理,其军力更是所向披靡。更何况,晋国与周天子往来密切,鲁国不能与晋国为敌啊!”
臧文仲问:“楚国如若要求鲁国出兵援助曹、卫,咱们鲁国也只能服从楚国的命令呀;现在的问题是:出兵援曹、卫,则与晋战;不出兵救援曹、卫,则与楚战。”
僖公沉思了一下,他是最善于在复杂的局面中寻找缝隙走出来的,十多年前,他就是用这样的智慧从齐国临淄脱身返回曲阜的。这次也不例外,他说:“鲁国先出兵协防卫国,毕竟与卫国有盟约,但不要出兵太多,先观察一下晋军动向。传寡人诏命:公子买率兵车二百乘、军士五千前往卫国协防。无寡人诏命,不得与晋军开战。”
看到晋军攻打曹国,楚国也调整了军力部署。楚成王亲自坐镇在距离中原比较近的申县,楚成王分析,目前晋军的主力接近四万人,正在攻打曹国,曹国是挡不住的,晋军的下一个目标必然是卫国,因此必须守住卫国,在卫国挡住晋国军队,只有先击败晋军,宋、齐两国就不在话下。于是楚成王再次增派楚国军队向卫国进发,同时诏命由叔侯率领的戍守在齐国谷城的楚军、由成得臣率领的攻打宋国的楚军撤退,与前往卫国增援的楚军会合。楚成王诏命中说:“不要追击晋国军队。晋侯在外十九年,最终得到了晋国。险阻艰难全都尝过了,民情的真伪他都知道。上天给予他年寿,去除了他的灾祸。上天所设置的,难道可以废除吗?《军志》上说要适可而止、知难而退、有德者不可敌,这三条都适用于晋国。”令尹成得臣派大夫斗椒向楚成王请战,说:“臣等愿与晋军决战,不敢奢望一战全胜,但愿以此堵住小人的悠悠之口。”这是有“将在外,君命有所不受”的意思了。楚成王接报大怒,没有给他们派出大军协助,只有西广、楚太子东宫的部队、还有公子若敖率领的兵车一百八十乘跟随成得臣、斗椒开向晋军所在的方向。
包围曹国后,晋军开始攻城。攻打城门的晋国士兵战死了很多人,曹军把晋军的尸体陈列在城墙上,晋文公很是忧虑,他采纳了士兵们建议,声称“晋军将在曹国人的墓地宿营。”因为曹国人的墓地在城外,曹军主力大都是城内的国人,晋军在曹国人的墓地宿营,会惊扰了他们祖先的魂灵,曹军很恐惧,把陈列在城墙上的晋军尸体装殓进棺材运出城来。晋军借机大举攻城,三月初八日,攻入了曹国,俘虏了曹国国君曹共公。晋文公历数曹共公的罪过:不重用僖负羁;弹丸之国有乘车驾的大夫三百余人;在晋侯途径曹国时,曹共公偷看晋侯沐浴。曹国国君实属罪有应得。
晋文公下令:不许进入僖负羁家宅骚扰,赦免僖负羁家族所有人,以报当年僖负羁对寡人的礼遇之恩。晋军将领魏武子、颠颉怒气很大,说:“不替有功劳的人着想,算什么报恩!”这两位都有跟随晋文公流亡的功劳,而晋文公设置三军将领时,魏武子只是戎右,颠颉官职更低,没有被任命为三军的统领,反而让很多没有跟随国君流亡的人统领三军,二人因此愤懑不平,带人放火烧了僖负羁的宅院。晋文公大怒,想要杀了魏武子,但魏武子在战场上胸部受伤,晋文公爱惜他的才干,就派人送东西过去,察看一下他的伤情,如果伤得很重,就杀了他。魏武子捆紧胸膛出来与使者相见,对使者说:“托国君的福,魏犫(魏武子)安好!”说完就向上、向前跳了好多次,晋文公最后饶恕了他,杀掉了颠颉并通报全军,引以为戒。魏武子被撤掉了戎右之职,由大夫舟之桥接替。
宋国派大夫门尹般到晋军中告急,晋文公对诸位将领说:“宋国前来告急,放弃宋国就等于断绝交往,中原将拱手让人;请求楚国解除对宋国的围困,楚国也不会同意。寡人欲力战救宋,齐国和秦国又不同意,如何是好?”中军元帅先轸说:“臣有一策,国君可以让宋国向齐国和秦国赠送大量财物,请求齐、秦两国为宋国向楚国请和。我们晋军破曹国、俘虏曹君,分一部分曹国和卫国的土地给宋国。楚国与曹、卫两国是同盟,必定不会答应齐、秦讲和的请求;齐、秦两国收受了宋国的重礼财物,面对固执的楚国,就更会支持我们与楚一战。”晋文公听后非常高兴,将曹共公交予宋国看管,并将曹、卫的一部分土地赠给了宋国。
鲁僖公看到战局的进展逐渐变得对晋国有利,有些后悔出兵帮助楚国前往卫国协防。卫成公已从都城出居襄牛城,卫国现在已听命于晋国。如果在接下来晋国与楚国的对战中,晋国真的取胜,那么晋文公定会讨伐协助过楚国的鲁国。好在鲁军在卫国还没有与晋军开战,僖公马上派特使前往驻扎在卫国的鲁军营中颁布诏命,命鲁军撤回国内,并命特使于军中斩杀领军将领公子买。同时又派出使者分赴楚军、晋军营中,向楚军通告:协防卫国的鲁军将领公子买不服从命令,戍守期限未到就擅自归国,现予以诛杀。而鲁国使者向晋侯通告的是:鲁国愿与晋国盟好,现诛杀驻扎在卫国的鲁军统领公子买,将鲁国军队撤回到鲁国境内。楚国君臣对战局意见不一,鲁国诛杀擅离职守的统军将领,对他们来说没有当回事。晋文公接到鲁国使者的禀告,觉得意义重大,这意味着楚国在中原减少了一个强有力的盟友,而晋国则增加了一个千乘大国与晋同盟,两大阵营实力此消彼长,对晋国无疑是个好消息!晋文公大喜,对鲁国使者说:“贵使回去转告鲁侯,后会有期!”