You can't push a value once and pop it twice, that's not how a stack works! You're popping something else off the stack. So why does this even work?
Linux passes your program arguments on the stack, with argc on top. So when you don't pass any arguments, argc just HAPPENS to be 1. Which you then pop into rdi. Gross!
However, using the stack-based instructions as xpasky hinted at:
I get down to 159 bytes! I updated the article to reflect that