晋文公于二十年初率领军队攻占楚国的附属国曹国和卫国想要借此让楚军撤离宋国,结果楚国并没有上晋国的当,依旧攻占宋国。面对这种情况,晋国又想出了一个办法:让宋国去贿赂楚国的同盟国齐和秦,让这两个国家劝说楚国撤出宋国。但是楚国并没有听取齐、秦的建议,反对撤离宋国。这样一来,齐、秦对楚国傲慢的态度感到非常不满,与楚国之间的矛盾也逐渐加深。齐、秦放弃与楚国进行结盟,转而选择与晋国结盟。晋国得到了齐、秦、宋三国的鼎力相助,楚国也逐渐意识到了事情的严重性。
于是,楚成王带领军队率先撤离宋国,以避免秦国在后面进行夹击。楚国的将领子玉对此感到不服气,并不听从楚成王的劝告,竟然狂妄地认为自己能跟晋军进行一番较量。在子玉极力劝说楚成王的情况下,楚成王才勉强派出一部分兵力去支援子玉。子玉得到兵力以后,便对晋国提出要求,让晋国重新为曹、卫复国,晋国一面在暗中许诺帮曹、卫复国,又让他们与楚国绝交,一面又把楚国的使者给扣押,这使得子玉非常愤怒。子玉果断出兵,晋文公为了避开楚军的锋芒,于是退避三舍到了城濮。在城濮展开的战争中,晋军先击溃较弱的楚右军,又诱惑楚左军进行攻击,把左军击溃。最后,子玉认为大局已定宣布撤兵,又觉得自己无脸再回楚国便在半路上自杀了。