"My problem is that it only finds the first entry. I have two entries for each search term."
Your original code only finds the first entry because it only searches the range once.
Once it Finds (or doesn't find) the value it is looking for [Range("A" & gName)], it simply continues through the For-Next loop, incrementing the search value row (gName) and searching the range for the new value.
What you need to do is have VBA search for the next occurance (.FindNext) of the value once it Finds it.
Since the Find function starts its search at the current cell location, searches downward and then loops back up to the top of the range and continues searching from there, the example code I posted shows that VBA stores the FirstAddress where Find found the value and continues to search for the same value until it finds it in the same address as it found the first occurance. That tells VBA that it has searched the entire range and found all occurances of the values, whether there was 1 or 100.
Inside the Do Loop is where you want to put the actions you want to occur each time the value is found, so that those actions are taken each time the value is found.
If Not g Is Nothing Then
firstAddress = g.Address
nxtRw = Sheets(2).Range("E" & Rows.Count).End(xlUp).Row + 1
g.EntireRow.Copy Destination:=Sheets(2).Range("A" & nxtRw)
Loop While Not g Is Nothing And g.Address <> firstAddress
Click Here Before Posting Data or VBA Code ---> How To Post Data or Code.