In a large Dutch oven or pot, cook the diced bacon until crispy. Remove with a slotted spoon and set aside, leaving the bacon fat in the pot.
Add butter to the bacon fat and sauté the diced onions until translucent, about 5 minutes. Add minced garlic and cook for another minute.
Sprinkle flour over the onion mixture and stir constantly for 2-3 minutes to create a roux.
Gradually add chicken broth while whisking continuously to prevent lumps from forming.
Add diced potatoes, milk, and cream. Bring to a gentle simmer and cook for 15-20 minutes, or until potatoes are tender.
Using a potato masher, partially mash some of the potatoes to thicken the soup while leaving some chunks for texture.
Stir in the shredded cheese until melted. Season with salt and pepper to taste.
Serve hot, topped with extra cheese, crispy bacon, green onions, and a dollop of sour cream.