周襄王十八年(公元前634年)冬,楚成王为了争夺中原霸权,借口原来屈服于楚国的宋国(在今河南省东部)投靠了晋国,亲自率领楚军和郑、陈、蔡、许等附庸国的军队,去攻打宋国,把宋国的国都商丘(今河南省商丘市)包围了起来。宋成公打发大司马公孙固到晋国去求救兵。晋国的大夫先轸〔zhen枕〕和狐偃〔yan演〕都主张出兵救宋。但是从实力说,楚比晋强,而且楚国还有许多盟国,声势很大;从地理上说,宋国并不靠近晋国,远道援宋,军队给养有困难,因此,晋文公一下子决定不下来。针对这一情况,狐偃提出了进攻曹、卫以解宋围的策略。卫国和曹国正好夹在晋国和宋国中间。他对晋文公说:“听说最近楚国才降服了曹国,又和卫国结了亲,它们是楚国的盟国。我们如果去打这两个国家,楚国必然来救。这样,宋国的围就可以不救自解了。”晋文公采纳了这个建议,答应了公孙固的请求,要他先回国去,告诉宋成公守住都城,晋国大军随后就到。晋文公立即把晋国原来的上下两军,扩充为中、上、下三军(每军约12500人),迅速组成了一支强大的战斗部队。
重耳说:“将来晋楚两国万一发生战争,我一定叫晋军‘退避三舍’。”
周襄王二十年(公元前632年)正月,晋文公把军队集中在晋国和卫国的边境上,借口他从前流亡到曹国的时候,曹共公对他不礼貌,要求卫国借条道给他去攻打曹国。卫国不答应,晋文公就派兵先打卫国,攻占了卫国的五鹿城(今河南省濮阳县)。这一来可吓慌了卫成公,他连忙派人向晋文公求和,但是被晋文公拒绝了。卫成公又想去向楚国求救兵,可是卫国人民不满意卫成公,把卫成公赶出了国都楚丘(今河南省滑县)。晋文公接着挥兵南下,围攻曹国都城陶丘(今山东省定陶县西南),三月攻下陶丘,俘虏了曹国国君曹共公。为了取得曹国人民的支持,晋文公当众宣布了曹共公的罪状,说他不重用贤臣僖负羁。晋文公还命令晋军不得进入僖负羁的住宅,保护僖负羁的家族的安全,以表示对贤者的尊敬。为了严肃军纪,晋文公下令把违抗命令的武将颠颉〔jie杰〕斩首,号令全军。晋军军纪严明,战斗力提高了。为了扩大楚、宋两国之间的矛盾,晋文公命令把俘获的曹共公交给宋军看管。