In a large pot, cook the bacon until crispy. Remove and set aside. Discard all but 1 tablespoon of bacon fat.
Add butter to the pot with the reserved bacon fat and sauté the onion and garlic until translucent.
Stir in the flour and cook for 1 minute to form a roux.
Slowly whisk in chicken broth, then add potatoes. Bring to a boil, reduce heat, and simmer until potatoes are tender (15–20 minutes).
Use a potato masher to lightly mash some of the potatoes for a thicker texture.
Stir in milk, heavy cream, and shredded cheese. Simmer for another 10 minutes, stirring frequently.
Season with salt and pepper to taste.
Top with bacon, green onions, and sour cream before serving.