晉獻公晚年為女色所迷,寵愛骊姬姐妹,害死太子申生,逼迫另外兩個兒子重耳、夷吾逃亡,引發了一場長達20年的政治動蕩。
由于受到骊姬姐妹的挑唆,晉獻公欲廢黜太子申生,另立骊姬所生之子奚齊為太子。然而申生、重耳、夷吾等幾位年紀較長的公子都有師保私屬,勢力頗大,不安分的骊姬未敢貿然行事。後來,骊姬勾結一班寵臣,不斷離間獻公父子關系。獻公二十二年(前655年),骊姬設計陷害三位公子,結果申生被迫自殺,重耳、夷吾則被迫流亡在外,史稱“骊姬之亂”。
重耳踏上逃亡之路後,帶着一幹從人投奔到了她母親的娘家狄人部落。當時的晉國國君晉惠公恐怕重耳對自己不利,派人前往狄地行刺,重耳得知,便又率領着一幹随從離開了已住了12年的狄地,投奔到了齊國。齊桓公以貴賓之禮接待了重耳,并以宗室女姜氏給他做了妻子,又賜馬80匹。重耳在這裡安心住了兩年,後來桓公死,齊國發生了諸公子争君位之亂,重耳雖然不想離開這裡,但他的随從們灌醉了他,之後便将他帶離了齊國。
此後,重耳又相繼到達了曹國、宋國、鄭國、楚國。在楚國時,楚成王甚至以國君之禮接待了重耳。有一次在宴會上,楚成王問重耳道:“若是你有幸回國登上君位,那麼你将以何禮對待我呢?”重耳說:“美女财物,您都已經有了。稀奇的東西,您的土地上也不缺乏。晉國實一小國,真不知道如何報答您的盛情。”但楚王偏要重耳想出一個報答的方式,于是重耳便說道:“如果楚、晉兩軍相遇于中原,那麼晉軍就會退避三舍(90裡)以報答您今日的盛情。”重耳在楚國待了幾個月之後,楚成王又把他送到了秦國,因為那裡距離晉國較近,方便重耳成就大事。到了秦國後,秦穆公厚待重耳,以宗室五女給重耳做了妻妾。惠公十四年(前637年)九月,惠公病死,從秦國潛逃回來的太子圉即位,可是他很不得人心。次年二月,晉國百姓知公子重耳在秦國,于是便暗中勸他返晉為君。重耳答應,秦穆公便又派了軍隊護送重耳回國,新君最終被重耳派人殺死。接着重耳即位為新的晉君,此時已距離他逃亡在外已逾十九載。
重耳成為晉國國君後,在秦穆公的幫助下,迅速平息内亂,開始緻力于國内改革與創建霸業的行動。此後,晉國不斷插手中原事務,終于同楚國在中原的霸權發生了矛盾。
晉文公四年(前632年),文公決定讨伐曹、衛兩國。當時楚國大軍在大将子玉的帶領下正圍攻宋國的都城,楚成王知道晉軍鋒芒正盛不可與戰,偏偏子玉立功心切,自恃兵力衆多,居然對于成王的命令不予理睬。晉文公又故意激怒子玉,于是子玉便撤了宋都之圍,率軍進攻晉軍。
當兩軍相遇時,晉文公下令晉軍後撤,從原來的前線到城濮,晉軍一共後撤了90裡路,正符合重耳當年向楚成王的承諾――退避三舍。其實“退避三舍”并非晉文公簡單的報恩,而是具有政治和軍事上的現實意義的。在政治上,晉文公看似禮讓的後撤赢得了輿論上的同情;在軍事上,晉文公集中兵力,搶先占領了有利地形。讓一鼓作氣而來的楚軍撲了一個空,士氣大減,又不得不繼續北上,疲勞進攻以逸待勞的晉軍。這年四月,雙方戰于城濮,晉軍以誘敵深入之計,以逸待勞打了楚(陳、蔡)聯軍一個措手不及。雖然被重點攻擊的是陳、蔡兩國的軍隊,楚國作為中軍并未受到多大損失,但是士氣已喪,最終子玉不得不下令撤退,楚軍由此狼狽而歸。
就這樣,我國曆史上又一場以少勝多的著名戰例被寫就了,作為楚軍主帥的子玉不久便自殺以謝國人。
城濮之戰結束後,楚國的盟國紛紛倒向了晉國,與之結盟。同年五月,晉文公在踐土給周襄王修了行宮,并請周襄王到鄭國的踐土大會諸侯,還把陳、蔡和楚國的俘虜獻給了周天子。周襄王賜晉文公以大辂之服、戎辂之服、彤弓等物和虎贲300人,策命為侯伯。晉及齊、魯、宋、衛等七國國君和周王室大臣王子虎訂立盟約,正式稱晉文公為盟主。不久又會諸侯于溫,周襄王也被請赴會,任命晉文公為諸侯之長,命他安撫四方,監督和懲治危害周天子的人。至此,晉文公正式成為了齊桓公之後的又一霸主。