Skip to content

Mastering Git – Part 5: Remote Repositories and Working with Teams

Git is powerful on your local machine, but its real strength shines when working with remote repositories in a team. Whether you're contributing to an open-source project or collaborating with colleagues, understanding how to work with remote repositories efficiently is crucial.

In this post, we'll cover:

  • ✅ The difference between local and remote repositories
  • ✅ Cloning vs forking – When to use each
  • ✅ Pushing and pulling changes without breaking things
  • ✅ Handling merge conflicts in remote workflows
  • ✅ Best practices for team collaboration

By the end, you'll be comfortable using Git for team projects and know how to manage remote repositories like a pro.


1. Local vs Remote Repositories

  • A local repository exists only on your computer (.git folder).
  • A remote repository is hosted on a platform like GitHub, GitLab, Bitbucket, or Azure DevOps.
  • You push your local commits to a remote repo to share them.
  • You pull remote changes to stay up to date.

2. Cloning vs Forking – What's the Difference?

Cloning a Repository (For Team Collaboration)

If you are part of a team working on a shared repository, you clone it to get a copy on your local machine:

git clone https://github.com/user/repo.git

🔹 Use clone when you are a direct collaborator and will push changes back to the same repository.


Forking a Repository (For Open Source Contributions)

If you don’t have write access to a repository, you fork it (copy it to your own GitHub account) and then clone it.

1️⃣ Fork the repo on GitHub\ 2️⃣ Clone your fork

git clone https://github.com/yourusername/repo.git

3️⃣ Add the original repository as an "upstream" remote

git remote add upstream https://github.com/originaluser/repo.git

4️⃣ Stay up to date with the latest changes

git fetch upstream
git merge upstream/main

🔹 Use fork when contributing to open-source projects or repositories you don’t have direct write access to.


3. Pushing and Pulling Changes

A. Pushing Changes to a Remote Repository

Once you've committed changes locally, push them to the remote repository:

git push origin main
  • 🔹 origin refers to the remote repository (default name).
  • 🔹 main is the branch being pushed.

If you're working on a new branch:

git push -u origin feature-branch

🔹 The -u flag sets the remote tracking branch so you can just use git push next time.


B. Pulling the Latest Changes

Before making new changes, always pull the latest updates from the remote repository to avoid conflicts.

git pull origin main
  • 🔹 git pull = git fetch + git merge
  • 🔹 It downloads the latest changes and automatically merges them.

🚨 Best Practice: Use rebase instead of merge to keep history clean:

git pull --rebase origin main

4. Handling Remote Merge Conflicts

Conflicts occur when two people edit the same part of a file differently.

A. What Happens During a Merge Conflict?

If Git detects a conflict when pulling changes, you’ll see:

CONFLICT (content): Merge conflict in file.txt
Automatic merge failed; fix conflicts and then commit the result.

B. How to Resolve a Merge Conflict

1️⃣ Open the conflicted file. It will look like this:

<<<<<<< HEAD
Your changes
=======
Their changes
>>>>>>> origin/main

2️⃣ Manually edit the file to keep the correct version.\ 3️⃣ Stage the resolved file:

git add file.txt

4️⃣ Complete the merge:

git commit -m "Resolved merge conflict"

✅ Always communicate with your team if conflicts arise frequently!


5. Working with Multiple Remotes

If you're contributing to multiple repositories, you might have more than one remote.

A. Listing Remotes

git remote -v

🔹 Example output:

origin    https://github.com/yourusername/repo.git (fetch)
origin    https://github.com/yourusername/repo.git (push)
upstream  https://github.com/originaluser/repo.git (fetch)
upstream  https://github.com/originaluser/repo.git (push)

B. Fetching Updates from Another Remote

git fetch upstream
git merge upstream/main

✅ Useful for staying up to date when working on forks.


6. Best Practices for Team Collaboration

✅ Pull the latest changes before pushing\ Run git pull --rebase origin main before making changes to avoid conflicts.

✅ Use feature branches\ Never work directly on main. Use git checkout -b feature-branch for new changes.

✅ Write meaningful commit messages\ Avoid messages like "fixed stuff". Instead, use:

fix(auth): Corrected login validation issue

✅ Use Pull Requests (PRs) for code reviews\ Instead of pushing directly to main, submit a Pull Request (PR) for review.

✅ Keep branches short-lived\ Don’t let feature branches last too long—merge them frequently.

✅ Avoid force pushing (git push --force)\ This rewrites history and can overwrite teammates' work. Only use when necessary.


7. Summary of Key Commands

Action Command
Clone a repository git clone URL
Add a remote repository git remote add origin URL
Push changes to a remote repo git push origin branch-name
Pull latest changes git pull origin branch-name
Fetch latest changes (without merging) git fetch origin
Merge latest changes after fetching git merge origin/main
Rebase latest changes (cleaner history) git pull --rebase origin main
Add an upstream remote (for forks) git remote add upstream URL
Fetch updates from upstream git fetch upstream
Merge upstream changes into local git merge upstream/main

What’s Next?

Now you know how to push, pull, and collaborate with teams, but how do you keep history clean and structured?

In Part 6: Git Best Practices – Writing Clean History, we’ll cover:

  • ✅ How to structure commits properly
  • ✅ Writing meaningful commit messages
  • ✅ Keeping a linear Git history
  • ✅ Using .gitignore effectively