晉文公即位以後,整頓內政,發展生產,把晉國治理得漸漸強盛起來。他也想能像齊桓公那樣,做個中原的霸主。
這時候,正好周朝的天子周襄王派人來討救兵。周襄王有個異母兄弟叫太叔帶,聯合了一些大臣,向狄國借兵,奪了王位。周襄王帶著幾十個隨從逃到鄭國。他發出命令,要求各國諸侯護送他回洛邑去。列國諸侯有派人去慰問天子的,也有送食物去的,可就是沒有人願意發兵打狄人。
有人對周襄王說:「現在諸侯當中,只有秦、晉兩國有力量打退狄人,別人恐怕不中用。」襄王才打發使者去請晉文公護送他回朝。
晉文公馬上發兵往東打過去,把狄人打敗,又殺了太叔帶和他那一幫人,護送天子回到京城。
過了兩年,又有宋襄公的兒子宋成公來討救兵,說楚國派大將成得臣率領楚、陳、蔡、鄭、許五國兵馬攻打宋國。大臣們都說:「楚國老是欺負中原諸侯,主公要扶助有困難的國家,建立霸業,這可是時候啦。」
晉文公早就看出,要當上中原霸主,就得打敗楚國。他就擴充隊伍,建立了三個軍,浩浩蕩蕩去救宋國。
公元前632年,晉軍打下了歸附楚國的兩個小國——曹國和衛國,把兩國國君都俘虜了。
楚成王本來並不想同晉文公交戰,聽到晉國出兵,立刻派人下命令叫成得臣退兵。可是成得臣以為宋國遲早可以拿下來,不肯半途而廢。他派部將去對楚成王說:「我雖然不敢說一定打勝仗,也要拼一個死活。」
楚成王很不痛快,只派了少量兵力歸成得臣指揮。
成得臣先派人通知晉軍,要他們釋放衛、曹兩國國君。晉文公卻暗地通知這兩國國君,答應恢復他們的君位,但是要他們先跟楚國斷交。曹、衛兩國真的按晉文公的意思辦了。
成得臣本想救這兩個國家,不料他們倒先來跟楚國絕交。這一來,真氣得他雙腳直跳。他嚷著說:「這分明是重耳這個老賊逼他們做的。」他立即下令,催動全軍趕到晉軍駐紮的地方去。
楚軍一進軍,晉文公立刻命令往後撤。晉軍中有些將士可想不開啦,說:「我們的統帥是國君,對方帶兵的是臣子,哪有國君讓臣子的理兒?」
狐偃解釋說:「打仗先要憑個理,理直氣就壯。當初楚王曾經幫助過主公,主公在楚王面前答應過:要是兩國交戰,晉國情願退避三舍。今天後撤,就是為了實現這個諾言啊。要是我們對楚國失了信,那麼我們就理虧了。我們退了兵,如果他們還不罷休,步步進逼,那就是他們輸了理,我們再跟他們交手還不遲。」
晉軍一口氣後撤了九十里,到了城濮(今山東鄄城西南),才停下來,佈置好了陣勢。
楚國有些將軍見晉軍後撤,想停止進攻。可是成得臣卻不答應,一步盯一步地追到城濮,跟晉軍遙遙相對。
成得臣還派人向晉文公下戰書,措詞十分傲慢。晉文公也派人回答說:「貴國的恩惠,我們從來都不敢忘記,所以退讓到這兒。現在既然你們不肯諒解,那末只好在戰場上比個高低啦。」
大戰展開了。才一交手,晉國的將軍用兩面大旗,指揮軍隊向後敗退。他們還在戰車後面拖著伐下的樹枝,戰車後退時,地下揚起一陣陣的塵土,顯出十分慌亂的模樣。
成得臣一向驕傲自大,不把晉人放在眼裡。他不顧前後地直追上去,正中了晉軍的埋伏。晉軍的中軍精銳,猛衝過來,把成得臣的軍隊攔腰切斷。原來假裝敗退的晉軍又回過頭來,前後夾擊,把楚軍殺得七零八落。
晉文公連忙下令,吩咐將士們只要把楚軍趕跑就是了,不再追殺。成得臣帶了敗兵殘將回到半路上,自己覺得沒法向楚成王交代,就自殺了。
晉軍佔領了楚國營地。把楚軍遺棄下來的糧食吃了三天,才凱旋回國。
晉國打敗楚國的消息傳到周都洛邑,周襄王和大臣都認為晉文公立了大功。周襄王還親自到踐土(今河南原陽西南,踐音jian)慰勞晉軍。晉文公趁此機會,在踐土給天子造了一座新宮,還約了各國諸侯開個大會,訂立盟約。這樣,晉文公就當上了中原的霸主。