Crisp the bacon. In a large Dutch oven or heavy pot, cook the bacon over medium heat until deeply crisp, 6–8 minutes. Transfer to a paper-towel-lined plate, leaving 1 tablespoon of bacon drippings in the pot.
Sauté the aromatics. Add the butter to the bacon drippings over medium heat. Add the diced onion and a pinch of salt; cook 4–5 minutes until soft and translucent. Stir in the garlic and cook 30 seconds more until fragrant but not browned.
Simmer the potatoes. Add the diced potatoes and chicken broth. The broth should just cover the potatoes — add a splash of water if needed. Bring to a boil, then reduce to a steady simmer. Cook 15–18 minutes, until the potato cubes are completely tender and easily pierced with a fork.
Mash for thickness. Using a potato masher, mash about half the potatoes directly in the pot, leaving the rest chunky for texture. This is the secret to a thick, hearty soup without any flour. For a silkier soup, blend a ladleful or two with an immersion blender — but keep plenty of chunks.
Add the milk. Reduce the heat to low and stir in the milk. Warm gently for 2–3 minutes. Do not let the soup boil from this point on — boiling after dairy is added can cause curdling.
Melt in the cheese. Remove the pot from the heat. Add the shredded cheddar a handful at a time, stirring until each addition melts before adding more. Off-heat melting keeps the cheese silky instead of grainy or oily.
Finish with sour cream and bacon. Stir in the sour cream until smooth, then fold in half the crumbled bacon. Taste and season generously with salt and black pepper — potatoes need assertive seasoning.
Load it up and serve. Ladle into warm bowls and top each serving with the remaining bacon, extra cheddar, a dollop of sour cream, and a shower of green onions. Serve immediately while it is steaming and the cheese is melty.