然而,程認為遲早會把它取下來,不肯半途而廢。他派了壹個部將對楚成王說:“雖然不敢說壹定會打勝仗,但我會戰鬥到死。”楚成王很不高興,只派了壹個大臣指揮的少量部隊。程首先派人通知晉軍,要求他們釋放魏王和曹王。晉文公秘密通知這兩個國家的君主,他答應恢復他們的王位,但要求他們首先與楚國斷交。曹和魏果然按照的意思做了。成想挽救這兩個國家,卻先和楚國斷交了。這壹來,他氣得雙腳直跳。他喊道:“這明明是重耳這個老賊做的。”他立刻命令全軍向晉軍駐紮的地方奔去。儲君壹進入,晉文公就立即下令撤退。晉軍中有些士兵不能善罷甘休,說:“我們的統帥是君主,對方是臣子。君主怎能讓臣子說理?”胡巖解釋說:“打仗要靠壹個理由,有了信心才能強大。當初楚王曾經幫助過主公,主公當著楚王的面承諾,如果兩國開戰,晉國寧願遠離。今天的靜修就是為了兌現這個承諾。如果我們對楚失去信心,那我們就錯了。我們已經撤軍了。如果他們不停止,壹步壹步推進,那就是他們已經失去理智,我們再打他們也不遲。”金軍壹口氣退了90裏,到了城濮(今山東鄄城西南),才停下來布置戰鬥。楚國的壹些將軍看到晉軍撤退,想停止進攻。然而,程拒絕了,並壹步步追趕城濮,遠離金軍。
程也派人來挑戰,而且措辭非常傲慢。晉文公也派人回話:“我們從來不敢忘記妳的恩情,所以我們在這裏讓步了。現在妳不會理解,妳將不得不在戰場上競爭。”戰爭開始了。只打了壹仗,晉國將軍就用兩面旗幟指揮軍隊向後撤退。他們還在戰車後面拖著砍下的樹枝,戰車後退的時候,地下揚起壹波又壹波的塵土,呈現出非常狼狽的樣子。程壹向驕橫,不把晉人當回事。他不分前後追上去,正中金軍的埋伏。晉軍的精英沖了過來,切斷了成的軍隊。原來是假裝戰敗的晉軍掉頭前後夾擊,把楚軍殺得體無完膚。晉文公連忙下令,士兵們只管把儲君趕走,不再追趕。程帶著敗兵和殘兵返回半路,覺得無法向楚成王交代,於是自殺。晉軍占領了楚營。吃了三天楚軍遺棄的糧食,才凱旋而歸。晉打敗楚的消息傳到了周朝的都城洛邑,周襄王和他的大臣們都認為立下了大功。周襄王還親自到建土(今殷鑒晉安原陽西南)慰問晉軍。晉文公借此機會在建圖為皇帝建造了壹座新的宮殿,還邀請了世界各地的諸侯開會並締結盟約。就這樣,晉文公成了中原的霸主。這就是“城濮之戰”。