在唐军和叛军的对抗中,战争形势可谓是反反复复。往往唐军刚收复一些地方,转眼间又被叛军占领。在这样的一场拉锯战中,双方的消耗都非常大。正当形势有所好转的时候,唐肃宗在安禄山被杀以后,他盲目地认为叛乱很快就可以平定,于是,他从彭源进驻凤翔,并且命关内节度使王思礼军武功(今陕西武功西北),兵马使郭英义军东原(位于武功东),王难得军西原(位于武功西),准备进攻长安。
然而,正当肃宗部署进攻长安的时候,驻守长安的叛将安守忠,在二月十九日率军进攻武功。在唐军方面,由于郭英义交战不利,被叛军射中面颊,王思礼与诸军只好退守扶风(今陕西扶风)。叛军游兵进至大和关,去凤翔仅五十里。肃宗大骇,立即下令戒严。后因郭子仪部攻克淹关,安庆绪急令安守忠引兵去救,凤翔才没有遭到叛军攻击。肃宗也真正认识到要消灭叛军,收复两京,只有靠郭子仪了,郭子仪的朔方军成了朝廷必须倚重的主力部队。领了唐肃宗的令之后,郭子仪没有盲目进攻,而是从房瑁的失败中吸取了教训,认为要收复两京,必须先夺取潼关,攻入陕州(今河南陕县),击溃潼、陕之间的叛军,截断叛军的后路,然后才能直取长安。由于郭子仪的分析正确,唐肃宗十分赞赏,于是命令唐军按照郭子仪的军事部署行进。随后,郭子仪领兵直趋潼关,打败了叛军守将崔乾祐,一举夺取潼关,收复了陕州(今河南陕县)、蒲州(今山西永济),清除了进攻长安的障碍,并截断了长安叛军的退路。经过半年多的积极备战和连续几场胜仗,唐军的军事实力得到很大的加强。至德二年(757)四月,郭子仪率军由凤翔东进,准备攻取长安。在击败叛军李归仁的铁骑后,又遭到了叛军安守忠等的伏击,只得退守武功(今陕西武功)。同年九月,求胜心切的唐肃宗任命其子广平王李俶为天下兵马大元帅,郭子仪为副元帅,率军十五万进攻长安,并以“克城之日,土地士庶归唐,金帛女子皆归回纥”的条件,向回纥借骑兵四千前来助战。
十一月,郭子仪联合回纥击败了欲进攻灵武的叛军将领阿史那从礼等,歼敌三万余人,俘虏一万人,重创叛军,消除了朔方的后顾之忧,保卫了战时的统治中心灵武的安全。同月,唐肃宗任命郭子仪为司空、天下兵马副元帅,授以平定叛军,收复两京的重任,并命他率兵速赴凤翔待命。虽然很多谋臣都不太赞成唐肃宗的做法,但是看到唐肃宗一直不容反驳,所以在多次的劝谏无效的情况下,大臣和将领们都遵循了唐肃宗的安排。
随后,郭子仪乘胜追击,并且留下河东太守马承光守河东,自率诸军西上。然而,在途中他们又被叛将李归仁率铁骑五千拦击于三原(今陕西三原东北)北。郭子仪命部将仆固怀恩、王仲畀、浑释之、李若幽各领兵埋伏在自渠留运桥(今陕西三原东南)旁,并且佯装逃跑。李归仁一看这种阵势,心中大喜,于是就率部来追。当行至唐军的埋伏圈的时候,唐军伏兵齐出,将其铁骑全歼,李归仁跳入盘渠,泅水而逃。随后,郭子仪又继续前进,当进至长安西面的西渭桥,与王思礼部会师后,进屯涌水(今涌海)西岸,紧逼长安。叛将安守忠、李归仁率军扎营于长安西门外的清渠北侧,与郭子仪军对峙。两军相持七日后,安守忠伪装后退,郭子仪不知有诈,率全军追击,结果陷入安守忠的长蛇阵。安守忠率兵四千为蛇头,从延平门杀来,安太清率兵四千为蛇尾,从金光门杀来,又有一支敌军从正中冲击,叛军首尾呼应,前后夹击。唐军大败,丢弃军资器械无数。郭子仪收拾败兵,退保武功,自己只身赴凤翔请罪。然而,由于当时朝廷正是用人之际,而且他也是有功之臣,于是唐肃宗未给他任何处分,而是授他为尚书左仆射。唐肃宗决计大举进攻长安,二月二十三日,唐肃宗宴招待诸将,一一慰勉。他恳切地对郭子仪说:“功成与否,在此一举,愿卿竭忠尽智,不负朕望。”郭子仪斩钉截铁地回答说:“此行如若不能取胜,臣当以死谢罪!”
郭子仪这次吸取了初战失利的教训,加强了部队的纵深防御。他自己率领中军,李嗣业为前军,王思礼为后军,浩浩荡荡直奔长安西香积寺附近,在香积寺以北安营扎寨,与安守忠、李归仁和张通儒率领的十万叛军对阵。叛将李归仁出阵挑战,唐前军迎击,战不多时,李归仁佯败后退。唐军紧追不舍,快要逼近敌阵时,不意叛军摇动战鼓,一齐冲杀上来,唐军阻拦不住,自相惊乱,往本营后退,叛军趁势追击,争抢前军辎重。李嗣业在后督战,见部下溃退,立即扬鞭策马,飞奔阵前,高喊:“叛军已经把我们包围,若不奋勇厮杀,只有死路一条!”说罢,他脱去战袍,光着膀子,举起闪闪发光的长刀,拼命向叛军杀去,刀光过处,叛军人头纷纷落地,连杀数十人之后,唐军才稳住了阵脚。于是,他率领前军,各执长刀,列成横队,如墙推进,杀入敌阵,所向披靡。当时都知兵马使王难得被叛军射中眉骨,垂下的眼皮遮住了眼睛,他拔出箭,扯下眼皮,血流满面,仍奋勇杀敌。郭子仪经过和叛军的几次交战,知道叛军多诈,交战之前就派出侦骑四出搜索,果然发现叛军埋伏精锐骑兵于阵东,准备袭击唐军侧后。他立即命令仆固怀恩率领回纥兵出击,将叛军伏兵一举歼灭。接着仆固怀恩又率回纥兵迂回至叛军阵后。郭子仪乘胜率领大军从正面出击,李嗣业所率前军与仆固怀恩所率回纥骑兵从叛军阵后杀回,前后夹击,叛军腹背受敌,然而叛军并没有被这种阵势吓到,也没有放弃抵抗,进行殊死抵抗。在战场上,双方展开了激烈的白刃战,从中午一直厮杀到傍晚,最终唐军大败叛军。这次战斗中,唐军歼敌六万多人,生擒两万余人,叛军残兵败将狼狈逃回城内。
唐军取得了初步的胜利,郭子仪手下的战将仆固怀恩认为机不可失,建议连夜攻城,彻底消灭贼首以及城内的所有叛军,以免他们羽翼丰满,再生后患。有了这个想法,仆固怀恩数次请求大元帅李傲,要求带兵前去进入城内追杀穷敌。但李傲以部队疲劳为由拒绝了他的请战要求。驻守长安的叛军首领张通儒与叛军将领安守忠,李归仁、田乾真等趁夜逃离长安,唐军丧失了乘胜歼敌的良机。第二天,唐军进入长安城。被叛军占领一年零四个月的都城长安终于光复了。老百姓听说唐军回来,都喜出望外,夹道欢迎,有的甚至喜极而泣地说:“想不到今天又见到了官军。”纷纷杀鸡宰羊,抬出美酒欢迎唐军。肃宗在凤翔听到捷报,群臣称贺。长安收复后,肃宗由灵武迁回长安。元帅李傲在长安停留了几天才率领大军向洛阳进军。郭子仪率部追击叛军至潼关,歼敌五千余人。又克华阴(治今陕西华县)、弘农(治今河南灵宝)郡。王难得率兴平军攻取武关,克复上洛郡(治今陕西商县)。张通儒等收集残部,退保陕州。驻守洛阳的叛军守将安庆绪听说唐军前来攻城,慌忙派大将庄严、张通儒带领十五万大军前去陕州增援,企图在此阻止唐军东进,以确保洛阳的安全。
十月十五日,广平王李俶与郭子仪率大军进至弘农郡东十几里的曲沃城。郭子仪率军继续前进,与叛军相遇于陕州之西的新店。叛军在新店(河南省郏县西)与唐军相遇。新店地势险要,易守难攻。而叛军更是依山扎营,居高临下,形势对唐军非常不利。郭子仪为了化劣势为优势,趁叛军立足未稳,选派两千名英勇善战的骑兵,向敌营冲杀过去,又派了一千名弓箭手埋伏山下,再令协助作战的回纥军从背后登山偷袭,自己则亲率主力与叛军正面交战。一切部署完毕,唐军立即擂鼓出战。叛军从山上猛冲下来。郭子仪佯装败退,边战边走。叛军大喜,倾巢出动。这时,突然杀声如雷,一千名唐军埋伏的弓箭手像神兵一般从天而降,万箭齐发,无数的箭镞像雨点一样射向敌群。而此时,李嗣业率领的回纥兵也从山后杀了出来,叛军在漫天的尘土中看到猛冲过来的回纥兵,大惊失色,阵脚大乱。郭子仪乘势杀了个回马枪。叛军前后被围,左右挨打,进退无门。正在这时,又听到四处高喊:“回纥兵来了”赶快放下武器投降吧!在唐军和回纥军的合击之下,叛军被打得溃不成军。死伤的士兵连道路都给堵塞了。严庄、张通儒等连陕州城也不敢进了,落荒东逃。广平王李俶与郭子仪进入陕州城,命仆固怀恩等分道追击叛军。
庄严、张通儒拼死才逃回洛阳,向安庆绪建议:“三十六计走为上。”安庆绪见严庄败回,惊惶不安,仅率精骑三百,步兵近千人,于十六日夜,离开洛阳,渡过黄河,逃往邺城(今河南安阳)。十月十八日,唐军收复东京洛阳。十月二十一日,郭子仪命右武锋使浑释之率兵攻取河阳(今河南孟县南)、河内。庄严见大势已去,投降唐军。陈留(今河南开封)军民闻官军收复两京,杀死叛将尹子奇,举郡归唐。正在围攻颍川(今河南许昌市)的叛将田承嗣,也派人前来请降。郭子仪还未来得及收降,田承嗣又与围攻南阳的叛将武令王甸一起逃往河北。到了这个时候,河东、河南诸郡县相继光复。唐肃宗在凤翔接到光复长安的捷报,顿时悲喜交加,泪流满面,当即派宦官入蜀奏呈太上皇唐玄宗。自从安史之乱以来,这也许是最好的消息了。收复了两京,对李唐王朝而言,它的重要性不言而喻。此时的唐肃宗也终于感觉到恢复唐室更有希望了。平静下来之后,当他再次接到唐军陕州大捷的奏报时,他便率领百官由凤翔回到长安,并迎唐玄宗回朝。十一月,郭子仪从洛阳班师回长安朝见唐肃宗,郭子仪凯旋,肃宗十分高兴,并且派仪仗队到霸上(今西安市东)迎接。唐肃宗见了郭子仪,盛赞他说:“大唐虽然是我李家的天下,实际上是由你再造啊!”
至此,被叛军先后占领的大唐的都城长安和洛阳,终于又回到了李家,然而,这些胜利付出的代价也是非常之大的。虽然唐军已经收复了两京,找回了当朝的基业,但是,战争还没有结束,叛军的势力依然对唐军有着很大的威胁,随后的战争依然是非常的残酷和曲折。