I forked a GitHub repository
facebook/folly
to juniway/folly
and I want to keep the local repository folly updated.Track
Check which remote URLs that Git has stored for your origin(or ohter names) to be used when reading and writing to that remote:
git remote -v
After I forked the facebook/folly to my Github account, I did this one time:
git clone git@github.com:facebook/folly.git
cd dotfiles
git remote add upstream git@github.com:juniway/folly.git
Update
Each time I want to update, from my local
master
branch:git fetch upstream
git rebase upstream/master
The goal of the rebase is to have a cleaner history if I have local changes or commits on the repo. It’s the difference between the the left and the right in the image below.
if you want to merge changes that you have made on your local repository, you can do:
git merge upstream/master
Commit rights upstream
If I also have commit rights to the upstream repo, I can create a local
upstream
branch and do work that will go upstream there.git checkout -b upstream upstream/master
In your local clone of your forked repository, you can add the original GitHub repository as a "remote". ("Remotes" are like nicknames for the URLs of repositories -
origin
is one, for example.) Then you can fetch all the branches from that upstream repository, and rebase your work to continue working on the upstream version. In terms of commands that might look like:# Add the remote, call it "upstream":
git remote add upstream https://github.com/whoever/whatever.git
# Fetch all the branches of that remote into remote-tracking branches,
# such as upstream/master:
git fetch upstream
# Make sure that you're on your master branch:
git checkout master
# Rewrite your master branch so that any commits of yours that
# aren't already in upstream/master are replayed on top of that
# other branch:
git rebase upstream/master
If you don't want to rewrite the history of your master branch, (for example because other people may have cloned it) then you should replace the last command with
git merge upstream/master
. However, for making further pull requests that are as clean as possible, it's probably better to rebase.Update: If you've rebased your branch onto
upstream/master
you may need to force the push in order to push it to your own forked repository on GitHub. You'd do that with:git push -f origin master
You only need to use the
-f
the first time after you've rebased.Configuring a remote for a fork
To sync changes you make in a fork with the original repository, you must configure a remote that points to the upstream repository in Git.
- Open Terminal (for Mac users) or the command prompt (for Windows and Linux users).
- 1. 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)
- 2. 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
- 3. 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)
Syncing a fork
Sync a fork of a repository to keep it up-to-date with the upstream repository
Open Terminal (for Mac users) or the command prompt (for Windows and Linux users).
- Change the current working directory to your local project. 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's master branch into sync with theupstream
repository, without losing your local changes. git merge upstream/master # Updateing 34e91da..16c56ad # Fast-forward # README | 9 ------ # README.md | 7 +++++ # 2 files changed, 7 insertions(+), 9 deletions(-) # delete mode 100644 README # create mode 100644 README.md
- If your local branch didn't have any unique commits, Git will instead perform a "fast-forward":
git merge upstream/master # Updating 34e91da..16c56ad # Fast-forward # README.md | 5 +++-- # 1 file changed, 3 insertions(+), 2 deletions(-)
No comments:
Post a Comment