523年(孝明帝正光四年),柔然族的統治者阿那瓌帶兵攻入懷荒鎮。阿那瓌長驅直入,北魏在這裏最高軍事行政長官元孚束手被擒,馬牛羊數十萬頭和居民二千被驅掠北去,邊鎮軍民又遭到一次劫難,他們實在無法生活下去。懷荒鎮鎮兵向鎮將於景請求發給糧食,遭到拒絕。憤怒的人民把於景殺死,揭開六鎮起義的序幕。
起義風暴從東向西,迅速席卷了北魏的北部邊鎮。被壓迫的鮮卑人、高車人、匈奴人、漢人、氐人、羌人、胡人紛紛投入反抗壓迫的起義洪流中去。
有個叫破六韓拔陵的匈奴人在沃野鎮起義,占領了沃野鎮,並派兵進攻武川、懷朔二鎮。第二年攻下了這兩個鎮,改年號為“真王”,號召廣大軍民起來推翻北魏統治,起義軍隊伍越來越壯大。
北魏統治者得到邊鎮起義消息後,嚇得驚慌失措,急忙派臨淮王元或帶兵前去鎮壓,結果在五原(今內蒙古包頭市西北)被破六韓拔陵打得大敗。破六韓拔陵率領起義軍乘勝追擊,在白道(今內蒙古呼和浩特市西北)又打敗北魏另一支隊伍。朝廷軍隊的兩次慘敗,使孝明帝惶恐不安。他一方麵下令釋放各鎮原來不是罪犯而被迫世代當兵的兵戶為平民,改鎮為州,並派大官北上進行“撫慰”,企圖用籠絡的辦法瓦解起義軍;一麵派李崇為大都督,崔暹為撫軍將軍,元淵為鎮軍將軍,調集精銳部隊,全力以赴地鎮壓起義軍。
麵對強敵,破六韓拔陵沉著迎戰,他在白道布下防線,迎擊敵人。李崇知道白道是河套地區通往陰山以北的咽喉要道,地勢險要,易守難攻。他決定憑借自己糧草供給充足的優勢,與破六韓拔陵展開持久戰。他下令部下不準輕易出擊,以此拖垮起義軍。可崔暹怕李崇搶頭功,不聽李崇調度,擅自出兵,結果被起義軍打得大敗。破六韓拔陵乘勝追擊,李崇大軍隻好連連後退。
北魏朝廷軍隊打了敗仗,內部也不團結。元淵為了排擠李崇,揭發李崇的部下假報軍功,貪汙軍費,孝明帝罷免了李崇的官職,元淵成了總指揮。他龜縮在五原城裏,不敢與起義軍交戰,他知道他打不過起義軍,便派懂得好幾個民族語言的於謹到起義軍高車營中做間諜,收買了一個高車酋長乜列河,帶領三萬多人叛變。元淵還以仇為友,和柔然統治者勾結,請求阿那瓌出兵,幫助他鎮壓起義軍。
525年(孝昌元年),阿那瓌率兵十萬,由武川鎮向西進攻,與北魏軍隊準備夾擊破六韓拔陵。破六韓拔陵聽到乜列河叛變的消息,怒火滿腔,親自率兵截擊乜列河,正中北魏軍的奸計,陷入敵人包圍圈。在阿那瓌和元淵的夾擊下,起義軍慘遭失敗,破六韓拔陵不知去向,可能是犧牲了。二十多萬六鎮起義軍全部成了北魏軍隊的俘虜。
六鎮起義從523年懷荒鎮鎮兵發難,到525年破六韓拔陵失敗,共戰鬥兩年零四個月,給北魏統治者以沉重打擊。
六鎮起義失敗後,北魏統治者把俘獲的二十萬起義軍民,分別遷到冀(今河北冀縣)、定(今河北定縣)、瀛(今河北獻縣)三州,想分散他們的力量,便於對他們的控製。
由於北魏朝廷的腐敗,河北也不是塊樂土,被奴役被壓迫的廣大人民也正在孕育著革命風暴。六鎮軍民被遷到這裏,一路上飽嚐了各種苦難,到河北後,與河北人民迅速結合在一起,再次掀起反抗高潮。