the version control system
see also git command reference
git has the advantage that it is decentralised (many repositories, each can share between each other) and having been developed for a big and active project like the linux kernel, where it is constantly tested
examples for the use of branches for development with multiple people
branch name: master or next
changes for specific new features. if the feature is working, add the commits with a merge into the master branch. particularly useful if multiple features are developed in parallel and the main branch should still possibly receive changes at the same time
tested versions
tested versions that correspond to some kind of release and might still receive fixes without being fully updated to the newest program version
the master branch should contain the most recent development version. the question that can be used to decide what the master branch should be for is what version of the codebase someone who clones a repository without specifying a branch should receive, since they will get the master branch by default. switching branches is easy. should clones without explicit branch copy the development version or a stable version? from the perspective of a developer, who checks out the repository to contribute to the project, it would probaly be ideal to receive the most current development version, so they can start developing immediately without searching for the right branch and switching. from the perspective of an end-user of the application, it would be desirable to have "master" be a stable version, but git repositories are mainly for versioning source code in development, git repositories are primarily for developers also because end-users do not need git features as much and it is more complicated anyway than say downloading and extracting an archive file, besides requiring a git client. so why optimise a git repository for end-users
that does not make sense since it does not matter which branch is automatically deployed. automatic deployment is an automated process where the source and branch has to be configured in any case
the general development state is also unique and it is more likely that there are more stable or release branches than the most current development branch where new features are continuously merged in
git flow is a set of tools and a specification of how to use git and branches that has gained popularity. but it is overcomplicated and not worth the effort. with extra commands, software wrappers and many forced requirements for the branching process (must use tags, must use hotfix and release branches, master is stable and branch named "develop" is added, et cetera) it introduces many sources of errors and ways to get into an unclean state. every developer has to install the utility applications. the actual benefit is not even that distinct because it is basically just feature branches