Jeff Mathis provided all the support Hand would need with a two-run double.
The Marlins have won four of five on their crucial road trip -- after taking three of four in Atlanta -- which is factoring heavily into whether they make any deals by Thursday's non-waiver Trade Deadline.
Looking to secure a rotation spot, Hand has now gone back-to-back starts of at least seven innings. Both were wins.
"He looks like a guy who is on a mission," Marlins manager Mike Redmond said. "A guy who understands the opportunity he's been given and wants to make the most of it."
Hand opened the season in the bullpen before moving into the rotation. The lefty dealt with an ankle injury and subsequent disabled-list stint, in which he used the time away to fine-tune his pitches. He's seeing results now and is being given the chance to remain in the rotation.
"Nothing is done yet," Hand said. "I'm still trying to go out every day and solidify myself in this rotation. Nothing is just going to be given to me. I'm going to have to go out there and prove it every fifth day, and that's what I'm going to do."
The only other time Hand didn't allow a run in a seven-inning start was on July 7, 2011 -- in a win also over the Astros.
"If this can become a consistent thing for him, which I hope it is, this guy can really pitch," Redmond said. "His stuff is much sharper. He was pitching out of the bullpen. It's tough coming out of the bullpen to get those pitches going. Give him credit. He went down and worked on his stuff, worked on his command, worked on his breaking balls."
Steve Cishek worked a clean ninth, striking out two, to pick up his fifth save in six games.
Only twice did Houston have a runner reach second. Astros manager Bo Porter is familiar with Hand from the time he previously spent with the Marlins.
"I felt like we had some pitches we could've hit and we didn't put them in play efficiently," Porter said.
Hand needed to be sharp because Houston lefty Dallas Keuchel was also impressive. Keuchel worked seven innings, giving up nine hits while striking out seven. The two runs he yielded were unearned.
Miami broke through in the seventh. Jarrod Saltalamacchia reached on a one-out error charged to center fielder Enrique Hernandez. Saltalamacchia stung a hard liner to Hernandez, who was playing most of the Miami hitters in all night. The center fielder made a leaping attempt, but he couldn't come up with the ball.
Keuchel still nearly worked out of it, but with two outs, Adeiny Hechavarria beat out a grounder to short. Mathis plated both runners with his double to left-center.
For most of the night, the Marlins wasted numerous chances. They finished 4-for-17 with runners in scoring position, stranding nine runners.
In the fourth inning, Miami couldn't convert on another chance with a runner in scoring position and less than two outs. Donovan Solano bunted for a single, and he moved to second on a wild pitch. With one out and Casey McGehee at the plate, Solano was caught trying to steal third.
The Marlins mounted a threat in the fifth inning after Saltalamacchia doubled and moved to third on Marcell Ozuna's single to left. With runners on the corners and no outs, Keuchel put out the threat. Hechavarria lined out to center and Mathis tapped into a 6-4-3 double play.
"I was frustrated before. I had a chance to push a run across and wasn't able to do it," Mathis said. "Bradley kept us in the game and I got another opportunity, and luckily I got it done."