东汉末年,汉灵帝病逝后,外戚集团与宦官集团争权夺势双双覆灭,西凉董卓趁机入都作乱,他废长立幼,扰乱朝堂,关东诸郡遂结盟起兵讨董。后董卓迁都长安,盟军内部各怀私心,终作鸟兽散,中原随后陷入军阀割据混战的局面。先有袁绍联合公孙瓒,用计夺取冀州,后有曹操取代刘岱,占据兖州。日后北方最大的两股势力逐渐有了雏形。只不过此时的曹操实力比袁绍弱得多,而且袁绍一直把曹操当作自己的附庸,两人的利益冲突不大,关系也还没恶化到交战的地步。不过不久之后发生的事,使袁绍急切地要攻灭曹操。
袁绍和曹操在中原南征北战扩充地盘的同时,迁都长安的董卓集团也发生了不小的震动。先是王允、吕布设计杀董卓,后有董卓部将李U、郭戡叛乱,王允被杀,吕布战败后东逃,李荼、郭戡在长安火并互屠。汉献帝在各方势力手中辗转,最后东逃洛阳。曹操把握住机会,于建安元年(196年),亲自去洛阳朝见汉献帝,并借口洛阳残破不堪,粮草匮乏,将都城迁到许县。曹操将汉献帝控制在自己的势力范围内,并开始借天子的名义向天下发号施令,并大肆在河南扩充领土,关中很多小割据势力纷纷依附曹操。挟天子以令诸侯成了曹操实力壮大的转折点。
与此同时,袁绍历经数年,攻灭公孙瓒,解除北方威胁,并最终占据冀州、青州、幽州、并州四州的广阔土地,实力达到巅峰,且远远强于曹操。早先,汉献帝逃到曹阳时,袁绍就有机会控制住汉献帝,以"挟天子以令诸侯",只不过袁绍性格多疑、优柔寡断、谋多无决,最终错失良机。此时袁绍见曹操借天子以自重,对自己发号施令,很气不过,且袁绍不肯坐视曹操实力壮大,急于发动战争攻灭曹操,于是就爆发了历史上有名的官渡之战。
建安五年二月,官渡之战爆发。袁绍先派大将颜良围攻白马。曹操进军延津,佯装要渡河攻击袁绍,袁绍忙分兵向西阻击曹操,曹操突然转兵,日夜兼程救出白马军民,斩杀颜良,并沿河西撤。袁绍大怒,贸然渡河追击曹操。曹操命军士丢下两重装备,袁军见此情形,以为曹操溃败,争夺捡拾装备,此时曹操突然杀出,大破袁军,并斩杀袁军大将文丑。
曹操初战大捷,且连杀袁军两个名将颜良、文丑,军队士气大振,但这改变不了曹操处于绝对劣势的局面。据《武帝纪》记载,曹操"兵不满万,伤者十二三",这虽然说得有点夸张,但袁绍军力远远强于曹操是肯定的,曹操初战告捷也不能改变这个局面。所以解了白马之围后,曹操主动退兵,扼守官渡。
建安五年八月,袁绍军依靠沙堆设营,进逼曹营。袁绍大军全军出动,连营而进,东西数十里,阵势极大。曹操坚守营垒,伺机而动。袁军几番猛攻、作高橹、起土山、挖地道,都被曹操击破。两军相持两个月,曹操只能被动防守,无力反击,且曹操粮草匮乏,不宜长久僵持,处境极其危急。曹操很多部下心知早晚战败,便偷偷写信给袁绍,或投降、或讨好,以求保命。
十月,袁绍派淳于琼北迎运粮车,屯于距离曹操四十里的乌巢。正巧,袁绍谋士许攸来投曹操,告知这一消息。曹操大喜,亲率精锐步兵五千,趁夜偷袭乌巢。袁绍闻知,急忙兵分两路,一路去救乌巢,另一路主力攻打曹营。曹操部下见后有追兵,且前方乌巢未破,便请令分兵阻击追兵。曹操骂道:"慌什么,全力攻打乌巢,等追兵到了后背再告诉我。"部下闻知,全军孤注一掷死战,终于攻破乌巢,并烧光粮草。袁绍军队得知乌巢陷落,曹营又未破,一时间军心慌乱,原本浩浩荡荡的大军顷刻间一溃千里,纷纷丢盔弃甲逃往黄河以北。
曹军大胜后,缴获袁绍大量珍宝、图书、辎重、信件。清点信件时,曹操见有不少是自己部下给袁绍的,有人建议曹操严惩这些叛徒。
曹操却说:"袁绍强大的时候,我都不能自保,何况别人。"于是烧了这些信件,不予追究。部下们见曹操胸怀如此大度,更加死心塌地跟随曹操。