袁绍兼四州之地,拥兵十万,实力远在曹操之上,曹军“诸将以为不可敌”。荀彧、郭嘉详细分析了双方的短长,曹操也激励众将说:袁绍“志大而智小,色厉而胆薄,忌克而少威,兵多并分画不明,将骄而政令不一”,是能够战胜的。由此,曹操集团才增强了决战的信心。
建安四年(199)八月,曹军进至黎阳(今河南浚县),九月,退守官渡(今河南中牟县)。次年正月,袁绍发布讨曹檄文,二月,大军开进黎阳。同时,派大将颜良渡过黄河,围白马(今河南滑县),攻曹东郡太守刘延,曹操听从荀攸分兵声东击西之计,领兵自官渡北向延津(今河南延津),佯装去抄袁绍后方。袁绍中计,分兵增援延津。曹操便掉头轻骑兼程直奔白马,颜良仓促应战,被杀,白马之围遂解。袁绍闻讯派兵追赶。曹操将辎重沿路弃置,诱袁军争抢,趁乱出击,大败袁军,斩大将文丑。然后,胜利回师官渡。
袁绍败了两阵,不听谋士劝说,急于求战,进军至官渡,“依沙塠为屯,东西数十里”。曹军也分营对峙,交战失利后,坚壁不战。袁绍利用自己人力、物力的优势,堆土山,居高用箭射击曹军。曹兵在营中往来都必须用盾牌护身。于是,曹操命工匠造“霹雳车”,发射石块打击袁军。袁军又暗中挖地道,企图通入曹营。曹军便在营内挖长沟,破坏袁军地道。两军如此兵来将挡,攻战一月多,不分高下。
曹操兵少粮缺,士卒疲惫,与袁军对抗难以坚持。他打算撤兵,写信去许昌问荀彧。荀彧说,不能后退,只要坚持,胜利有望。于是,曹操坚守官渡,寻找战机。
袁绍大军屯官渡,战线过长,粮食从后方运来,粮秣供给不足。曹操看到袁军这一弱点,用荀攸计,趁袁绍运粮车快到官渡时,派徐晃截击,将袁军几千车军粮一火焚光。袁绍又重新从河北运粮一万多车屯于官渡大营北面的乌巢(今河南延津)。
袁绍谋士许攸屡建良策,不为袁绍所用,反遭忌恨,因而弃袁投曹。曹操听说许攸来奔,高兴得连鞋子也顾不上穿就迎了出去。许攸受到器重,便把袁绍在乌巢屯粮的情报告诉曹操,建策偷袭乌巢,烧毁军粮。荀攸、贾诩也劝曹操依计行事。曹操当机立断,亲率步骑五千,乘夜赶到乌巢,攻寨烧粮。
袁绍得知曹操袭乌巢,执意只派少数人去援救,而以重兵去劫曹军大营。曹操得报后,并不急于回马大营,而是奋力击溃乌巢袁军,将积粮全部烧光。攻打曹营的袁军在曹军的顽强抵抗下,未能获胜,又听说乌巢积粮被毁,无心恋战。此时,张郃、高览等大将受谋士排斥诬陷,投奔曹操,袁军军心动摇。曹操乘机发动全面攻势,袁军一败涂地。袁绍留下大量辎重,狼狈逃回河北。他的八万多将士被俘投降,遭曹操残酷坑杀。
在缴获的文件中,有不少是许昌和曹军中人士暗中与袁绍往来的信件。有人建议以此追查,曹操不同意,说:“那时袁绍强大,我且不能自保,何况众人!”他当众烧掉所有信件,解除属下疑惧,表现了他的宽宏和狡诈。
曹操精通兵法,善于听取部属意见。在官渡之战中,他从黎阳退守官渡,诱敌深入,先取得白马一役的胜利;然后坚壁以待战机,出奇兵烧乌巢之粮,动摇敌人,制造混乱,再全线出战,击溃十万袁军,取得了以少胜多的辉煌战绩。官渡大捷,消灭了袁绍主力,曹操得以统一北方。