大將顏良進攻白馬(今河南滑縣),以保障主力渡河。四月,曹操親自率兵從官渡北上,解救白馬之圍。他採納隨軍謀士荀攸(you優)聲東擊西的作戰方案,引兵先到延津(今河南延津北),偽裝要渡河進攻袁紹的後方,使袁紹分兵應戰;然後再以輕騎部隊回襲白馬,以攻其不備。袁紹果然中計。曹操急率輕騎兵,以張遼、關羽為先鋒,急奔白馬。顏良倉促應戰,關羽出其不意地突入袁軍陣中,手起刀落,斬了顏良,袁軍四下逃散。戰鬥結束以後,曹操下令把白馬城中的居民全部遷出,隨軍沿黃河向官渡撤退。
袁紹聽說曹操從白馬退出,便親自率領大軍渡河追擊,恨不得一口把曹操吞掉。他派大將文丑帶領五六千名騎兵作為先頭部隊向延津迫近。曹操機智地命令士兵在延津南面山坡下紮好營寨,並讓所有騎兵都卸下馬鞍,放馬吃草,輜重車輛都停在袁軍將要經過的小路上。袁軍來到,爭相搶奪輜重,隊形混亂,曹操以不滿六百名騎兵乘機出擊,文丑在混亂中被殺,曹軍俘虜了他帶領的全部人馬,退回官渡。
袁軍接連打了兩次敗仗,士氣低落,但是袁紹仍然自恃兵多,盲目冒進。七月,袁紹