建安五年二月,袁紹駐軍黎陽,派大將顏良攻打白馬,同時派大將文丑進攻延津,主戰場是在白馬。駐守白馬的守將是劉延,劉延有三千人,打到建安五年四月的時候劉延頂不住了,給曹操寫信求援,曹操也知道劉延頂不住,決定增援白馬。這時曹操的謀士荀攸的就跟曹操說,咱不打白馬,我們打延津,曹操馬上就明白過來了,聲東擊西。不打白馬,軍隊從延津出發渡過黃河,做出一副要包抄袁紹後路的這樣一個架勢,袁紹一定會上當受騙,增援延津。曹操採納了荀攸的建議,率領一支部隊大張旗鼓地向延津方向挺進,故意讓袁紹的偵察兵知道,果然袁紹上當受騙,派出人馬增援延津。但是曹操走到半路的時候,曹操下令部隊原地休息,派一支輕騎兵抄小路直撲白馬,這其中有一位將軍就是關羽。
關羽為什麼會在曹營,公元199年末,曹操部署和袁紹作戰時,劉備起兵反抗曹操,並積極與袁紹聯繫,打算合力夾攻曹操。曹操親自率領精兵攻打劉備,一舉佔領了沛縣,收復了徐州,劉備全軍覆敗,帶領少數兵馬逃往河北投奔到了袁紹的帳下。關羽無力抵抗,投降了曹操。
關羽投降曹操以後,曹操對他非常好,關羽決定:為曹操立下汗馬功勞以後再回去找他哥哥劉備。那麼關羽還有其他將領帶着這支輕騎兵撲到白馬,顏良措手不及,被關羽力斬馬下。這個時候,袁紹才發現是上當了,中了聲東擊西,調虎離山之計,然後派劉備和文丑轉過來攔截曹操。曹操很清楚,白馬這個地方雖然解圍了,但是這個地方不能再守,袁紹一定會反撲過來,白馬一定守不住。曹操決定帶着白馬的老百姓沿着黃河往延津走。曹操帶着這麼多白馬的老百姓往延津走,當然是走得很慢了,結果呢,撞上了劉備和文丑的軍隊。
曹操來到了延津東南面的一個山坡上,正準備休息。哨兵向曹操報告,前面來了幾百個騎兵,過一會兒哨兵又報告,說來了一千騎兵,步兵數都數不清。曹操下命令,部隊下馬,原地休息。將領就不懂了,說敵人都撲過來了,我們應該上馬準備啊,我們怎麼下馬原地休息呢?再說我們從白馬運過來那些輜重,就是糧食、布匹,七七八八的東西都在路上呢,我們起碼要把這些東西都運回軍營去,準備迎戰吧。曹操說你不要管,都給我下馬,坐在地上休息。這是曹操的誘敵之計,果然劉備和文丑帶着騎兵衝過來以後看到一地的東西,都是好東西啊,全部都下馬來去撿那些東西,搶那些寶貝,這個時候曹操一聲令下,上馬!衝鋒號吹起來,戰鼓擂起來,殺聲喊起來,六百鐵騎從高坡上傾斜而下,頓時打得袁軍滿地找牙,文丑也被立斬馬下。這次戰爭以後,關羽就留下一封感謝信,封存了曹操給他所有的賞賜,騎上他的赤兔馬去尋找那個比兔子跑得還快的哥哥去了。文丑被殺了以後劉備是掉頭就跑,劉備這人這個本事還是比較大的。
曹操聲東擊西,攻其不備,打了袁紹一個措手不及,不僅解了白馬之圍,還折了袁紹兩員大將,曹軍可以說是初戰告捷。
曹操心裏很明白,自己其實不是袁紹的對手,袁紹當時號稱是十萬精銳部隊,曹操呢,按照《三國志》的說法,不足一萬。當然,給《三國志》做注的裴松之認為這個數字是不準確的,曹操的軍隊怎麼算也不只一萬人,估計也就是兩三萬,肯定是以少勝多,以寡敵眾。於是曹操打勝了仗,退軍官渡。袁紹他覺得曹操打勝了仗還往回跑肯定是膽怯,應該前進,於是袁紹就進軍官渡。曹操的後退拉長了敵方的補給線。在白馬打仗曹操的補給線長,在官渡進行戰爭袁紹的補給線長,所以曹操叫做敵進我退。但是退到官渡呢,曹操也無路可退了,於是袁紹就在官渡這個地方紮起了營壘,曹操也相應地紮起了營壘,戰爭進入「相持階段」。
雙方的相持,讓曹操身心俱疲,曹操不想打了,太累了,受不了了,他寫了一封信給留守在許都的荀彧尋求撤退意見,遭到荀彧堅決反對。荀彧告訴曹操,這一仗咱們打也得打,不打也得打,袁紹這一回是傾巢而出,家底全部拿出來了,就是要和我們決一死戰,他