隋大业十三年(617)七月,李渊率军誓师,任四子元吉为太原郡守,留守根据地,遣李建成和李世民分率左右大军,开赴关中。在霍邑(今山西霍县),李渊父子碰上了劲敌虎牙郎将宋老生。宋老生率精兵2万驻守霍邑,而隋左武侯大将军屈突通屯驻河东,两支军队形成犄角之势,正面迎击李军。
恰逢秋雨绵绵,道路泥泞,李渊父子率领的大军无法前进,只得驻守于霍邑附近。阴雨连绵不断,后方粮草迟迟不来,军中粮食逐渐匮乏……恶劣的局势令李渊坐立不安,于是打算退兵北还太原。李世民极力反对,认为已经到了秋收时节,不愁没有粮食;宋老生是个有勇无谋的人,只需一战便可把霍邑攻下;况且如果一遇到敌军便轻易撤兵,义军必定会受到天下人的鄙视。他甚至立下了军令状,“雨罢进军,若不杀老生而取霍邑,儿等敢以死谢。”然而李渊退兵心意已决。看着军队陆续北退,李世民越想越觉得不妥,跑到李渊帐前求见,却被拒之帐外。眼看大好时机就要错过,李世民号泣不已。李渊不得已召见了李世民。李世民条分缕析地陈述利弊,终于促使李渊改变了主意,下令追回了撤退的军队。
如同李世民所言,没过多久,粮食运到,阴雨天气也结束了,李渊父子率军进攻霍邑。李世民和李建成各率数十骑至城下骂阵,肆意挑衅。宋老生沉不住气,率兵开门应战。李渊下令军队后退,宋老生以为李军胆怯,贸然前进。李渊一边遣将出战,一边令李世民和李建成率兵绕到敌军背后,阻断宋老生后路。宋老生军中阵脚大乱,仓促退回城中。谁知城门已被李军把控,宋老生前进受阻,后退无路,于乱军之中被杀。李军趁机攻城,拿下了霍邑。
攻占霍邑后,李军势如破竹,接二连三攻下了临汾郡(今山西临汾)、绛郡(今山西新绛),沿途守将纷纷投降。进入关中地区后,李渊命李建成等人屯守永丰仓和潼关,阻挡东面隋朝援军;李世民、长孙顺德等人率军平定渭河北岸地区,包围长安。关中是李氏家族的旧地,自从李渊太原起兵后,其家族成员纷纷招兵买马,陆续收服了一些地区。因此李世民入关后,一路上几乎没有遇到阻碍,迅速抵达了长安附近。
很快,李家的二十余万大军聚集于长安。隋朝大业十三年(617)十一月,长安被攻下。进驻长安后,李渊出于政治考量,没有马上称帝,而是将隋炀帝之孙代王杨侑捧上皇位,遥尊江都的隋炀帝为太上皇,他自封为唐王。
次年三月,隋炀帝在江都被部将宇文化及等人所杀。宇文化及立秦王杨浩为帝,自任大丞相。洛阳的王世充也如法炮制,拥立越王杨侗为帝。面对这种混乱情况,李渊决定撕破脸皮,自己称帝。他自导自演了一场禅让戏,顺利登上皇位,建立了大唐政权,改元武德,定都长安,立建成为皇太子,封世民为秦王,元吉为齐王。