秦二世元年(公元前209年)十二月,陳勝被車夫莊賈所殺。次年(公元前208年)六月,項梁知道陳勝確實已死,就在薛縣召集各部將領,立原楚懷王的孫子心為楚懷王(即義帝),定都盱眙(今江蘇盱眙)。這時,秦大將章邯已經攻滅了魏國和齊國。七月,楚軍經過休整,開始向秦國反攻。楚軍連連勝利,項梁被勝利衝昏了頭腦,驕傲起來,別人進諫也聽不進去了。九月,章邯得到秦關中的援兵後,乘項梁不備,突然夜襲定陶,結果楚軍大敗,項梁被殺。擊殺項梁後,章邯認為楚國已不再構成威脅,就渡河進攻趙國。趙王向楚懷王求救。
接到趙國的求援信,楚懷王和眾將商討,決定分兵兩路:一路以宋義為上將軍,項羽為次將,範增為末將,北上救趙;一路以劉邦為將西進關中。最初,楚懷王曾和諸將約定:誰先攻入都城鹹陽,就封誰為關中王。”但這時,由於秦軍強大,許多將領都不願意搶著入關。隻有項羽為了給項梁報仇,要求和劉邦一起入關。楚懷王和老將們考慮:項羽為人剽悍殘酷,不如劉邦寬厚仁慈。所以最終他們沒有同意項羽的要求,還是派了劉邦獨自率軍入關。
經過連番征戰,漢王元年(公元前206年)八月,劉邦攻入武關,向鹹陽逼近。秦相趙高殺死二世,派人向劉邦求和,被劉邦拒絕。九月,秦王子嬰即位,他誅滅趙高,派兵在蟯關(今陝西商縣西北)抵擋劉邦。劉邦率軍繞過蟯關向秦都進攻,在藍田之南打敗秦軍,接著在藍田又大破秦軍。十月,劉邦即進抵鹹陽東郊灞上(今陝西西安東)。秦王子嬰被迫乘坐素車白馬,脖子上係著請罪的帶子,捧著璽印向劉邦投降。秦王朝滅亡。
十月,劉邦進入鹹陽。當時他以“關中王”自居,準備就住在宮中,好好享受一番。樊噲提醒他這將重蹈秦的覆轍,他卻不以為然。張良又進諫說:“秦王朝的統治殘暴無道,所以才能使你進入關中。你想為天下除去殘暴,自己首先就必須以樸素為資。現在剛剛入秦,卻安於享樂,這是所謂的‘助紂為虐’。‘忠言逆耳利於行,良藥苦口利於病’,樊噲講的話雖有些難聽,但為了奪取天下,我希望你還是聽從他的勸告。”這樣,劉邦才聽從了他們的勸告,“乃封秦重寶財物府庫,還軍灞上”。隻有蕭何帶著“秦丞相禦史律令圖書”,回到軍中。
十一月,劉邦召集各縣一些有名望的人士,向他們宣布:“我們這次入關,目的是要推翻秦的暴政。我們不會侵犯你們,不要害怕!‘誹謗者族,偶語者棄市’,你們苦於秦的苛法已經很久。我曾與諸侯約定,先入關者做關中王,我應該做關中王。所以我現在和你們約法三章:殺人者死,傷人及盜抵罪。原來的秦法一律廢除,所有官吏和行政也都保留。”劉邦派人和秦朝原來的官吏一齊到各縣、鄉邑去宣傳。老百姓聽說後非常高興,都紛紛帶著牛羊酒肉來慰問義軍。劉邦辭讓說:“倉庫裏的糧食很多,我不能讓你們破費。”老百姓更加高興,惟恐劉邦不做關中王。
這時,一個謀士向劉邦獻計說:“秦的財富十倍於天下,地形也很險固。現在聽說章邯已經投降項羽,在關中被封為雍王。他們如果來了,你恐怕就不能再做關中王了。你應該趕快派兵守住函穀關,不要讓他們入關。”劉邦認為他的意見很對,於是派兵駐守函穀關。
項羽在救趙消滅秦軍主力後,也率軍向關中進發。漢王元年十二月,他來到函穀關。一見關門緊閉,又聽說劉邦已平定關中,項羽大怒,當即命當陽君英布攻破函穀關,接著率四十萬大軍開到戲下(今陝西臨潼東北戲水西岸)。這時,劉邦的左司馬曹無傷聽說項羽發怒,為了日後求封,就暗中派人向項羽告狀說:“沛公欲稱王關中,讓子嬰做相國,把秦的珍寶都據為已有。”項羽一聽,更是火上加油,加之謀士範增也勸項羽趕快除掉劉邦,因此他下令犒勞士兵,明天一早就向劉邦進攻。劉邦當時隻有十萬人,在兵力上完全處於劣勢。在大難就要臨頭之際,卻來了救星。這個救星就是項羽的叔叔項伯。
項伯和劉邦的謀臣張良交往甚密,張良曾救過他的命。他聽說項羽馬上就要向劉邦進攻,就連夜馳入劉邦軍中,想把張良帶走。張良卻對他說:“沛公有大難,我作為謀臣不能一聲不吭就走,要走也得把這個事情告訴他。”張良告之劉邦,劉邦聽了大驚,要張良趕快考慮對策。張良說:“大王現在應親自去見項伯,說明你不敢背叛項王。”劉邦對項伯以好酒招待,並約為兒女親家,然後說:“我入關後,絲毫不敢有所取,登記吏民,封存府庫,以等待將軍(指項羽)。所以遣將守關,是為防備盜賊和其他意外。我日夜盼望將軍到來,怎麼敢反叛呢!希望您能替我向將軍說明這個情況。”項伯答應了,並對劉邦說:“你明天拂曉定要親自去對項王賠禮。”劉邦答應後,項伯即連夜返回,把劉邦的話告訴了項羽,並勸項羽說:“沛公不先破關中,你能順利入關嗎?人家有大功,不該這樣對待,還是好好相待才是。”項羽表示同意,取消了進攻計劃。