Matthias Ginter of Borussia Dortmund celebrates scoring with his teammates.

Alexandre Simoes Getty Images

Borussia Dortmund came out on top in the Revierderby, holding on to beat rivals Schalke 3-2 at Signal Iduna Park.

In a game that was simmering throughout, Dortmund prevailed with Shinji Kagawa's opening the scoring on the half hour mark. His goal was canceled out by Klaas-Jan Huntelaar but Matthias Ginter headed home to hand the home side a first half lead.

More from FoxSports

Pierre-Emerick Aubameyang, who had arguably his poorest game of a goal-laden season, netted his 14th league goal of the season to clinch the points despite Huntelaar's second with around 15 minutes to play giving the visitors from Gelsenkirchen a modicum of hope.

Given Dortmund's clashes with Schalke can define a season, Thomas Tuchel was shrewd to give a rest to Shinji Kagawa and Ilkay Gundogan on Thursday in the UEFA Europa League. They both returned; as did Roman Bürki and Sokratis. Gonzalo Castro retained his spot in the side, but only as a result of the injury to Marco Reus who will be on the sidelines for several games.

Having drawn 2-2 in Prague this week, Andre Breitenreiter also made four changes: the return of Joel Matip at center-back the most notable inclusion. Johannes Geis was suspended and Bayern Munich loanee Pierre-Emile Hojbjerg was surprisingly named on the bench.

The opening exchanges of the 147th Revierderby were something of a non-event. More than 1,000 away tickets were handed back by Schalke fans amid attempts from local authorities to reduce the travelling numbers.

With the ball, Dortmund's 2-3-3-2 shape was designed to maximise their quick touches which facilitates more incisive play between each defensive line. For the first 12 minutes, that didn't happen and only Gundogan's searching long ball for Mkhitaryan had faintest glimpse of a goalscoring chance.

Schalke, meanwhile, were set up to rely on the individual skills of 19-year-old academy product Leroy Sane. The speedy, elegant attacker threatened on 19 minutes, stabbing Dennis Aogo's cross wide of the target. The Essen-born ace has been Schalke's key man this season and remains high on the radar of several top English Premier League clubs.

Kagawa's start to the match was quiet. He was dropping deeper than dominate the play, but he was nonetheless economical in his use of the ball. But on 30 minutes, the Japanese international popped up in the box to head in Ginter's 10th assist of the season. Kagawa hadn't scored in a Revierderby since his double against Schalke back in 2011, which became the abiding image of his first season in Germany.

But the Royal Blues drew level within three minutes. Sane magnificently escaped the challenge of Mats Hummels and set up Huntelaar for the easy finish -- the fifth goal in his last seven that Sane has been involved in. For Huntelaar, it meant the end of a barren run in the Bundesliga lasting 419 minutes.

Dortmund's dominance wasn't quite challenged, though. The home side continued to pepper Ralf Fährmann's goal with shots with Gundogan and Ginter firing wide inside the space of a few minutes. Ginter, who has carved out a role in the team at right-back brilliantly this season, headed in from a corner kick to put Dortmund in front going into the break.

Seconds after the restart, Aubameyang struck gold, finishing one-vs-one with Fährmann after a superb ball from Castro -- the Gabon striker has now scored in his last three derbies. The aforementioned Castro returned to the kind of form that impressed so much at Bayer Leverkusen last season. Gundogan, previously on Schalke's books, was denied a fourth by Fährmann on 49 minutes before the Schalke keeper pulled off a wonder save to deny Mkhitaryan from point-blank range.

Fährmann, one of the league's most underrated keepers, was preventing this game from turning into a demolition as he palmed clear a header from Sokratis on 69 minutes. The visitors were back in the game less than a minute later courtesy of poor Dortmund defending -- Mats Hummels was caught out, Sokratis misjudged the cross and Huntelaar chipped past Bürki to go beyond Kevin Kuranyi in Schalke's all-time scorers list.

The Royal Blues were threatening to stage an impressive comeback in the last 10 minutes. Dortmund keeper Bürki denied substitute Hojbjerg from just outside the box with a solid save to touch the ball on to the post. Hummels and Sokratis weren't covering themselves in glory, mistiming interceptions and inviting the late pressure from Schalke.

But the yellow-and-blacks held out stoically to defend their slender lead and keep the gap with leaders Bayern Munich at five points. Schalke lie fifth in the Bundesliga with 20 points from 12 games.