Upton, hitting only .145 at the start of the game, had been held out of two consecutive starts by manager Fredi Gonzalez, who hoped the rest would jumpstart the center fielder.
And Upton came through with a single to right field off Henry Rodriguez (0-1) to drive in Jordan Schafer from second base for the game-winner.
A sliding Schafer narrowly beat the throw from Roger Bernadina in right field, and Upton then was mobbed by his teammates between first base and second base.
Rodriguez walked Evan Gattis to open the 10th. Schafer replaced Gattis as a pinch-runner. Ramiro Pena popped out trying to bunt a high fastball, but Schafer stole second and Uggla drew a walk before Upton ended the game.
Jordan Walden (2-1) pitched a perfect 10th for the Braves.
The Nationals couldn’t score in the ninth after having runners on second and third with no outs against Braves closer Craig Kimbrel.
With the game tied 1-all, Ryan Zimmerman led off the ninth with a soft single that fell just beyond the reach of shortstop Andrelton Simmons, who was running toward the outfield. Zimmerman moved to third when Adam LaRoche followed with a double to center field.
Kimbrel struck out Ian Desmond before Roger Bernadina hit a grounder to third baseman Chris Johnson, who threw out Zimmerman at the plate, and LaRoche advanced to third. Danny Espinosa popped out to left fielder Justin Upton to end the inning.
Tim Hudson and Gio Gonzalez delivered similarly strong starts. Hudson gave up one unearned run on three hits in 7⅓ innings. Gonzalez gave up one run on three hits and one walk in seven innings.
Hudson is 1-4 with a 7.67 ERA in six road starts and 3-0 with a 2.39 ERA in six home starts.
He is 0-3 with two no-decisions since his last win on May 5.