Skip to content

Remotes

Working with Remotes

Remote repositories are versions of your project hosted on the internet or another network. They enable collaboration by allowing multiple developers to work on the same codebase, share changes, and maintain synchronized copies of the project.

What Are Remote Repositories?

A remote repository is a Git repository stored on a server rather than on your local machine. Remotes serve as: - Backup locations for your code - Collaboration hubs where team members share work - Central sources of truth for project state - Distribution points for software releases

While you work on your local copy, remotes allow you to sync changes with others and access work from different machines.

Common Remote Hosting Services

Several platforms provide Git repository hosting with additional collaboration features:

GitHub - Most popular platform for open source - Pull requests, issues, project boards - GitHub Actions for CI/CD - Free public and private repositories

GitLab - Complete DevOps platform - Built-in CI/CD pipelines - Self-hosted or cloud options - Integrated issue tracking and wikis

Bitbucket - Atlassian product, integrates with Jira - Supports both Git and Mercurial - Pipeline features for automation - Free for small teams

Viewing Remotes

To see which remote servers are configured for your repository:

git remote

This lists remote names. By default, Git names the original remote origin.

For more detailed information including URLs:

git remote -v

Example output:

origin  https://github.com/username/repo.git (fetch)
origin  https://github.com/username/repo.git (push)

The (fetch) URL is where Git pulls data from, and (push) is where it sends data. These are typically the same.

To see detailed information about a specific remote:

git remote show origin

This displays: - Remote URL - Branch tracking information - Which local branches push to which remote branches - Which remote branches are tracked locally

Adding Remotes

When you clone a repository, Git automatically adds the source as origin. To add additional remotes manually:

git remote add <name> <url>

Example:

git remote add upstream https://github.com/original-owner/repo.git

This is common when working with forks: - origin: Your fork - upstream: The original repository you forked from

To change a remote's URL:

git remote set-url origin https://github.com/username/new-repo.git

To remove a remote:

git remote remove <name>

Fetching from Remotes

Fetching downloads commits, files, and references from a remote repository without merging them into your work:

git fetch origin

What fetch does: - Downloads new commits from the remote - Updates remote-tracking branches (like origin/main) - Does NOT modify your working directory or current branch - Safe operation that never changes your local branches

Fetch all remotes:

git fetch --all

After fetching, you can inspect changes before merging:

git log origin/main
git diff origin/main

Pulling from Remotes

Pulling fetches remote changes AND merges them into your current branch:

git pull origin main

This is equivalent to:

git fetch origin
git merge origin/main

Pull with rebase instead of merge:

git pull --rebase origin main

Fetch vs Pull

Operation Fetch Pull
Downloads changes Yes Yes
Updates working directory No Yes
Can cause conflicts No Yes
Safe to run anytime Yes No*
Best for Reviewing before merging Quick sync when clean

*Pull can cause merge conflicts if you have uncommitted changes or divergent branches.

Pushing to Remotes

Pushing uploads your local commits to a remote repository:

git push origin main

This pushes the main branch to the origin remote.

Pushing New Branches

When you create a local branch, it doesn't automatically exist on the remote:

git checkout -b feature-login
# Make commits
git push origin feature-login

Setting Upstream Branches

Set up tracking so future pushes/pulls don't require specifying the remote:

git push -u origin feature-login

The -u (or --set-upstream) flag establishes a tracking relationship. After this, you can simply use:

git push
git pull

Check which upstream branch is tracked:

git branch -vv

Push All Branches

git push --all origin

Push Tags

Tags aren't pushed by default:

git push origin v1.0
git push --tags  # Push all tags

Force Push (Use with Caution)

git push --force origin main

Force pushing overwrites the remote history. Only use when: - You're certain no one else is using the branch - You've rebased or amended commits - You understand you're rewriting shared history

Safer alternative:

git push --force-with-lease origin main

This fails if the remote has commits you don't have locally, preventing accidental overwrites.

Understanding Origin

origin is simply the default name Git gives to the remote when you clone a repository. There's nothing special about the name itself - it's a convention.

When you run:

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

Git automatically: 1. Creates a remote named origin pointing to that URL 2. Fetches all data from it 3. Creates a local branch tracking the remote's default branch

You can rename origin:

git remote rename origin upstream

Working with Multiple Remotes

Multiple remotes are useful for: - Working with forks (origin + upstream) - Deploying to multiple environments - Collaborating across different platforms - Maintaining mirrors

Fork Workflow Example

# Clone your fork
git clone https://github.com/yourusername/project.git
cd project

# Add upstream remote
git remote add upstream https://github.com/original/project.git

# Fetch from upstream
git fetch upstream

# Merge upstream changes into your local main
git checkout main
git merge upstream/main

# Push updated main to your fork
git push origin main

Deployment Workflow

# Add production remote
git remote add production https://git.production-server.com/app.git

# Push to production
git push production main

Tracking Branches

Tracking branches are local branches with a direct relationship to a remote branch. When you clone a repository, Git creates a tracking branch automatically.

What Tracking Provides

  • git pull knows where to pull from
  • git push knows where to push to
  • git status shows if you're ahead/behind the remote

Create Tracking Branch

From a remote branch:

git checkout -b local-branch origin/remote-branch

Shorthand (if branch names match):

git checkout --track origin/feature-xyz

Even shorter (Git automatically tracks if name matches):

git checkout feature-xyz

Set Tracking for Existing Branch

git branch -u origin/main

View Tracking Information

git branch -vv

Example output:

  main        abc123 [origin/main: ahead 2] Latest commit
* feature-xyz def456 [origin/feature-xyz] Feature work
  experiment  789ghi No tracking

Common Remote Workflows

Clone → Modify → Push

Standard workflow for contributing to a project:

# 1. Clone the repository
git clone https://github.com/username/project.git
cd project

# 2. Create a feature branch
git checkout -b add-user-authentication

# 3. Make changes and commit
git add auth.js
git commit -m "Add user authentication system"

# 4. Push to remote
git push -u origin add-user-authentication

# 5. Create pull request on GitHub/GitLab
# (Done via web interface)

Staying Updated with Team Changes

# Fetch latest changes
git fetch origin

# View what changed
git log origin/main

# Update your local main
git checkout main
git pull origin main

# Update your feature branch with latest main
git checkout feature-branch
git merge main
# or
git rebase main

Syncing a Fork

# Fetch upstream changes
git fetch upstream

# Merge into your main
git checkout main
git merge upstream/main

# Update your fork
git push origin main

# Update your feature branch
git checkout feature-branch
git rebase main
git push --force-with-lease origin feature-branch

Best Practices for Remote Workflows

  1. Pull before you push: Always fetch/pull latest changes before pushing to avoid conflicts

    git pull origin main
    git push origin main
    

  2. Use feature branches: Keep main clean and work in branches

    git checkout -b feature/new-feature
    

  3. Commit often, push regularly: Don't let local work get too far ahead

    git commit -m "Checkpoint: implement basic structure"
    git push origin feature-branch
    

  4. Review before pulling: Use fetch to inspect changes first

    git fetch origin
    git diff origin/main
    git pull origin main
    

  5. Set upstream tracking: Simplifies future operations

    git push -u origin branch-name
    

  6. Never force push to shared branches: Especially main/master

  7. Exception: Your own feature branches with team agreement

  8. Keep remotes organized: Remove obsolete remotes

    git remote prune origin  # Remove stale remote-tracking branches
    git remote remove old-remote
    

  9. Use meaningful remote names: If working with multiple remotes

    git remote add production https://...
    git remote add staging https://...
    

  10. Communicate force pushes: If you must rewrite history on a shared branch, warn collaborators

  11. Verify remote URLs: Especially when switching between HTTPS and SSH

    git remote -v
    git remote set-url origin git@github.com:user/repo.git
    

Common Issues and Solutions

"Updates were rejected because the tip of your current branch is behind"

git pull origin main
git push origin main

"Authentication failed" - Check credentials - Ensure SSH keys are configured (for SSH URLs) - Verify repository access permissions

"No tracking information for the current branch"

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

"Remote branch not found"

git fetch origin
git checkout -b local-branch origin/remote-branch


Previous -- Up -- Next