@untymage Well, first of all, you can pay attention to Envoyer. This is a tool for zero downtime deployment, it is not free, but easy. There is also a free course on it at laracasts so you can watch it to understand better what it is about. And even if you are not going to use envoyer, I still recommend that you look at this course to understand what a deploy is in principle.
Secondly, you can use free tools for deployment, which also allow you to configure zero downtime deployment, but instead of money, they will require your time to configure it. At first, this can be difficult until you figure it out and learn how to configure the deployment as you need.
For example, it may be a capistrano (and a package for deploying laravel applications). There are others, but since I did not work with them, I can’t talk about them.
And thirdly, I do not recommend using a bare git for deployment. Most likely it will be no zero downtime deployment.
Just imagine a situation: you modified your application, pushed it to the repository, went to the server and did git pull. At this point, your code has already been updated, but the migrations have not yet been migrated, new dependencies that was added to composer.json have not been installed, and no frontend has been compiled. As a result, you will have to do it all manually and your application at this time will not work correctly (or will be completely broken). And for production sites, this behavior is certainly not acceptable (of course, you can do all this in another folder, and then just swap them with the main one, but you still have to do it manually and all this will take a lot of time and effort. So deployment tools are designed to automate this process. Or you can simply enable maintenance mode for the duration of the upgrade, but that will not be zero downtime deployment, and the upgrade process will still require a lot of attention).
So to summarize, during the deployment you want not only update your code, but also take all the necessary steps to make it work correctly: update the code, update dependencies, perform migrations, compile the frontend, update the cache (for views, configs and routes at least), complete tasks specific to your application (if any) and only after that switch to the new version (and in case of an error at any of these steps do not switch).
I hope this helps you better understand what deployment is and where to look further.