相持袁军初战失利,但兵力仍占优势。七月,进军阳武(今河南中牟北),准备南下进攻许昌。八月,袁军主力接近官渡,依沙堆立营,东西宽约数十里,曹操也立营与袁军对峙。九月,曹军一度出击,与袁军交战不利,退回营垒坚守。袁绍构筑楼橹,堆土如山,用箭俯射曹营。曹军制作了一种抛石装置的霹雳车,发石击毁了袁军所筑的楼橹。袁军又掘地道进攻,曹军也在营内掘长堑相抵抗,粉碎了袁军的计策。双方相持三个月,曹操外境困难,前方兵少粮缺,士卒疲乏,后方也不稳固,曹操几乎失去坚守的信心,一日见运粮士兵疲于奔命,于心不忍,不禁脱口而出,“却十五日为汝破绍,不复劳汝矣!”
官渡之战曹操写信给荀彧,商议要退守许都,荀彧回信说:“袁绍将主力集结于官渡,想要与公决胜负。公以至弱当至强,若不能制,必为所乘,这是决定天下大势的关键所在。当年楚、汉在荥阳、成皋之间,刘邦、项羽没有人肯先退一步,以为先退则势屈。现在公以一当十,扼守要冲而使袁绍不能前进,已经半年了。情势已然明朗,绝无回旋的余地,不久就会发生重大的转变。这正是出奇制胜的时机,千万不可坐失。”于是曹操决心继续坚守待机,同时加强防守,命负责后勤补给的任峻采取十路纵队为一部,缩短运输队的前后距离,并用复阵(两列阵),加强护卫,防止袁军袭击;另一方面积极寻求和捕捉战机,击败袁军,不久派曹仁、史涣截击、烧毁袁军数千辆粮车,增加了袁军的补给困难。期间,汝南郡黄巾军刘辟叛变,袁绍使刘备前往相助,又派韩荀钞断曹军西道,皆被曹仁击破。江东孙策意欲偷袭许都,却被刺客暗杀。
奇袭同年十月,袁绍又派车运粮,并令淳于琼率兵万人护送,屯积在袁军大营以北约20公里的故市(河南延津县内)、乌巢(今河南延津东南)。恰在这时,袁绍谋士许攸投奔曹操,建议曹操轻兵奇袭乌巢,烧其辎重。曹操立即付诸实行,留曹洪、荀攸守营垒,亲自率领步骑五千,冒用袁军旗号,人衔枚马缚口,各带柴草一束,利用夜暗走小路偷袭乌巢。到达后立即围攻放火。袁绍获知曹操袭击乌巢後,一方面派轻骑救援,另一方面命令张郃、高览率重兵猛攻曹军大营。可曹营坚固,攻打不下。当曹军急攻乌巢淳于琼营时,袁绍增援的部队已经迫近。曹操励士死战,大破袁军,杀淳于琼等,并将其粮草全数烧毁。张郃、高览闻得乌巢被破,于是投降曹操,导致了军心动摇,内部分裂,大军崩溃。袁绍仓惶带八百骑兵退回河北,曹军先后歼灭和坑杀袁军七万余人,也有说是八万人 。官渡之战增强了曹操的实力,为曹操击溃袁绍,统一北方奠定了坚实的基础。北方仅有曹操和袁绍势力较大,此战击溃了袁绍,北方就无人能和曹操抗衡。