公元前633年,楚派将军率领楚、陈、蔡、郑、徐五国联军攻打宋。
宋国国君宋成公向晋国求救。晋国的大臣们都同意出兵救援宋国,因为这可以 借扶助弱国之机,建立霸业。要知道,要想取得中原霸主的地位,就必须打败楚国。于是,他组建了三路大军去救援宋国。公元前632年,晋军先后攻克了归附楚国的曹国和卫国,俘虏了两国国君。
楚成王本来就不想与晋文公交战,一听说晋国出兵助宋,立刻命令成得臣退兵。成得臣接到命令,先派人要求晋军释放卫、曹两国国君。晋文公许诺曹、卫两国国君,恢复他们的君位,先决条件是他们须跟楚国断交。曹、卫两国都按晋文公的条件与楚国绝交。
成得臣本想救这两个国家,不料这两个国家不讲道义倒先来跟楚国绝交,就率领全军冲向晋军大营。晋文公立刻命令晋军后撤。许多晋军将领对此举不理解。狐偃 解释说,当年楚王曾经帮助过主公,主公在楚王面前曾许诺:如果两国交战,晋国会撤退。今天之所以后撤,就是为了信守这个诺言。
晋军向后撤了90里停下来,在城濮(今山东鄄城西南)布置好了阵势。楚军尾追到城濮,跟晋军对峙。
大战刚一展开,晋军又向后败退。后撤时,他们在战车后面拖着树枝,使地下扬起高高的尘土。高傲的成得臣看到尘土高扬,断定败退的晋军十分慌乱,就不顾一 切地指挥军队紧追不舍。这恰好中了晋军设下的埋伏。晋军的伏兵冲杀过来,把成得臣的军队首尾切断。佯败的晋军也返身杀回,前后夹击,楚军大败。晋文公命令 停止追击。成得臣在败退途中,羞愧自杀。
晋国打败楚国的消息传到周都洛邑,周襄王和大臣们都认为晋文公立了大功。晋文公趁机约了各国诸侯赴会,订立盟约,成为中原霸主。
古时候行军,每30里为一“舍”,“退避三舍”就是主动后退90里的意思。现在比喻主动对人让步,不与之相争。