晉文公把晉國的內部事物安頓好,眼看著國家一天天強大了,就開始向中原地區發展了。這時,齊國已經衰落,南邊的楚國卻強大起來,黃河以南的大片土地都成為楚國的勢力範圍,楚成王還不斷把自己的勢力向北滲透。這樣一來,晉楚兩國的矛盾和衝突就變得越來越尖銳。
周襄王十八年(公元前634年),楚國借宋國投靠晉國為名,派兵攻宋。宋成公派人到晉國求救,晉文公召集群臣商議對策。大將軍先軫說:“現在能和晉國抗衡的隻有楚國,主公想稱霸諸侯,就一定要打敗楚國。”狐偃等人都同意先軫的意見,還說:“楚國不久前剛把曹國拉過去,又和衛國結成親家,現在他們三國正是關係最好的時候,曹、衛兩國與我們積怨甚久,我們隻好先出兵去攻打這兩個國家,楚國一定會去救,這樣一來,宋國的圍就可解了,我們的仇也報了,豈不一舉兩得嗎?”這個意見得到大家的讚同,晉文公決定出兵。
周襄王二十年(公元前632年),晉國出兵討伐曹、衛。晉軍人多勢眾,軍紀嚴明,沒幾天就打下了這兩個小國。但楚國還是圍著宋國不肯撤兵。晉文公感到十分為難,他對先軫說:“如不援救宋國,他勢必與我們一刀兩斷。要去救他,又免不了與楚國有一場惡戰,而光靠我們自己的力量未必就能打敗楚國,最好能聯合齊、秦兩國一起攻楚。隻是齊、秦素來與楚無怨,怎樣才能讓他們幫我們呢?”先軫說:“這有何難?讓宋國用貴重禮物賄賂齊、秦兩國,請這兩國為宋說情,求楚國退兵。如果楚不同意退兵,齊秦就會認為不給他們麵子,到那時,我們聯合他們去攻打楚國,準保能成。”
過了幾天,齊秦兩國的使者正在楚國大將軍成得臣麵前替宋國說情,隻見有人來報說宋國仗著晉國的勢力,把曹、衛兩國的土地都占了。成得臣一怒之下說道:“宋國這樣欺負我們的保護國,明明是看不起我們楚國,還有什麽和好講。”齊秦兩國使者弄了個沒趣,隻好離去。晉文公早就派人等在半路上,把兩位使臣請到晉軍大營之中,設宴款待,對他們說;“楚國將領太狂妄了,當麵羞辱二位,我們馬上就要向楚開戰,請你們兩國多多協助。”兩位使臣當即同意。
楚成王一聽說晉、齊、秦三國聯盟,感到勢力有些單薄,就派人通知成得臣退兵,並對他說:“晉侯在外奔波多年,現在都六十多歲了,很有經驗,我們未必打得過,不如盡早收兵吧。”成得臣卻回答說:“拿下宋國隻不過是早晚的事了,現在撤兵太可惜,請主公再準我打幾天,戰勝了宋國再班師回朝。”
成得臣為早日取勝,加緊攻打宋國,卻不斷遭到宋國軍民拚命抵抗,楚軍一時也攻不進城去。這時晉文公又設計使曹、衛兩國寫信與楚斷交,並把成得臣的使者扣下。這一來把個火爆脾氣的成得臣氣得七竅生煙,令三軍立即解除對宋國的包圍,集中兵力與晉軍直接作戰。
這時晉軍的力量雖稍弱於楚軍,且又遠離本國作戰,但已占領曹、衛兩國作為前進的基地,況且齊、秦已與他結成聯盟,從而也很有實力。當晉、楚兩軍直接相對,正要開戰時,狐偃對晉文公說:“當初您在楚國為客時,曾對楚王說,萬一交戰,晉軍一定退避三舍。現在可不能失信啊。”晉文公聽了不語,身邊的部將都紛紛反對。狐偃又說:“成得臣雖猖狂,但楚王的恩情我們不能忘。我們退避三舍正是對楚王表示謝意,並非怕成得臣啊。”大家聽狐偃講得有道理,就同意了。
楚軍見晉退兵,以為晉軍害怕了,就在後麵追。晉軍將士奉命撤退,見楚軍這樣氣盛、猖狂,不由得暗下決心,一定要打敗楚軍。晉軍一退就是九十裏,待紮下營來,成得臣派人送的戰書也就到了。第二天兩軍對壘,都想借此一仗置對方於死地。
交戰開始,晉軍主帥先軫派三軍中的下軍去攻由陳、蔡聯軍組成的楚軍中的右軍。這是一個薄弱環節,晉軍一個衝鋒就將陳蔡聯軍擊潰了。接著先軫又命上軍主將狐毛假充晉軍主帥,迷惑對方。楚左軍主將鬥宜申看見晉軍主帥旗幟,便馬上指揮兵士衝殺過來,狐毛抵擋幾下假意敗逃,鬥宜申不知是計,緊緊追趕。眼看就要追上,忽聽一陣鼓聲,晉軍主帥先軫率精銳部隊攔腰殺出,狐毛也率隊反擊,兩邊夾擊,楚軍頓時慌亂。成得臣見勢不好,急令收兵,才幸免全軍覆沒。
楚軍戰敗的消息傳到了楚成王耳朵裏,他本來就不滿成得臣一意孤行,現在又看傷亡慘重,不由得大罵道:“隨他出征的戰士死亡這樣多,他還有什麽臉回來!”成得臣聽到此話,羞愧萬分就自殺了。
晉軍大勝的消息傳到洛陽,周襄王派人慰勞晉文公。晉文公把俘獲的一千名楚兵和一百輛戰車獻給周王。周王又賜給晉文公紅色弓箭和黑色弓箭各一百張。在那個時候,周天子賜弓箭給諸侯,是種很高的獎賞,表示允許這個諸侯自由征伐其他諸侯。這時,晉文公在諸侯中的威望很高了,他借此機會會合諸侯,飲血為盟,當上了霸主。