劉毅、何無忌、劉道規的晉軍在桑落洲與桓玄的戰將何澹之激戰,這時桓玄的軍隊還很多,雙方打了很多天不分勝負。何澹之想了個自以為是的計策,他悄悄地移到郭昶之艦中,讓自己的旗艦沖向敵陣,以誘晉艦來圍攻,這樣其他楚艦則可以仗著艦多兵多對晉艦進行反包圍。但他擔心洩密,並沒有把這個事通知到每條船上,而是憋在自己肚子裡不說。這就為後來的敗仗埋下了伏筆。
晉軍很快把這隻旗艦攻下。何無忌一馬當先,攻入旗艦中,卻不見主帥何澹之。何無忌方知上當,這時候楚艦已經從四面八方將晉艦包圍,何無忌急中生智,出來喊道:&ldo;何澹之已被我生擒了,你們還不投降?&rdo;
楚軍見旗艦被攻下,所以都相信何無忌擒住了他們的主帥,皆無鬥志,紛紛撤退。晉軍乘勢追擊,楚軍大敗。何澹之從郭昶之的艦中急得跳出來大喊:&ldo;我在這裡!&rdo;竟然無人注意,楚軍大敗。何澹之和郭昶之只好棄艦而逃。晉軍遂攻克湓口,進據潯陽,又從潯陽繼續進兵。
桓玄又派苻宏為前鋒,率荊州水軍二萬阻擋劉毅。劉毅的軍隊只有一萬,聽說桓玄船高兵多,便打算回潯陽堅守。劉道規道:&ldo;敵眾我寡,即使退到潯陽,也難堅守。不如乘勝進攻,一鼓作氣,與之死戰。兩軍決戰,雄者克!不在兵多!&rdo;何無忌也不同意退兵。
劉毅於是繼續進軍,在崢嶸洲與桓玄的水軍遭遇後,兩軍混戰。由於晉軍兵少,又處於下游,開戰後處於不利的局面,開始後撤。但這個時候忽然颳起了東風,而且這場風颳得特別猛烈。水軍交戰,風向特別重要。楚軍雖然處於上流但遇到強烈的逆風,船隻都被吹得後退。晉軍趁勢掩殺,並同時射出火箭放起火來。楚船紛紛中箭著火,風助火勢,越來越大,楚軍登時潰敗。桓玄見此情景,再一次指天長嘆道:&ldo;這是上天亡我啊!&rdo;桓玄乘小船逃走,殷仲文投降晉軍。
桓玄逃回江陵後,苻宏、馮該等將請桓玄整兵再戰。但楚軍上下,大多將士充滿悲觀情緒,就是桓玄也認為上天站在劉裕的那一邊而再無鬥志,打算去漢中投奔梁州刺史桓希。但桓玄出逃的訊息被人走漏,他出發的前一夜,有人趁機發起暴亂,哄搶國家的府庫和沿街商店。桓玄也顧不得整兵鎮壓了,只想快跑,於是帶了三四百親信士兵,連夜從城西出逃。因為走得著急,竟把晉安帝和司馬德文給忘在城中。荊州別駕王康產、太守王騰之兩個人急忙帶著幾百侍衛保護住兩個人。
桓玄船到江陵西南三十里處的枚回洲時,正遇上寧州刺史毛璠剛剛病死,毛璠的哥哥益州刺史毛璩派孫子毛祐之帶著參軍費恬、督護馮遷率八百士兵,護送靈柩歸葬江陵。毛修之是當年陶侃手下名將毛寶的曾孫,是毛璠和毛璩的侄子,此時正在桓玄的親信士兵中做屯騎校尉。毛修之早就有捉拿桓玄的心思,所以一路跟隨桓玄,並不離開。這時看到毛家的船隻,便和船上人打招呼。毛祐之、費恬、馮遷見是毛修之,便問毛修之要去哪裡。毛修之站在船頭大喊道:&ldo;逆賊桓玄正在船上,你們快過來殺賊!&rdo;
桓玄大驚失色,立刻命人去殺毛修之。毛祐之即命手下的幾個神箭手,射倒七八個去砍毛修之計程車兵。又有箭手去射桓玄,桓玄手下的丁仙期、萬蓋用身子護住他,這兩個人都被射死。
很快毛祐之的船靠了上來,眾士兵紛紛躍上船隻,殺敗桓玄手下人。馮遷將桓玄殺死。時為晉元興三年(404)五月壬午日,桓玄稱帝不足半年,死時年僅三十六歲。卞範之、桓昇等人都被生擒,押送到江陵後斬殺。
毛璩首先得到桓玄被殺的訊息,他趕緊率兵進入漢中,假稱護送桓玄到了,請桓希出城迎接。桓希出城後被毛璩斬殺。這時,劉毅也率兵進入江陵,以江陵