魯僖公二十八年,即公元前632年春,晉文公率領晉軍出征。按照計劃,晉國軍隊的第一個攻擊目標是曹國,晉國與曹國之間隔著衛國,因此攻打曹國最近的路線是從衛國穿過去,晉國于是向衛國借道,但是衛國此時與楚國同盟,知道這是晉國的假虞伐虢之策,因此拒絕了晉國的借道要求。晉國軍隊只得向南行軍,渡過南河,然后向東,攻擊曹國。正月初九日,晉軍攻占了五鹿城。
二月,中軍元帥郤縠在軍中去世,晉侯破格提拔下軍佐先軫擔任中軍元帥,由大夫胥臣接替先軫的下軍佐崗位。
在攻打曹國的同時,晉文公邀約齊昭公在衛國的斂盂城會盟,他把晉軍此次出擊援救宋國、齊國的計劃大致向齊昭公進行了介紹,讓齊侯放心,隨著晉軍攻擊作戰的深入,齊國、宋國的壓力就會減低。衛成公已經看到了晉軍的威力,擔心衛國的安危,也希望能夠加入盟會,但被晉侯拒絕了。晉文公心里有一千個理由要懲治衛國,怎么能和衛國會盟呢。衛成公無奈,為了生存,只能繼續結好于楚國和魯國,但衛國的大夫民眾不答應了,他們趕走了衛成公,以取悅晉國。衛成公從都城逃奔了衛國的襄牛城暫避。此時晉軍不費一兵一卒,已經可以在衛國境內隨意馳騁。
魯僖公此時看到了晉軍攻打曹國的形勢,知道曹國兵敗是早晚的事,宋、齊得到晉國這樣的強援,局面開始變得復雜了。僖公問臧文仲:“晉國出兵中原,魯國可就夾在楚、晉中間了,如何是好?”文仲回到:“國君,魯國現在不是夾在晉楚之間,魯國現在是與楚結盟,晉國攻打曹、衛,目的是為宋、齊解困。楚國必會要求魯國出兵救援曹、衛,那咱們魯國不就與晉國直接對壘了?”
僖公道:“寡人要避免那樣的情況發生。晉國自從改革田制、軍制以來,國力顯著提升,晉侯歸國后,經過五年的治理,其軍力更是所向披靡。更何況,晉國與周天子往來密切,魯國不能與晉國為敵啊!”
臧文仲問:“楚國如若要求魯國出兵援助曹、衛,咱們魯國也只能服從楚國的命令呀;現在的問題是:出兵援曹、衛,則與晉戰;不出兵救援曹、衛,則與楚戰。”
僖公沉思了一下,他是最善于在復雜的局面中尋找縫隙走出來的,十多年前,他就是用這樣的智慧從齊國臨淄脫身返回曲阜的。這次也不例外,他說:“魯國先出兵協防衛國,畢竟與衛國有盟約,但不要出兵太多,先觀察一下晉軍動向。傳寡人詔命:公子買率兵車二百乘、軍士五千前往衛國協防。無寡人詔命,不得與晉軍開戰。”
看到晉軍攻打曹國,楚國也調整了軍力部署。楚成王親自坐鎮在距離中原比較近的申縣,楚成王分析,目前晉軍的主力接近四萬人,正在攻打曹國,曹國是擋不住的,晉軍的下一個目標必然是衛國,因此必須守住衛國,在衛國擋住晉國軍隊,只有先擊敗晉軍,宋、齊兩國就不在話下。于是楚成王再次增派楚國軍隊向衛國進發,同時詔命由叔侯率領的戍守在齊國谷城的楚軍、由成得臣率領的攻打宋國的楚軍撤退,與前往衛國增援的楚軍會合。楚成王詔命中說:“不要追擊晉國軍隊。晉侯在外十九年,最終得到了晉國。險阻艱難全都嘗過了,民情的真偽他都知道。上天給予他年壽,去除了他的災禍。上天所設置的,難道可以廢除嗎?《軍志》上說要適可而止、知難而退、有德者不可敵,這三條都適用于晉國。”令尹成得臣派大夫斗椒向楚成王請戰,說:“臣等愿與晉軍決戰,不敢奢望一戰全勝,但愿以此堵住小人的悠悠之口?!边@是有“將在外,君命有所不受”的意思了。楚成王接報大怒,沒有給他們派出大軍協助,只有西廣、楚太子東宮的部隊、還有公子若敖率領的兵車一百八十乘跟隨成得臣、斗椒開向晉軍所在的方向。
包圍曹國后,晉軍開始攻城。攻打城門的晉國士兵戰死了很多人,曹軍把晉軍的尸體陳列在城墻上,晉文公很是憂慮,他采納了士兵們建議,聲稱“晉軍將在曹國人的墓地宿營?!币驗椴車说哪沟卦诔峭猓苘娭髁Υ蠖际浅莾鹊膰耍瑫x軍在曹國人的墓地宿營,會驚擾了他們祖先的魂靈,曹軍很恐懼,把陳列在城墻上的晉軍尸體裝殮進棺材運出城來。晉軍借機大舉攻城,三月初八日,攻入了曹國,俘虜了曹國國君曹共公。晉文公歷數曹共公的罪過:不重用僖負羈;彈丸之國有乘車駕的大夫三百余人;在晉侯途徑曹國時,曹共公偷看晉侯沐浴。曹國國君實屬罪有應得。
晉文公下令:不許進入僖負羈家宅騷擾,赦免僖負羈家族所有人,以報當年僖負羈對寡人的禮遇之恩。晉軍將領魏武子、顛頡怒氣很大,說:“不替有功勞的人著想,算什么報恩!”這兩位都有跟隨晉文公流亡的功勞,而晉文公設置三軍將領時,魏武子只是戎右,顛頡官職更低,沒有被任命為三軍的統領,反而讓很多沒有跟隨國君流亡的人統領三軍,二人因此憤懣不平,帶人放火燒了僖負羈的宅院。晉文公大怒,想要殺了魏武子,但魏武子在戰場上胸部受傷,晉文公愛惜他的才干,就派人送東西過去,察看一下他的傷情,如果傷得很重,就殺了他。魏武子捆緊胸膛出來與使者相見,對使者說:“托國君的福,魏犫(魏武子)安好!”說完就向上、向前跳了好多次,晉文公最后饒恕了他,殺掉了顛頡并通報全軍,引以為戒。魏武子被撤掉了戎右之職,由大夫舟之橋接替。
宋國派大夫門尹般到晉軍中告急,晉文公對諸位將領說:“宋國前來告急,放棄宋國就等于斷絕交往,中原將拱手讓人;請求楚國解除對宋國的圍困,楚國也不會同意。寡人欲力戰救宋,齊國和秦國又不同意,如何是好?”中軍元帥先軫說:“臣有一策,國君可以讓宋國向齊國和秦國贈送大量財物,請求齊、秦兩國為宋國向楚國請和。我們晉軍破曹國、俘虜曹君,分一部分曹國和衛國的土地給宋國。楚國與曹、衛兩國是同盟,必定不會答應齊、秦講和的請求;齊、秦兩國收受了宋國的重禮財物,面對固執的楚國,就更會支持我們與楚一戰。”晉文公聽后非常高興,將曹共公交予宋國看管,并將曹、衛的一部分土地贈給了宋國。
魯僖公看到戰局的進展逐漸變得對晉國有利,有些后悔出兵幫助楚國前往衛國協防。衛成公已從都城出居襄牛城,衛國現在已聽命于晉國。如果在接下來晉國與楚國的對戰中,晉國真的取勝,那么晉文公定會討伐協助過楚國的魯國。好在魯軍在衛國還沒有與晉軍開戰,僖公馬上派特使前往駐扎在衛國的魯軍營中頒布詔命,命魯軍撤回國內,并命特使于軍中斬殺領軍將領公子買。同時又派出使者分赴楚軍、晉軍營中,向楚軍通告:協防衛國的魯軍將領公子買不服從命令,戍守期限未到就擅自歸國,現予以誅殺。而魯國使者向晉侯通告的是:魯國愿與晉國盟好,現誅殺駐扎在衛國的魯軍統領公子買,將魯國軍隊撤回到魯國境內。楚國君臣對戰局意見不一,魯國誅殺擅離職守的統軍將領,對他們來說沒有當回事。晉文公接到魯國使者的稟告,覺得意義重大,這意味著楚國在中原減少了一個強有力的盟友,而晉國則增加了一個千乘大國與晉同盟,兩大陣營實力此消彼長,對晉國無疑是個好消息!晉文公大喜,對魯國使者說:“貴使回去轉告魯侯,后會有期!”