在曹操出兵进攻刘备的时候,许都空虚。消息传到河北,袁绍的谋士田丰认为,这正是攻下曹操大本营的好机会,应该发兵去袭击许都。曹操的部下早已提醒过曹操,要提防袁绍乘虚进袭。曹操认为袁绍优柔寡断,遇事迟疑,必定不会当机立断。果然不出曹操所料,袁绍竟借口小儿子有病,没有接受田丰的建议。田丰气得用手杖戳着地面说:“可惜呀可惜!这种难得的机会,竟拿婴儿患病做理由而失掉了!”
建安五年(公元200年)正月,刘备战败来邺城(今河北省临漳县)投靠袁绍,袁绍才召集众将讨论如何进攻许都。田丰认为形势已经发生了重大变化,再去进攻许都是不利的。他劝阻袁绍说:“曹操既然已经打败刘备,许都就不再是空虚的了。况且曹操很会用兵,机智灵活,变化莫测;曹军人数虽少,却不可轻视。今后不如作持久的打算。您占据山河险固的广大地方,又拥有四州的众多人口,应当利用这个有利形势,对外结交英雄豪杰,对内治理农事,充实军力。然后选派精兵,乘虚袭扰曹操的两侧,展开流动作战,使曹军左右奔跑,疲于奔命;使那里的百姓得不到安宁,怨恨曹操。这样一来,用不上两年时间,我们就可以不战而胜。如果不这样办,而急于同曹操决战,万一失败,后悔可就晚了!”(原文见《三国志·袁绍传》)田丰从实际出发的分析是很有道理的。可是光有野心、没有谋略的袁绍不但一丝儿也听不进去,反而对田丰起了反感。田丰不管这些,还是再三地陈明利害,向袁绍提出忠告。这一下子可惹恼了袁绍。袁绍在盛怒之下,竟给田丰加上一个“扰乱军心”的罪名,下令把他囚禁起来。后来官渡一战,袁绍果然大败而还,他因为怕别人讥笑,干脆把田丰杀死了。
建安五年二月,袁绍把10万大军集结在黄河北岸的黎阳(今河南省浚县东北),准备渡河南进,直捣许都;并首先派大将颜良进攻白马(在今河南省滑县东北)。四月,曹操从官渡率兵北上,去解救袁绍对白马的围困。他采纳随军谋士荀攸〔you优〕声东击西的作战方案,引兵先到延津(今河南省延津县北),假装要渡河去袭击袁绍的后方,使袁绍分兵应战;然后再以轻骑部队回袭白马,攻其不备。袁绍不知是计,果然派出一部分军队赶往延津去迎战。曹操立即率领轻骑兵,以张辽、关羽为先锋,向白马挺进。曹军来到离白马10余里的地方,颜良才发觉,慌忙上马应战。关羽出其不意地突入袁军阵中,手起刀落,斩了颜良。主帅被杀,袁军立刻大乱,有的被杀,有的被俘,有的逃跑,一下子就完蛋了。战斗结束以后,曹操下令白马城中的居民全部迁出,随着军队沿黄河向官渡撤退。
袁绍听说曹操从白马退出,便亲自率领大军渡河追击,恨不得一口把曹军吞掉。谋士沮〔ju举〕授劝阻他说:“战争胜负的变化,不能不仔细考虑。现在最好还是驻军在延津,分出一部分兵力去进攻官渡。如果能攻下,留驻延津的大军再继续前进,也不算晚,如果大军盲目南进,万一失利,就会有全军覆没的危险。”但是袁绍拒绝了沮授的正确建议,命令主力部队渡河追击。沮授料到袁绍一定要失败,在大军渡河的时候,他不禁叹息说:“黄河呀黄河!我们还能再渡河回来吗?”于是借口有病,请求辞职。袁绍不允许,反而把他指挥的部队抽出一部分给郭图指挥。
袁绍的先头部队迅速地向延津迫近。曹操命令士兵在延津南面山坡下扎好营寨,派瞭望哨侦察袁军动静。瞭望哨发现袁军,立刻向曹操报告说:“袁绍派了五六百骑兵赶来了。”过了一会,又报告说:“袁军骑兵又有增加,步兵多得数不过来。”曹操部下的将领们都认为敌军众多,恐怕难以抵挡,主张退守营垒。曹操一面命令不用再来报告,一面却让自己所有的骑兵都卸下马鞍,放马吃草,辎重车辆都停在袁军将要经过的路上。将领们觉得挺奇怪,只有谋士荀攸领会曹操的用意,对大家说:“这样正是为了引诱敌人来上钩,怎么能后退呢?”不久,袁绍的将领文丑等人率领五六千人马,先后来到延津。曹军将领们感到情况紧急,催请曹操下令上马应战。曹操非常沉着,对他们说:“还不到时候呢。”又过了片刻,袁军后续部队大部分赶到,他们看到曹军把军用物资抛在路上,便争先恐后地去抢夺,乱成一片。曹操立刻指挥全部骑兵一齐上马冲杀,把袁军杀得大败,斩了袁绍的大将文丑,俘虏了文丑的全部人马。
延津获胜以后,曹操把部队从容撤回到利于防守的官渡,以诱敌深入,准备决战。