北伐军占领南京后,孙传芳、张宗昌的部队败退江北,但是他们还保存了相当的实力。孙传芳依然拥兵5万余,而张宗昌、褚玉璞的直鲁联军有15万人,占据着苏北、山东、豫东等大片地区。当蒋介石忙着反共清党之际,他们看准机会,准备大举反攻。
孙传芳的首要目标是泰州。4月5日,周荫人、郑俊彦率部自如皋进攻泰州,守军独立第十二师张中立部寡不敌众退回江南。10日,孙军乘势袭占江北重镇扬州,守军第十七军曹万顺遭受重创,狼狈退往镇江。数日之间,东起南通西至扬州的广大江北地区均被孙军占领。孙传芳在瓜州、都天庙构筑炮台,炮轰江南,而且在扬州十二圩等地试图强渡长江,重占江南。
张宗昌部于4月8日攻占滁州。12日,直鲁军第三军程国瑞,第七军许琨部三万余人自淮南南下,围攻合肥。国民革命军独立第五师马祥斌部与独立第四旅王金韬部死守待援。随后张宗昌以白俄铁甲车直薄浦口,同时进驻和州、巢县等地,企图割断芜湖合肥间北伐军的联系,然后进取安庆。16日,直鲁军炮击南京,蒋介石终于意识到形势的严峻。
蒋介石与孙传芳的谈判一直断断续续。4月中旬,蒋介石任命陈仪为江北宣抚使,希望通过他收服孙传芳或者孙的部下。陈仪受命后,即请张君励拟稿,劝孙传芳发布宣言,与蒋合作。孙、蒋虽然在讨赤、反共这一点上意见一致,但是孙传芳拒绝参加北伐。他已经反过一次奉军了,好不容易得到了张作霖的谅解,如果再次对奉军调转枪口,无论从人格、道义上孙传芳都做不到。5月1日,谈判破裂,3日,孙传芳发出通电,指责蒋介石:“藉共产党之势力,以破坏敌军,沪宁即下,乃捕杀共产党以释天下之疑”,“利之所在,虽仇必亲;利之所去,虽亲必仇”。“(传芳)虽三战三北,而耿耿此心始终不懈者,诚以此贼不除,国家断无幸存之理。”
和谈不成,只有兵戎相见。蒋介石于5月1日制定出三路北伐计划。以何应钦为第一路总指挥,由镇江攻扬州,直趋淮海;白崇禧代替蒋介石为第二路代总指挥,担任津浦线正面作战;李宗仁为第三路总指挥,由芜湖渡江袭击直鲁军侧面,援救合肥守军。三路中的重点在第二路,第一路暂时在沪宁线集结,待第二、第三路得手后再行出击。
白崇禧指挥的第二路军分三个纵队,分别以贺耀祖(第四十军)、杨杰(第六军)、陈调元(第三十七军)为指挥官,陈调元为前敌总指挥。5月11日,陈调元自马鞍山渡江。12日,攻克和县。13日,杨杰部从江宁镇、慈湖镇渡江,进占乌江镇,浦口之直鲁军不战而撤。15日,贺耀祖部由下关、大胜关之间渡江,未遇抵抗即进占江浦。17日,三个纵队同时告捷,分别占领全椒、东葛。18日,杨杰部克复滁县。19日,克沙河集。直鲁军被迫总退却,至蚌埠、临淮关一带集中。至此津浦线明光以南之敌全部肃清,第一阶段作战计划顺利完成。
第三路军分五个纵队,分别以叶开鑫(第四十四军)、夏威(第七军第一师)、胡宗铎(第七军第二师)、王天培(第十军)、柏文蔚(第三十三军)为指挥官,王天培为前敌总指挥,另以王普部(第二十七军)为总预备队。自5月5日起陆续在芜湖、大通等地渡江。13日,克含山、拓皋。第七军前锋进抵合肥以东的梁园。14日,李宗仁赴合肥前线督师。15日赶到合肥时,正值直鲁联军第十五军军长马济从蚌埠方面开来,夜袭梁园。程国瑞、许琨都亲自督战。马济是广西讨袁的主要将领之一,本为广西宿将,也曾是李宗仁的上司,第七军很多高级将领,都曾是他的部下,因此他非常熟悉第七军的战略战术。据说,此次战前,他向张宗昌建议说,广西部队长于运动战,惟求速战决,利于进攻,疏于防守,一旦战罢,则解甲高卧,防守极疏。因此,夜间进袭,攻其无备,包管可以一举而聚迁之。马济率军乘夜袭击第七军,来势凶猛。第七军驻梁园的部队以为北军新败,无力反攻,真的解甲而卧,毫无防备。在睡梦中,他们突然被喊杀声惊醒,以为还在做梦。好在第七军长期征战,临阵沉着,没有被北军冲乱。将士就地据守,很快将阵地稳定下来。北军在马济亲自指挥下,拼全力冲杀,突破了梁园镇外的工事,进到镇内,与第七军守军彻夜展开巷战。黎明之后,第七军终于看清楚了北军的实力及部署,于是展开两翼,向北军阵地包抄过去。他们知道北军中武卫军第三团周定儒部多广西人,于是大喊:“广西人不打广西人!”北军猛烈攻击一晚上,并没有获得多少战果,此时士气已经衰竭,那些广西籍军人更无斗志,周定儒团不战而溃。一经北伐军反击,北军也就全线退却,溃不成军。马济见夜袭无功,于是再调白俄骑兵赶来战场。白俄兵人高马大,每以其气势震摄对手。这次白俄1000多骑,按其一贯战术,列队向第七军冲锋。第七军将士早有准备,子弹上膛,并不开枪。等到骑兵冲到子弹射程之,枪炮齐发,接着迎头发起反冲锋。白俄骑兵遭到南军弹雨的打击,冲到前面的大多倒在了阵地上。后队见势不妙,调转马头,夺路而逃。后面是大队步兵,经骑兵一冲,顿时大乱,北军互相践踏,损失惨重。领军主帅马济拦不住乱军,也落荒而逃。但他非常不走运,率领少数卫队逃跑中迷失了方向,进入安徽省定远县大青山。张宗昌的军队素无纪律,人民群众非常痛恨。马济逃到大青山,当地红枪会把他和少数卫队当作是张宗昌的败军,群起袭击。在一高粱地中,他被红枪会的梭镖掷中,最后不治而死。
同一时间,被困合肥城内的马祥斌、王金韬部得悉援兵接近,下令出击。王天培第十军、王普第二十七军也乘势包抄敌军后路。直鲁军全线溃退,被困一个多月的合肥之围隧解。18日,叶开鑫部进至明光附近,张宗昌亲至临淮关督战,命津浦线南段的部队退守定远一带。19日,夏威、胡宗铎部攻克定远,20日,克临淮关、凤阳。21日,攻克蚌埠。张宗昌败退徐州。
何应钦的第一路军分为四个纵队,分别以曹万顺、赖世璜、刘峙、何应钦为指挥官。由于第二、第三路军进展顺利,在征得蒋介石的同意后,何应钦于20日下令各部陆续渡江。首先协同自浦口东进的第二路军第一纵队贺耀祖部横扫孙传芳军。孙军自败退江北后,粮饷困难,子弹缺乏,士兵患病者十之八九,普遍厌战。加上苏北平原无险可守,何应钦部未遇到像样的抵抗。21日,占领六合;22日,占领仪征;23日,十七军第二师占领扬州。
蚌埠、扬州即克,蒋介石于5月24日下达追击令。要求以主力进攻徐州、砀山间之敌,以一部进攻海州、台儿庄,直逼鲁南。
孙传芳在扬州失败后,全军分两路撤退。一路沿运河退至淮阴,一路自南通、如皋、东台、盐城撤至海州。各将领因为攻守分歧,矛盾重重,军心更加涣散。5月26日,北伐军占领南通,28日,二十一师陈诚部经过激战克复邵伯,6月1日,克高邮。孙军第八师崔景桂、第十师郑俊彦、第十三师刘士林等部望风披靡。6月5日,北伐军克淮安、涟水,孙军彭德铨部第三团缴械投降。
第二路军协助第一路军自皖北攻克苏北重镇淮阴后,以部分兵力由津浦路以东地区向徐州攻击前进。6月2日,击败直鲁军程国瑞部,占领灵璧。随后相继占领宿迁、洋河。9日,占领海州,俘敌6000余人。孙军第十七师冯邵闵部,第十师郑俊彦部被歼灭,第五师白宝山残部投降,第十二师周荫人残部退往山东日照,第二、四、九、十一等师退据桃林、红花埠、劳沟一线继续顽抗。10日,第二纵队、第三纵队协力进攻,孙军不支,经临沂退往胶济路一线。第二路军乘势攻克郯城,进入山东境内。
第三路军攻克蚌埠、临淮关之后以第一、第二、第三纵队原地整顿待命,以第四纵队王天培部沿津浦路北进,第五纵队攻取六安。5月底,张宗昌接到张作霖缩短战线的命令,节节后退。第三路军顺利突破直鲁军在浍河流域固镇的防线,连克蒙城、颍上、阜阳、宿县等地。29日,蒋介石进驻蚌埠。第十军三个师及皖军王金韬一部继续进攻直鲁军据守的濉溪口、古饶集、黄山头、夹沟、元山、时村镇一线,血战数昼夜,敌军奔溃。6月2日,兵不血刃进占徐州。
就当时的形势而言,对北伐军是极其有利。北洋军阀新败之余,军心涣散,士气低落,已不足为虑。山西的阎锡山也准备易帜,参加北伐军。如果宁汉双方暂时放弃内争,同冯玉祥、阎锡山一道北伐,奉军、直鲁军是根本无法抵挡的。那样,北伐将提早一年结束。可惜,国人勇于内争的恶习断送了大好时机,广大民众只好多忍受一番内战带来的痛苦与损伤。