张合,字俊乂,是河间郡鄚县人。汉末时期,他响应招募去讨伐黄巾军,当了军司马,隶属于韩馥。韩馥失败后,张合带着部队投奔了袁绍。袁绍任命他为校尉,派他去抵挡公孙瓒。公孙瓒被打败后,张合立了大功,被提升为宁国中郎将。
曹操和袁绍在官渡对峙的时候,张合曾劝袁绍说:“曹操的军队很精锐,如果去攻打淳于琼他们,一定会打败他们。如果淳于琼他们被打败了,我们的大事就完了。我们应该赶快派兵去救他们。”但郭图却说:“张合的计策不对。不如去攻打曹操的大营,曹操一定会回来救援,这样就不用去救淳于琼,问题也能解决了。”张合说:“曹操的大营很坚固,攻打是攻不下来的。如果淳于琼他们被抓住了,我们都会成为俘虏。”但袁绍只派了轻骑兵去救淳于琼,却用重兵去攻打曹操的大营,结果也没攻下来。曹操果然打败了淳于琼,袁绍的军队一下子就溃败了。
郭图很惭愧,但他不但不承认自己的错误,反而在袁绍面前诋毁张合,说:“张合对我们的失败很高兴,还说了一些不恭敬的话。”张合听说后很害怕,就投降了曹操。裴松之认为,《武纪》和《袁绍传》都说袁绍派张合、高览去攻打曹操的大营,他们听说淳于琼被打败后,就投降了曹操,袁绍的军队这才溃败的。这样一来,就变成了因为张合等人投降,袁绍的军队才溃败的。但在这段传记里,却说袁绍的军队先溃败了,张合害怕郭图的诋毁,才投降了曹操,这两种说法互相矛盾,让人搞不清楚到底是怎么回事。
曹操得到张合后非常高兴,对他说:“以前伍子胥没有早点觉悟,结果让自己陷入危险,哪里比得上微子离开商朝、韩信归顺汉朝呢?”接着,曹操任命张合为偏将军,封他为都亭侯,还给了他军队,让他跟着自己去攻打邺城,最后成功拿下了邺城。之后,张合又跟着曹操去渤海攻打袁谭,还单独带领军队围攻雍奴,大获全胜。他跟着曹操去讨伐柳城的时候,和张辽一起担任先锋,因为立了功,被提升为平狄将军。后来,张合单独去征讨东莱,攻打管承,又和张辽一起去讨伐陈兰、梅成等人,把他们都打败了。他还跟着曹操在渭南打败了马超和韩遂,围攻安定,让杨秋投降。接着,他和夏侯渊一起去讨伐鄜县的贼寇梁兴以及武都的氐族人。后来又打败了马超,平定了宋建。
曹操去征讨张鲁的时候,先派张合带领各军去讨伐梁兴和氐族王窦茂。曹操从散关进入汉中后,又先派张合带领五千名步兵在前面开路。到了阳平,张鲁投降了,曹操就回去了,留下张合和夏侯渊等人守卫汉中,抵挡刘备。张合单独带领各军,让巴东、巴西两个郡投降,把那里的百姓都迁到了汉中。接着,他进军宕渠,结果被刘备的将领张飞给挡住了,只好退回南郑。因为这次战功,张合被任命为荡寇将军。
刘备驻扎在阳平,张合驻扎在广石。刘备用一万多名精锐士兵,分成十个部分,趁夜猛攻张合。张合带着亲兵奋力抵抗,刘备没能攻下来。后来,刘备在走马谷烧了曹军的包围圈,夏侯渊去救火,从另一条路和刘备的军队相遇,双方展开了激烈的战斗,短兵相接。结果,夏侯渊战死了,张合退回了阳平。《魏略》里说,虽然夏侯渊是都督,但刘备害怕张合而轻视夏侯渊。等到夏侯渊被杀后,刘备说:“我本来是想抓张合这个头目,抓夏侯渊有什么用呢!”
当时,刚刚失去了主将,大家都很害怕刘备会趁机进攻,三军上下都惊慌失措。夏侯渊的司马郭淮就对大家说:“张将军是国家的名将,刘备也害怕他。现在事情紧急,除了张将军,没有人能让大家安心。”于是,大家推举张合当了军主。张合出来后,整顿军队,安排好阵势,其他将领都听从他的指挥,大家的心才安定下来。曹操当时在长安,听说后就派使者给了张合节钺。接着,曹操亲自来到汉中,刘备坚守在高山之上,不敢迎战。曹操就带着汉中的军队撤退了,张合也回到了陈仓驻扎。
曹丕(文帝)继承王位后,任命张合为左将军,提升他的爵位为都乡侯。等到曹丕正式登基后,又进一步封他为鄚侯。曹丕下诏让张合和曹真去讨伐安定的卢水胡人和东羌,还召见张合和曹真到许宫,派他们南下和夏侯尚一起攻打江陵。张合单独带领各军渡过长江,夺取了江中的据点。