If you know you've already added the upstream repo then skip to step 5
cd
to the working directory- List the current configured remote repository for your fork.
git remote -v
# origin https://github.com/YOUR_USERNAME/YOUR_FORK.git (fetch)
# origin https://github.com/YOUR_USERNAME/YOUR_FORK.git (push)
- Specify a new remote upstream repository that will be synced with the fork.
git remote add upstream https://github.com/ORIGINAL_OWNER/ORIGINAL_REPOSITORY.git
- Verify the new upstream repository you've specified for your fork.
git remote -v
# origin https://github.com/YOUR_USERNAME/YOUR_FORK.git (fetch)
# origin https://github.com/YOUR_USERNAME/YOUR_FORK.git (push)
# upstream https://github.com/ORIGINAL_OWNER/ORIGINAL_REPOSITORY.git (fetch)
# upstream https://github.com/ORIGINAL_OWNER/ORIGINAL_REPOSITORY.git (push)
- Fetch the branches and their respective commits from the upstream repository. Commits to
master
will be stored in a local branch,upstream/master
.
git fetch upstream
# remote: Counting objects: 75, done.
# remote: Compressing objects: 100% (53/53), done.
# remote: Total 62 (delta 27), reused 44 (delta 9)
# Unpacking objects: 100% (62/62), done.
# From https://github.com/ORIGINAL_OWNER/ORIGINAL_REPOSITORY
# * [new branch] master -> upstream/master
- Check out your fork's local master branch.
git checkout master
# Switched to branch 'master'
- Merge the changes from
upstream/master
into your localmaster
branch. This brings your fork'smaster
branch into sync with the upstream repository, without losing your local changes.
git merge upstream/master
# Updating a422352..5fdff0f
# Fast-forward
# ...it will show all the changes that take place...
Here's the code condensed in to a block you can copy and paste into terminal (after you change the repos, and are already in the working directory)
git remote add upstream [ORIGINAL REPOSITORY]
git fetch upstream
git checkout master
git merge upstream/master
git push origin master -f
You can always add this to your bash functions
upstream-merge() {
[[ $@ == *"https://"*".git" ]] && URL="$@" || URL="https://github.com/$@.git"
if [[ !$(git remote -v | grep $URL) ]]; then
git remote rm upstream
git remote add upstream "$URL"
echo "added $URL to upstream"
git remote -v
fi
git fetch upstream
git checkout master
git merge upstream/master
}
You could also just add it to your .gitconfig
file as an alias
[alias]
...
upstream-merge = "!f() { [[ $@ == *\"https://\"*\".git\" ]] && URL=\"$@\" || URL=\"https://github.com/[email protected]\"; [[ !$(git remote -v | grep $URL) ]] && git remote rm upstream; git remote add upstream \"$URL\"; echo \"added $URL to upstream\"; git remote -v; git fetch upstream; git checkout master; git merge upstream/master; }; f"