7月29日淩晨,敵軍果然來襲。其先頭部隊利用夜色掩護,開始通過安城河。按照事先的計劃,聶軍蟄伏不動。當敵軍渡河至一半時,聶軍發起突襲,埋伏在叢林中的部隊打起排槍,駐紮山頂的炮隊也頻頻發炮。日軍紛紛倒斃,慌忙中向後退去,因橋小人多,相互擁擠,溺水而亡者甚眾。聶軍乘勢發起攻擊。日軍陣形大亂,四散奔逃,退卻中有的陷入沼澤,有的迷了路。聶軍越戰越勇。戰鬥中,日軍第一梯隊指揮官鬆崎直臣大尉當場斃命,第一小隊長山田四郎少尉也身負重傷。為了阻截聶軍追擊,日軍邊退邊設下地雷。聶軍追擊中誤踩旱雷,傷亡較重。考慮到我軍人數少,不宜窮追,聶士成遂下令停止追擊。[402]
安城渡之戰,聶軍小有斬獲。雖是小勝,但聶士成怎麼也不會想到,這將是清軍在朝鮮打的唯一勝仗。此後,清軍一敗再敗,簡直慘不忍睹。
天亮時分,日軍大隊趕到,分兩路向聶軍發起攻擊。他們利用猛烈的炮火和人多勢眾,強行通過安城渡,並向成歡一帶發起猛攻。聶軍奮勇還擊,雙方開槍互射。槍炮轟鳴,喊殺震天。起初,架在山頂的聶軍炮隊頻頻得手,殲敵甚多,可日軍采取迂回戰術,翻山越嶺,分道包抄。由於敵眾我寡,聶軍很快處於劣勢。據聶士成回憶說:“我軍人自為戰,莫不一以當十。自寅至辰,槍炮聲不絕,死傷積野,血流成渠,而敵愈聚愈眾,布滿山穀。”[403]盡管情勢十分不利,但聶軍依然鬥誌高昂,血戰不退。聶士成則冒著槍林彈雨,來回指揮。隨著日軍不斷增多,聶軍在月峰山、牛歇山等陣地相繼失守,兩路日軍從左翼、右翼兩側向聶軍大營發起夾攻。形勢越發危急,而聶軍彈藥這時也快告罄,無奈之下,聶士成隻得下令突圍。
此後,部隊一路退往公州。按計劃將在那裏與葉部會合,可途經江滸時,聶士成發現葉部正在渡河,不禁頗感驚訝。這時,葉誌超騎馬過來,聶便上前詢問。葉誌超說:“公州不可守,不如繞道至平壤,會合大軍,再圖進取。”他讓聶士成收拾殘部,隨後跟進,說完便拍馬而去。
聶士成對於葉誌超的決定很不滿意,而且,他不等自己撤至公州,就先行渡河,這也讓他心中不快。但作為下屬,他隻能服從。
8月28日,在牙山之戰一個多月後,聶士成率部馳奔數千裏,繞道朝鮮東海岸,先後渡過漢江、大同江,行程兩千餘裏,最後到達平壤。此時,國內增援部隊已陸續趕到,聶士成信心大增,心中頗感樂觀。他在當天的日記中寫道,抵達平壤約在下午三四點鍾,與各部將領相見,“殷勤慰勞,談笑甚歡”。[404]