In a large pot over medium heat, cook the bacon until crispy. Transfer to a paper towel-lined plate to drain, then crumble. Pour out all but 1 tablespoon of the bacon grease.
Add chopped onion to the pot with the reserved bacon grease. Cook for 3–4 minutes until softened. Stir in minced garlic and cook for 1 more minute. Add butter and let it melt.
Sprinkle flour over the onion mixture and stir constantly for 1–2 minutes to cook off the raw flour taste. This will thicken the soup later. Don’t rush this step—if the roux burns, start over.
Slowly pour in chicken broth while stirring to blend the roux into the liquid. Add diced potatoes, salt, and pepper. Bring to a boil, then reduce heat to low. Cover and simmer for 15–20 minutes until potatoes are fork-tender.
Use an immersion blender to partially blend the soup, leaving some potato chunks for texture. If you don’t have an immersion blender, transfer 2 cups of soup to a regular blender, blend until smooth, then return it to the pot.
Stir in milk, sour cream, and shredded cheese until melted and smooth. Taste and adjust salt and pepper if needed. If the soup is too thick, add a splash of broth or milk.
Ladle into bowls and top with crumbled bacon, green onions, extra cheese, and a dollop of sour cream.