A distributed model is generally better suited for large projects with partly independent developers, such as the
Linux Kernel. It allows developers to work in independent branches and apply changes that can later be committed, audited and merged (or rejected) by others. This model allows for better flexibility and permits for the creation and adaptation of custom source code branches (
forks) whose purpose might differ from the original project. In addition, it permits developers to locally clone an existing code repository and work on such from a local environment where changes are tracked and committed to the local repository allowing for better tracking of changes before being committed to the master branch of the repository. Such an approach enables developers to work in local and disconnected branches, making it more convenient for larger distributed teams.
Central and branch repositories In a truly distributed project, such as
Linux, every contributor maintains their own version of the project, with different contributors hosting their own respective versions and pulling in changes from other users as needed, resulting in a general consensus emerging from multiple different nodes. This also makes the process of "forking" easy, as all that is required is one contributor stop accepting pull requests from other contributors and letting the codebases gradually grow apart. This arrangement, however, can be difficult to maintain, resulting in many projects choosing to shift to a paradigm in which one contributor is the universal "upstream", a repository from whom changes are almost always pulled. Under this paradigm, development is somewhat recentralized, as every project now has a central repository that is informally considered as the official repository, managed by the project maintainers collectively. While distributed version control systems make it easy for new developers to "clone" a copy of any other contributor's repository, in a central model, new developers always clone the central repository to create identical local copies of the code base. Under this system, code changes in the central repository are periodically synchronized with the local repository, and once the development is done, the change should be integrated into the central repository as soon as possible. Organizations utilizing this centralize pattern often choose to host the central repository on a third party service like
GitHub, which offers not only more reliable
uptime than self-hosted repositories, but can also add centralized features like
issue trackers and
continuous integration.
Pull requests Contributions to a source code repository that uses a distributed version control system are commonly made by means of a
pull request, also known as a
merge request. The contributor requests that the project maintainer
pull the source code change, hence the name "pull request". The maintainer has to
merge the pull request if the contribution should become part of the source base. The developer creates a pull request to notify maintainers of a new change; a comment thread is associated with each pull request. This allows for
focused discussion of code changes. Submitted pull requests are visible to anyone with repository access. A pull request can be accepted or rejected by maintainers. Once the pull request is reviewed and approved, it is merged into the repository. Depending on the established workflow, the code may need to be tested before being included into official release. Therefore, some projects contain a special branch for merging untested pull requests. Other projects run an automated test suite on every pull request, using a
continuous integration tool, and the reviewer checks that any new code has appropriate test coverage. ==History==