Git Remotes

Bare Repository

So far, we’ve just been using our git repo for ourselves.

Let’s look back at the figure illustrating ways we can share with distributed version control:


When multiple developers are working on the same code together, it is convenient to have a central repository that everyone can communicate with.

We use a special bare repository for this purpose. A bare repo has all of the metadata for the project, but we don’t work directly in it. This way we avoid the risk of having unsaved changed in the repo that other people are using to synchronize with.

Let’s create a bare repo from our project2 project. From your home directory (assuming that project2 is ~/project2/, we do:

git clone --bare project2

Now we see a new directory project2.git.

A First Example of Collaboration

Let’s pretend we are a different user. Let’s make a directory for our pretend user and clone our project:

cd ~
mkdir newuser
cd newuser
git clone ~/project2.git

The clone command make a new git repo for our user called project2/

If we do a git log in it, we’ll see the whole history we had from our earlier work.

Now, this repo knows where it was cloned from, through a concept called remotes. A remote is a repo (usually a bare repo) that we communicate with the share our changes (a push) of get changes from other users (a pull). We can see our remote by doing:

git remote -v

We’ll see something like:

origin       /home/ (fetch)
origin       /home/ (push)

Now’s let’s make a change

try it…

add the new user’s name to authors.txt and commit the change.

Now we can share our changes with our remote – the bare repo by doing a push.

git push

This pushes our changes back to the bare repo. Now go back to our original repo:

cd project2

We need to add a remote to this original repo (if you do git remote it will show nothing). We’ll add a remote called origin.

git remote add origin ~/project2.git

Now, we can communicate with the bare repo and get the changes that the other user made by doing a pull:

git pull origin main

To make our life easier, we can tell git what remote branch to track:

git branch --set-upstream-to=origin/main main

then we can do just

git pull