Add the potatoes to a large stockpot and cover them with water. Generously salt the water and bring the pot to a boil. Cook for about 10 minutes, or until the potatoes are easily pierced with a fork. Drain and set aside.
Add the bacon to a large dutch oven or soup pot over medium-high heat. Cook, stirring occasionally until the bacon is browned and crisped to your liking. Remove the bacon with a slotted spoon and transfer it to a paper towel-lined plate.
Remove all but 2 tbsp of the bacon fat from the pot. Add the butter to the pot and melt, then stir in the onion. Cook for 2-3 minutes until the onion browns slightly, then add the garlic. Cook the garlic for about 1 minute.
Add the flour to the pot and stir well to make sure the flour is smooth. Let it cook for another minute. Whisk in the milk, 1 cup at a time, stirring until completely smooth before adding more, then whisk in the chicken broth.
Add the potatoes and half of the cooked bacon to the pot, then bring everything to a boil. Reduce the heat to a simmer, cover, and cook for 5 minutes. Remove the lid and stir in 1 cup of the cheese until completely melted and smooth, then stir in the sour cream.
Taste for salt and pepper and season as needed. Use your whisk, in a mashing motion, to break up the potatoes until the soup has reached your desired consistency. Top with the remaining cheddar cheese and bacon, the green onion, and a dollop of sour cream to serve.