Born in Columbus, Georgia, United States, Holmes has an American father and an English mother. He moved to England, with his mother, at the age of 4, living in Wakefield. Though he has dual American-British nationality, he identifies as American. He has played for junior clubs Kellingley Welfare and Normanton Athletic before joining Huddersfield Town from U-9 level and then in May 2011, Holmes was among ten teenagers to be "handed two-year academy deals. In 2013, Holmes was shortlisted for the Football League Championship Apprentice of the Year. However, Holmes lost it to Dimitar Evtimov. Then in May 2013, Holmes signed a two-year contract, with the club having an option to extend for a further year.
Playing career
Huddersfield Town
Having been included in the first team, Holmes was given number 38 shirt. Holmes made his début for the Terriers in the Football LeagueCup game against Hull City at the KC Stadium on September 24, 2013, coming on as a substitute for fellow débutante Daniel Carr. He made his first league début in the 1–1 draw against Blackpool at the John Smith's Stadium on September 27, 2013, setting up the equalizer for James Vaughan. After the match, Manager Mark Robins praised Holmes' performance. He made his first start for the Terriers in the 3–2 win over Leeds United on October 26, before being subbed at half-time for Sean Scannell. At the start of the 2014–15 season, Holmes switched number shirt from thirty-nine to nineteen. Holmes made his first appearance for the club, in the second round of Football League Cup, as Huddersfield Town lost 2–0 to Nottingham Forest. At the end of the season, Holmes was offered a new contract by the club and on June 22, 2015, Holmes signed a contract with the club.
Loan spells
On February 20, 2014, Holmes was sent out on a month's loan to fellow Championship side Yeovil Town. Holmes made his debut the following Saturday against Doncaster Rovers, earning a penalty which won Yeovil the match 1–0. Despite Manager Gary Johnson was keen to extend Holmes' loan spell, Holmes returned to Huddersfield Town on March 17, 2014, with his loan prematurely ended having started all five of his games at Yeovil. On August 30, 2014, after making just one substitute appearance at the start of the season, Holmes joined League Two side Buryon loan until January 5, 2015. Holmes made his Bury debut on the next day, coming on as a substitute for Nicky Adams in the 79th minutes, in a 2–1 win against Accrington Stanley. Holmes returned to Huddersfield Town on October 29, 2014, with his loan prematurely ended having started six of his games at Bury, mostly coming from as a substitute.
Holmes signed for Scunthorpe United on July 7, 2016, following his release from Huddersfield Town. He made his first appearance in an Iron shirt during the EFL CUP round 1 tie with Notts County on Tuesday August 9, 2016. Holmes came off the bench to help earn a 2–0 victory AET. He went on to make his full debut the following Saturday August 13 away at Fleetwood Town.
Derby County
Holmes signed for Derby County on August 9, 2018, for an undisclosed fee.
International career
Born in the United States and raised in England to an American father and English mother, Holmes is eligible to play for the United States and England, and has expressed interest in representing the United States. In May 2019, he was named in the 40-man provisional United States squad for the 2019 CONCACAF Gold Cup. He made his senior team debut on June 5, 2019, against Jamaica. The following day, he was named in the final 23-man roster for the 2019 Gold Cup, but was forced to withdraw from the squad prior to the start of the tournament due to injury, being replaced by Djordje Mihailovic.