刘备军驻扎阳平关,直接对曹操构成威胁,曹操如芒在背,必欲除之而后快,于是在建安二十四年(219)三月,自长安经斜谷出兵。斜谷道险,曹操恐被刘备截击,先以先遣部队抢占要害之地,然后大军续进。刘备这时的胆子已经大起来,所以当知曹操驱兵前来,满有把握地对担负狙击任务的将领们说:“曹操虽来,无能为也,我必有汉川矣。”据载,“及曹公至,先主敛众据险,终不与交锋”。有过一些小的战斗,刘备军队大都取得胜利。
史载,“夏侯渊败,曹公争汉中地,运米北山下,数千万囊。黄忠以为可取,云兵随忠取米。忠过期不还,云将数十骑轻行出围……值曹公扬兵大出”,赵云“前突其阵,且斗且却”。魏兵追至营下,赵云入营,“更大开门,偃旗息鼓”,魏兵怀疑有埋伏,不敢攻营而退。赵云“雷鼓震天,惟以戎弩于后射公(曹操)军,公军惊骇,自相蹂践,堕汉水中死者甚多”。
曹操与刘备对峙一个月左右,未能取胜,军心浮动,死伤不少,逃兵越来越多,曹操观形势、察地理、度兵力,知道汉中很难保住,欲进不能,欲还可惜心中极其矛盾,但最后终于作出了正确的决策:“引出汉中诸军还长安”。值日军官请示当晚口令,曹操随口说“鸡肋”。史载:“时王(曹操)欲还,出令曰‘鸡肋’,官属不知所谓。主簿杨修便自严装(整理行装),人惊问修:‘何以知之?’修曰:‘夫鸡肋,弃之如可惜,食之无所得,以比汉中,知王欲还也。’"
曹操三月出兵汉中,五月还长安,来去匆匆,前后只有两个多月时间。自此以后,汉中便成了刘备的地盘而不复魏有了。
曹操撤兵之后,大幅度后退,把防线建在汉中与关中之间的交通要冲、历代兵家必争的陈仓(今陕西宝鸡东)。这一决策虽然是防御性的,但却是很正确的。因而,有效地扼住了刘备、诸葛亮前进之势,从此以后蜀军的实际控制始终未能超过陈仓一线。
刘备既得汉中,触角很快向东西两方伸展。西北方面推进到武都,以利掌握氐、羌,北谋凉州,东据曹操。史载,曹操决定撤军后,知道武都难保,即派曹真至武都迎曹洪等军还屯陈仓,并接受了张既的建议,派张既到武都迁徙氐王之五万余落出居扶风、天水界。徙民实边、屯田戍疆,一切都为了战争,这是曹操终生不渝的原则。对于刘备来说,自然也比较容易地取得武都地区,但他得到的几乎是一片空地,曹操徙民那一招的确很东汉矛厉害。
东面则遣宜都太守(治今湖北枝城)孟达从秭归北攻房陵(今湖北房县)。法正随刘备回蜀,刘备因令孟达兼领法正的部属,屯江陵。刘备平蜀以后,以孟达为宜都太守。孟达趋军北上,斩房陵太守蒯祺,并将率兵进攻上庸(今湖北竹山县西南)。据载,刘备“阴恐(孟)达难独任,乃遣(刘)封自汉中乘沔水下统达军,与达会上庸”。上庸太守申耽知难抵抗,举众投降,“遣妻子及宗族诣成都。刘备任命申耽为征北将军,领上庸太守、员乡侯如故;以耽弟(申)仪为建信将军、西城太守;迁(刘)封为副军将军”。唯孟达没有得到封授。
曹操退兵之后,刘备把原属凉州的武都郡和本属曹操所置荆州的新城(治今湖北房县)、上庸、魏兴(西城,治今陕西安康)三郡纳入自己的版图以内,蜀势大盛。