公元前632年初,晋国准备充分,晋文公亲率三军、七百辆战车横渡黄河,首先进攻卫国,攻克五鹿,并继续向东挺进,占领敛盂,同时派使者出使齐国,成功与齐孝公缔结盟约。齐晋结盟后,晋军逼近卫国都城,卫侯请求讲和,晋文公未接受。卫侯转而寻求楚国庇护,但国民强烈反对,迫使卫侯出走,卫国投降晋军,晋军不费吹灰之力占据了卫国。三月,晋军挥师南下攻曹,攻占曹国都城陶丘,俘虏了曹共公。
原本晋军攻击曹、卫的目的在于诱使楚军北上救援,以解宋国之围。然而,面对曹、卫的紧急求助,楚军并未北上,反而加强对商丘的围攻,宋国再度告急。
面对此困境,晋文公陷入了两难:若不南下救援宋国,宋国可能因力竭而降楚断晋,这将不利于晋国在中原争霸的战略布局;若南下救援宋国,则原有的诱楚北上、在曹、卫地区决战的战略意图难以实现,且晋军兵力有限,远离本土,与强大的楚军正面交锋并无十足胜算。晋文公再次召集群臣商讨,先轸经过深入分析,提出了新的策略:让宋国表面上疏远晋国,派人携带财货贿赂齐、秦两国,请它们出面劝说楚军撤兵。晋国则将曹、卫的部分领土割让给宋国,以坚定宋国抵抗楚国的决心。由于曹、卫原本是楚国的盟友,此举必将激怒楚国,使其拒绝齐、秦的调停。齐、秦两国出于贪财和反感顽固立场,劝解不成,便会倒向晋国,决定出兵共同对抗楚国。
晋文公对先轸提出的计策极为赞同,立即付诸实施。楚国因未能攻克商丘,曹、卫之地又归宋所有,楚成王勃然大怒,果断拒绝了齐、秦两国的调停提议。齐、秦两国身为大国,对于楚国无视其颜面之举颇为愤怒,于是改变中立立场,出兵支持晋国,由此形成了晋、齐、秦三国联手对抗楚国的战略格局,晋、楚两国的力量对比发生了颠覆性转变。
楚成王眼见晋军连破曹、卫,又与齐、秦结盟,深知中原局势对楚极其不利,同时也担忧秦国会趁机袭击楚国后方,于是主动命令楚军撤退至申邑(位于今河南荥阳一带),并指示令尹子玉撤回围攻商丘的部队,以避免与晋军正面冲突。楚成王告诫子玉,晋文公在外流亡十九年才登上晋国王位,经历了无数艰险,是一位不容小觑的人物,行事需审时度势,知难而退。但子玉骄矜自负,未采纳楚成王的忠告,坚持要求与晋军一决胜负,并请求楚成王增派兵力支援。楚成王虽内心纠结,既不愿直接与晋国交战,又寄希望于子玉能侥幸获胜,最终还是批准了子玉的决战请求,仅派遣了六百名王室亲兵予以增援。