Forking or cloning a Git project on popular platforms like GitHub, GitLab, and Bitbucket is a common process and an important part of the opensource community.
But how to maintain and synchronize a fork with updates from the original project at any time if there are changes there?
This is easily possible via so-called remote repositories.
A remote repository is usually added to the local project with
git remote add. This step is often done once at the very beginning of a project for
origin, so that the local project points to the project at the corresponding platform.
The command looks like this:
git remote add <remotename> <url>.
The name is arbitrary and the URL points to the appropriate repository.
A concrete example looks like this:
git remote add upstream [email protected]:magento/magento2.git
By default I use the name
upstream to point to the original repository I forked from.
After that, on the same branch, I can use
git pull upstream branchname to fetch the changes from the specified remote repository
merge you can synchronize your own fork relatively easy this way.
Ideally, the original branches should not be touched, or the changes from
upstream should be integrated via
merge --ff (fast-forward merge),
merge --no-ff (with merge commit) or
git pull --rebase.
The settings for the
remotes are stored locally in the file
So, in summary, the process is as follows:
git remote add upstream git@... git pull upstream master
git fetch upstream master git rebase upstream master
Optionally you can also use the automatically created branch
upstream/master directly, i.e.
git rebase upstream/master.
The current remote repositories including URL can be listed with
git remote -v.
For example, I had done this with post-mortems in my fork with the open pull requests, since the project was not maintained at the time. In that case, I added each fork of the original project as a remote repository and integrated the respective branch from the pull requests with
merge --no-ff and submitted all the changes to the original project as a pull request.
git remote add matkoniecz [email protected]:matkoniecz/post-mortems.git git fetch matkoniecz git merge --no-ff matkoniecz/dedup git remote add loganmeetsworld [email protected]:loganmeetsworld/post-mortems.git git fetch loganmeetsworld git merge --no-ff loganmeetsworld/homebrew git remote add peterfroehlich [email protected]:peterfroehlich/post-mortems.git git fetch peterfroehlich git merge --no-ff peterfroehlich/patch-1 git remote add takirala [email protected]:takirala/post-mortems.git git fetch takirala git merge --no-ff takirala/patch-1 git push