1924年冬天,9岁的小豆子被当妓女的母亲切掉左手上那根畸形的指头后进入关家戏班学戏。戏班里只有师兄小石头同情关照小豆子。十年过去了,在关师父严厉和残酷的训导下,师兄二人演技很快提高,小豆子取艺名程蝶衣(张国荣饰),演旦角;小石头取艺名段小楼(张丰毅饰),演生角。俩人合演的《霸王别姬》誉满京城,师兄弟二人也红极一时。蝶衣希望和段合演一辈子《霸王别姬》。
段小楼娶妓女菊仙(巩俐饰)为妻,依恋着师兄的蝶衣,心情沉重地来到师兄住处,把他用屈辱换来的、师兄向往已久的名贵宝剑赠给小楼,并决定不再与小楼合演《霸王别姬》。在关师傅的召唤下,师兄弟二人再次合作。
抗战结束后,两人被迫给一群无纪律无素质的国军士兵唱戏......