但统帅子玉刚愎自用,不听成王知难而退的告诫,坚决不撤宋围。成王亦存侥幸取胜心理,又给子玉补充了少量兵力。子玉为寻找借口与晋决战,提出晋要曹、卫复国才解宋围的要求。晋文公不好公开拒绝,遂将计就计,私下答应曹、卫复国,但必须以与楚断交为条件,同时扣留楚国使者,以激怒子玉北上决战。
果然,子玉忿而北上,弃宋直扑曹都陶丘(今山东定陶东北)的晋军驻地。晋文公下令全军“退避三舍”(一舍30里),以答谢自己过去流亡楚国时受到的礼遇和当时许下的诺言。这样既可以避开楚军锋芒,又可靠拢齐、秦军队,便于声援。城濮之战中,子玉以为晋军畏惧,率军追至城濮。两军对垒,晋军分上、中、下三军部署:上军在右,下军在左,中军居中,先轸及晋文公坐镇中军指挥。
楚联军亦按左、中、右三军配置:陈、蔡军编为右军,实力较弱;一部楚军编为左军,战斗力较强;中军为楚军精锐,由子玉指挥。二十一年四月初二,决战开始。晋下军把驾车的马蒙上虎皮,首先向楚右军发起猛攻,陈、蔡军一触即溃,全军瓦解。这时,晋上军竖起两面大旗,并在阵后扬起尘土,佯装后退。
子玉不察虚实,下令左军追击。待其突出之时,晋元帅先轸指挥中军向其暴露翼侧攻击,断其退路,晋上军亦回头夹击。楚左军大部被歼。子玉见两翼均败,大势已去,急忙下令收兵,退回楚地。城濮一战终以晋胜楚败而告终。战后,晋文公在践土给周襄王修了行宫,还把陈、蔡和楚国的俘虏献给周天子。
晋及齐、鲁、宋、卫等七国国君和周王室大臣王子虎订立盟约,正式称晋文公为盟主。不久又会诸侯于温,周襄王也被请赴会,任命晋文公为诸侯之长,命他安抚四方,监督和惩治危害周天子的人,从此晋文公成为诸侯霸主。晋国击破了弥漫中原荆楚入侵势力,压迫其退回原有之桐柏山大别山以南地区,使中原复呈安定之象。
于是中原诸侯之逼于威势而附楚者,鲁、曹、卫、陈、郑等国皆脱离楚国复回至中原集团,听从晋国之领导。后,晋国举办“践土之盟”。此次盟会,周襄王策命晋文公为 “侯伯 ”,并给了晋 文公“敬服王命,以绥四国 ,纠逖王慝 ”的任务,晋拥有了 代表周王室行使征伐大权的 “尚方宝剑 ”。