諸葛亮平定南中之後,又經過兩年準備,公元227年冬天,就帶領大軍駐守漢中。因為漢中接近魏、蜀的邊界,在那裡可以隨時找機會進攻魏國。
離開成都的時候,他給後主劉禪上了一道奏章,要後主不要滿足現狀,妄自菲薄;要親近賢臣,疏遠小人;並且表示他決心擔負起興復漢朝的責任。這道奏章就是歷史上有名的《出師表》。
過了年,諸葛亮採用聲東擊西的辦法,傳出消息,要攻打-城(今陝西眉縣),並且派大將趙雲帶領一支人馬,進駐箕谷(今陝西褒城北),裝出要攻打-城的樣子。魏軍得到情報,果然把主要兵力去守-城。諸葛亮趁魏軍不防備,親自率領大軍,突然從西路撲向祁山(今甘肅禮縣東)。
蜀軍經過諸葛亮幾年嚴格訓練,陣容整齊,號令嚴明,士氣十分旺盛。自從劉備死後,蜀漢多年沒有動靜,魏國毫無防備,這次蜀軍突然襲擊祁山,守在祁山的魏軍抵擋不了,紛紛敗退。蜀軍乘勝進軍,祁山北面天水、南安、安定三個郡的守將都背叛魏國,派人向諸葛亮求降。
那時候,魏文帝曹丕已經病死。魏國朝廷文武官員聽到蜀漢大舉進攻,都驚慌失措。剛剛即位的魏明帝曹-(音rui)比較鎮靜,立刻派張-帶領五萬人馬趕到祁山去抵抗,還親自到長安去督戰。
諸葛亮到了祁山,決定派出一支人馬去佔領街亭(今甘肅莊浪東南),作為據點。讓誰來帶領這支人馬呢。當時他身邊還有幾個身經百戰的老將。可是他都沒有用,單單看中參軍馬謖。
馬謖這個人確是讀了不少兵書,平時很喜歡談論軍事。諸葛亮找他商量起打仗的事來,他就談個沒完,也出過一些好主意。因此諸葛亮很信任他。但是劉備在世的時候,卻看出馬謖不大踏實。他在生前特地叮囑諸葛亮,說:「馬謖這個人言過其實,不能派他幹大事,還得好好考察一下。」但是諸葛亮沒有把這番話放在心上。這一回,他派馬謖當先鋒,王平做副將。
馬謖和王平帶領人馬到了銜亭,張-的魏軍也正從東面開過來。馬謖看了地形,對王平說:「這一帶地形險要,街亭旁邊有座山,正好在山上紮營,佈置埋伏。」
王平提醒他說:「丞相臨走的時候囑咐過,要堅守城池,穩紮營壘。在山上紮營太冒險。」
馬謖沒有打仗的經驗,自以為熟讀兵書,根本不聽王平的勸告,堅持要在山上紮營。王平一再勸馬謖沒有用,只好央求馬謖撥給他一千人馬,讓他在山下臨近的地方駐紮。
張-率領魏軍趕到街亭,看到馬謖放棄現成的城池不守,卻把人馬駐紮在山上,暗暗高興,馬上吩咐手下將士,在山下築好營壘,把馬謖紮營的那座山圍困起來。
馬謖幾次命令兵士衝下山去,但是由於張-堅守住營壘,蜀軍沒法攻破,反而被魏軍亂箭射死了不少人。
魏軍切斷了山上的水源。蜀軍在山上斷了水,連飯都做不成,時間一長,自己先亂了起來。張-看準時機,發起總攻。蜀軍兵士紛紛逃散,馬謖要禁也禁不了,最後,只好自己殺出重圍,往西逃跑。
王平帶領一千人馬,穩守營盤。他得知馬謖失敗,就叫兵士拚命打鼓,裝出進攻的樣子。張-懷疑蜀軍有埋伏,不敢逼近他們。王平整理好隊伍,不慌不忙地向後撤退,不但一千人馬一個也沒損失,還收容了不少馬謖手下的散兵。
街亭失守。蜀軍失去了重要的據點,又喪失了不少人馬。諸葛亮為了避免遭受更大損失,決定把人馬全部撤退到漢中。
諸葛亮回到漢中,經過詳細查問,知道街亭失守完全是由於馬謖違反了他的作戰部署。馬謖也承認了他的過錯。諸葛亮按照軍法,把馬謖下了監獄,定了死罪。
馬謖自己知道免不了一死,在監獄裡給諸葛亮寫了封信,說:「丞相平日待我像待自己的兒子一樣,我也把丞相當作自己父親。這次我犯了死罪,希望我死以後,丞相能夠像舜殺了鯀還用禹一樣,對待我的兒子,我死了也沒牽掛了。」
諸葛亮殺了馬謖,想起他和馬謖平時的情誼,心裡十分難過,流下了眼淚。以後,他真的把馬謖的兒子照顧得很好。
諸葛亮認為王平在街亭曾經勸阻過馬謖,在退兵的時候,又用計保全了人馬,立了功,應該受獎勵,就把王平提拔為參軍,讓他統率五部兵馬。
諸葛亮對將士們說:「這次出兵失敗,固然是因為馬謖違反軍令。可是我用人不當,也應該負責。」他就上了一份奏章給劉禪,請求把他的官職降低三級。
劉禪接到奏章,不知該怎麼辦才好。有個大臣說:「既然丞相有這個意見,就依著他吧。」劉禪就下詔把諸葛亮降級為右將軍,仍舊辦丞相的事。
由於諸葛亮賞罰分明,以身作則,蜀軍將士都很感動。大家把這次失敗當作教訓,士氣更加旺盛。這年冬天,諸葛亮又帶兵殺出散關(今陝西寶雞西南),包圍了陳倉(今寶雞東),殺了一個魏將;第二年春天,又出兵收復武都(今甘肅成縣)、陰平(今甘肅文易西北)兩個郡。後主劉禪認為諸葛亮立了功,下了一道詔書,恢復諸葛亮的丞相職位。