Lars Stindl rescued a draw in stoppage time to extend Germany's unbeaten run to 21 matches as the world champions twice came from behind to earn a 2-2 draw with France in Cologne.
Stindl, an 83rd-minute replacement for Emre Can ensured Joachim Low's finished 2017 without tasting a single defeat, their last loss coming at the hands of France in the European Championship semi-finals last year.
That run looked like coming to an end when Alexandre Lacazette netted twice on Tuesday – the Arsenal striker profiting from Anthony Martial's brilliant footwork for his first before Kylian Mbappe created his second.
In between the Arsenal striker's brace Timo Werner levelled for the hosts as he broke the French offside trap to sweep home Mesut Ozil's pass.
But a second goal looked too much for the hosts as the game entered stoppage time, however substitute Stindl had other ideas as he fired low past Steve Mandanda just 10 minutes after coming on.
Low will hope to see better defending when his side face Spain and Brazil before they begin their World Cup defence in Russia, but their battling spirit will give the coach plenty of encouragement.
A Germany side showing six changes from their draw with England took time to settle and that allowed France to have the better of the opening exchanges, although they initially failed to stretch Kevin Trapp.
Mbappe may well have done when he found space in the 12th minute, but Mats Hummels came to Germany's rescue with a perfectly executed sliding tackle.
Lacazette – preferred in attack to Antoine Griezmann – eventually tested Trapp just before the half-hour mark, while at the other end an important block from Raphael Varane denied Ozil.
Minutes later Trapp had to be alert again to keep Mbappe out low to his right, the Paris-Saint Germain goalkeeper denying his club-mate after a neat Cruyff turn in the penalty area.
Finally, in the 33rd minute, the goal France's pressure deserved came, Martial dancing past Niklas Sule before touching the ball wide of Trapp for Lacazette to apply a simple finish.
Sacre bleu! Nothing Trapp can do this time, as Martial goes full FIFA to give Lacazette a tap-in (33') #GERFRA 0-1— Germany (@DFB_Team_EN) November 14, 2017
Half-time substitute Antonio Rudiger should have brought Germany level seven minutes after his introduction, but the Chelsea defender skewed his effort wide after great work down the left from Julian Draxler.
Germany did not have to wait long for their equaliser as Ozil led a swift counter-attack, his pinpoint throughball releasing Werner and the RB Leipzig forward calmly slotted under Mandanda.
Almost immediately Martial thought he had restored France's lead, but Trapp got down brilliantly to push away his dipping strike.
A Kroos free-kick rattled Mandanda's bar with 20 minutes to play but while the Real Madrid midfielder was wondering how it stayed out, France scored.
Rudiger inexplicably left Lacazette in acres of space 20 yards from goal and the 26-year-old beat Trapp again after being found by Mbappe's pass.
Low introduced Mario Gotze for his first international appearance in just shy of a year and he came good with a superb assist for Stindl, who kept their run going by sliding home a neat 93rd-minute finish.
|MLS Review: Sounders a step closer to final, Crew and Toronto in stalemate|
|Earl suffers ACL injury as NRL return is put on hold|
|Ben Yedder trolls Liverpool after dramatic Sevilla comeback|
|Maxwell called into Ashes squad as cover for Warner|
|´World class´ Insigne can´t be rested – Sarri|
|Smith: Australia considering replacement for Warner|
|I say one thing and you write something else - Angry Ronaldo brushes off media|
|Yankees All-Star Judge undergoes shoulder surgery|
|Griezmann needs support of Atletico and fans – Simeone|
|Monaco paid for mistakes in Champions League exit - Jardim|
|We had to rely on personal pride - Berizzo praises Sevilla´s stunning comeback|
|Championship Review: Coleman loses first Sunderland game, Fulham win nine-goal thriller|
|City fans get first sight of local star they crave in Phil Foden|
|Gunes wants more after historic Besiktas Champions League qualification|
|Allegri plays down Dybala-Messi comparisons|
|Extra rest helped Rose shine in Dortmund – Pochettino|
|Zidane: We knew Ronaldo, Benzema goals would come|
|It feels like we lost - Klopp frustrated at Liverpool´s second-half collapse|
|It depends on Foden - Guardiola puts ball in teenager´s court|
|Siddle excited by Smith´s duel with Root|
|Postecoglou leaves Australia post|
|Ronaldo overtakes Messi in Champions League goalscoring race|
|Manchester City 1 Feyenoord 0: Sterling strikes late as top spot is clinched|
|Sevilla 3 Liverpool 3: Klopp´s side fail to survive Spanish inquisition|
|Borussia Dortmund 1 Tottenham 2: Son grabs winner as Spurs seal top spot|
|Napoli 3 Shakhtar Donetsk 0: Insigne stunner helps keep knockout hopes alive|
|APOEL 0 Real Madrid 6: Record-breaking Ronaldo and Benzema send holders through in style|
|Monaco 1 RB Leipzig 4: Werner brace dumps Ligue 1 champions out|
|Memorable Ashes Moments: Triple wicket-maiden for destructive Johnson|
|Ronaldo breaks record for Champions League goals in a calendar year|
|´World´s Fastest Gamer´ wins McLaren F1 simulator role|
|History against England in Brisbane, as Cook targets Gabba milestone - the Ashes in Opta facts|
|I wanted to cry with Buffon - Rakitic sympathy for Italy great|
|Defiant Smalling responds to ´surprise´ England omission|
|Hughes ruled out of Samoa clash as Watson, Joseph omitted|
|MLB great Joe Morgan urges voters not to elect steroid users to Baseball HOF|
|Neuer ´on schedule´ but Heynckes won´t rush Bayern star|
|Messi contract saga not swaying Barcelona boss Valverde|
|Spartak Moscow 1 Maribor 1: Stoppage-time equaliser gives Russians everything to do at Anfield|
|Besiktas 1 Porto 1: Talisca leveller sends hosts through|
|Grand slams to reduce seeds from 32 to 16 from 2019|
|Mkhitaryan questions leave Mourinho riled|
|Jones out of Basel, Brighton games but Mourinho hopeful on Bailly|
|The Scrum-back Kid? Philips answers Scarlets SOS|
|Moore to retire from all rugby following Murrayfield Test|
|The Ashes: Australia and England leap into chasm of unknowns|
|Conte unhappy with Chelsea´s fixture congestion|
|Pepe tells Ronaldo: Come to Besiktas!|
|Clement expects Abraham to shake off back injury for Bournemouth clash|
|Oddo replaces sacked Del Neri at Udinese|
|F1 Raceweek: Contract talks for Hamilton, Alonso at Le Mans and Kvyat´s snub|
|Bartomeu hints at January Barcelona signings|
|Davis Love III to have hip-replacement surgery|
|Massa eyes final flourish in Abu Dhabi|
|Bears TE Zach Miller out of hospital three weeks after serious injury|
|Emery defends ´responsible´ Neymar from lifestyle criticism|
|Wales lose Williams and Cuthbert for All Blacks clash|
|Australia enlist Bolt to sharpen up Ashes preparations|
|Wimbledon will not be the same without her – Duchess pays tribute to Novotna|
|Del Neri sacked by Udinese|
|Everton striker Niasse facing two-match ban after FA diving charge|
|Wyatt makes history as England salvage Women´s Ashes draw|
|Lampard excited by English clubs in Champions League|
|Kvitova ready for ´second career´ to start in 2018|
|Williams deny Kubica deal has been agreed|
|Thiago and Coman back for Bayern´s trip to Anderlecht|
|Prior launches second Lyon attack|
|Dybala hails Messi as ´our Maradona´, wants to play with Neymar|
|Stokes has let England down - Warner wades in ahead of Ashes opener|
|Sherwood talks up Spurs as potential Champions League winners|