In his freshman season at Georgia, Gaines had a very productive year as he led the team in minutes, assists, steals, free throw attempts and makes, as well as ranking second in rebounding. In 27 games, he averaged 12.0 points, 4.9 rebounds, 2.9 assists and 2.4 steals per game. In his sophomore season, he ranked third among all SEC players in steals at 2.0 per game. In 30 games, he averaged 10.3 points, 5.1 rebounds and 3.4 assists per game. He was named the team's MVP by the coaching staff at the season's end. In his junior season, he led Georgia in minutes, starts, rebounds, assists and steals. He was also named to the 2007 All-SEC second team. In 32 games, he averaged 10.5 points, 5.7 rebounds 4.8 assists and 2.3 steals per game. In his senior season, he was named to the 2008 All-SEC second team and All-Defensive team. In 34 games, he averaged 14.8 points, 6.0 rebounds, 4.2 assists and 1.8 steals per game.
Professional career
2008–09 season
Gaines went undrafted in the 2008 NBA draft. In July 2008, he signed with NGC Cantù of Italy for the 2008–09 season.
2009–10 season
On November 5, 2009, Gaines was selected with the 15th overall pick by the Idaho Stampede in the 2009 NBA D-League draft. On January 5, 2010, he signed a 10-day contract with the Utah Jazz. On January 14, 2010, in just his fifth NBA game, Gaines hit a 3-pointer at the buzzer to give the Jazz a dramatic 97-96 win over the Cleveland Cavaliers. It was the first 3-pointer of his NBA career. On January 15, 2010, he signed a second 10-day contract with the Jazz. On January 25, 2010, he signed with the Jazz for the rest of the season.
2010–11 season
Gaines joined the Utah Jazz for the 2010 NBA Summer League. On October 22, 2010, he was waived by the Jazz. On November 12, 2010, Gaines signed with the Minnesota Timberwolves. On January 4, 2011, he was waived by the Timberwolves. On January 13, 2011, Gaines signed a 10-day contract with the Toronto Raptors. On January 24, 2011, he signed a second 10-day contract with the Raptors. On January 26, 2011, he was waived by the Raptors. On February 28, 2011, Gaines signed a 10-day contract with the New Jersey Nets. On March 10, 2011, he signed a second 10-day contract with the Nets. On March 20, 2011, he signed a multi-year deal with the Nets. On March 23, 2011, Gaines suffered a season-ending right hip injury.
2011–12 season
On September 9, 2011, Gaines signed with BC Armia of Georgia for the duration of the NBA lockout. In December 2011, he re-joined the Nets.
2012–13 season
On September 6, 2012, Gaines signed with the Indiana Pacers. However, he was later waived by the Pacers on October 22, 2012. On November 13, 2012, he signed with the Fujian Xunxing of the Chinese Basketball Association for the 2012–13 season.
2013–14 season
Gaines joined the Washington Wizards for the 2013 NBA Summer League. On November 22, 2013, he signed a two-month deal with Beşiktaş of Turkey. On January 15, 2014, he played his final game for Beşiktaş, recording 4 points, 7 assists and 2 steals in 15 minutes of play. On January 29, 2014, he was acquired by the Austin Toros. On January 31, 2014, he was traded to the Springfield Armor. On February 4, 2014, he was traded to the Reno Bighorns. On April 22, 2014, he signed with Guaiqueríes de Margarita of Venezuela for the rest of the 2014 LPB season.
2014–15 season
On August 28, 2014, Gaines signed with Sidigas Avellino of Italy for the 2014–15 season. In 29 games for Sidigas, he averaged 11.3 points, 3.3 rebounds, 2.4 assists and 1.2 steals per game.
2015–16 season
In July 2015, Gaines joined the Detroit Pistons for the 2015 NBA Summer League. On November 2, 2015, he was acquired by the Reno Bighorns, returning to the franchise for a second stint. On December 8, he was waived by the Bighorns after appearing in just four games. On January 2, 2016, Gaines was acquired by Openjobmetis Varese of the Italian League. However, before playing a game for them, he left the Italian club on January 13 to sign with Ironi Nes Ziona of the Israeli Premier League for the rest of the season.
In 2017, Gaines competed for The Washington Generals in The Basketball Tournament. Gaines was the leading scorer for the team with 22 points in the one game they played before being eliminated by The Matadors.