Git - Remote Basics

Intermediate

Remote repositories are versions of your project hosted elsewhere (GitHub, GitLab, company servers). Understanding remotes is essential for collaboration and backup.

What are Remote Repositories?

A remote is a common repository that all team members use to exchange their changes. Unlike local repositories, remotes typically don't have a working directoryβ€”they're bare repositories used for sharing.

Local Repository:
your-computer/project/.git    ← Your working copy

Remote Repository:
github.com/user/project.git   ← Shared bare repository
                              ← No working directory
                              ← Used for coordination

Common Remote Hosting Services

ServiceTypeBest For
GitHubCloudOpen source, collaboration features
GitLabCloud/Self-hostedDevOps integration, CI/CD
BitbucketCloudAtlassian ecosystem integration
Azure DevOpsCloudMicrosoft ecosystem
Self-hostedOn-premiseSecurity, control

Cloning Remote Repositories

Basic Clone Operations

# Clone with HTTPS
git clone https://github.com/user/repository.git

# Clone with SSH (recommended)
git clone [email protected]:user/repository.git

# Clone to custom directory name
git clone https://github.com/user/repository.git my-project

# Clone specific branch
git clone -b develop https://github.com/user/repository.git
Clone output:
Cloning into 'repository'...
remote: Enumerating objects: 125, done.
remote: Counting objects: 100% (125/125), done.
remote: Compressing objects: 100% (85/85), done.
remote: Total 125 (delta 45), reused 98 (delta 25), pack-reused 0
Receiving objects: 100% (125/125), 23.45 KiB | 7.82 MiB/s, done.
Resolving deltas: 100% (45/45), done.

What Happens During Clone

When you clone a repository, Git:

  1. Creates a new directory with the repository name
  2. Initializes a Git repository in that directory
  3. Adds the remote repository as "origin"
  4. Downloads all repository data
  5. Checks out the default branch
  6. Sets up tracking branches

Managing Remotes

Viewing Remotes

# List all remotes
git remote

# Show remote URLs
git remote -v
git remote --verbose
Expected Output:
origin  https://github.com/user/repository.git (fetch)
origin  https://github.com/user/repository.git (push)
upstream https://github.com/original/repository.git (fetch)
upstream https://github.com/original/repository.git (push)

Adding Remotes

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

# Add with SSH
git remote add backup [email protected]:user/backup-repo.git

# Verify addition
git remote -v

Modifying Remotes

# Change remote URL
git remote set-url origin [email protected]:user/repository.git

# Change push URL only
git remote set-url --push origin [email protected]:user/repository.git

# Rename remote
git remote rename origin old-origin

# Remove remote
git remote remove upstream

Remote Branch Operations

Viewing Remote Branches

# Show all branches including remotes
git branch -a
git branch --all

# Show only remote branches
git branch -r
git branch --remotes
Expected Output:
* main
  feature-auth
  remotes/origin/HEAD -> origin/main
  remotes/origin/main
  remotes/origin/feature-auth
  remotes/origin/develop
  remotes/upstream/main

Tracking Remote Branches

# Create local branch tracking remote
git checkout -b feature-auth origin/feature-auth

# Modern syntax
git switch -c feature-auth origin/feature-auth

# Auto-tracking (if branch name matches)
git switch feature-auth  # Creates local branch if doesn't exist

# Set upstream for existing branch
git branch --set-upstream-to=origin/main main

Understanding Remote Tracking

Tracking Branch Relationships

# Show tracking information
git branch -vv
Expected Output:
  feature-auth  a1b2c3d [origin/feature-auth: ahead 2] Add login validation
* main          b2c3d4e [origin/main] Update documentation
  develop       c3d4e5f [origin/develop: behind 1] Feature branch

Status indicators:

  • ahead 2: Local branch has 2 commits not on remote
  • behind 1: Remote has 1 commit not on local
  • ahead 1, behind 2: Both local and remote have unique commits

Fetching from Remotes

Basic Fetch Operations

# Fetch from default remote (origin)
git fetch

# Fetch from specific remote
git fetch upstream

# Fetch all remotes
git fetch --all

# Fetch with pruning (remove deleted branches)
git fetch --prune
Fetch output:
remote: Enumerating objects: 15, done.
remote: Counting objects: 100% (15/15), done.
remote: Compressing objects: 100% (8/8), done.
remote: Total 12 (delta 4), reused 8 (delta 2), pack-reused 0
Unpacking objects: 100% (12/12), 2.43 KiB | 831.00 KiB/s, done.
From https://github.com/user/repository
   a1b2c3d..b2c3d4e  main       -> origin/main
 * [new branch]      feature-ui -> origin/feature-ui

What Fetch Does

git fetch:

  • βœ… Downloads new commits from remote
  • βœ… Updates remote-tracking branches
  • βœ… Does NOT modify your working directory
  • βœ… Does NOT merge changes automatically
  • βœ… Safe operationβ€”won't break your local work

Remote Repository Information

# Show remote repository details
git remote show origin
Remote details output:
* remote origin
  Fetch URL: https://github.com/user/repository.git
  Push  URL: https://github.com/user/repository.git
  HEAD branch: main
  Remote branches:
    develop                tracked
    feature-auth           tracked
    main                   tracked
  Local branches configured for 'git pull':
    main    merges with remote main
    develop merges with remote develop
  Local refs configured for 'git push':
    main    pushes to main    (up to date)
    develop pushes to develop (local out of date)

Setting Up New Remote Repository

Creating Repository on GitHub

After creating repo on GitHub:
# Initialize local repository
git init
git add README.md
git commit -m "Initial commit"

# Add GitHub as remote
git remote add origin https://github.com/username/repository.git

# Push to remote
git push -u origin main

Adding Remote to Existing Repository

# Add remote to existing local repo
git remote add origin [email protected]:username/repository.git

# Verify connection
git remote -v

# Push existing branches
git push -u origin main
git push -u origin develop

Multiple Remotes Workflow

Fork Workflow Setup

Working with forks (common in open source):
# Clone your fork
git clone [email protected]:yourusername/project.git
cd project

# Add original repository as upstream
git remote add upstream [email protected]:originalowner/project.git

# Verify remotes
git remote -v
Fork remote setup:
origin    [email protected]:yourusername/project.git (fetch)
origin    [email protected]:yourusername/project.git (push)
upstream  [email protected]:originalowner/project.git (fetch)
upstream  [email protected]:originalowner/project.git (push)

Keeping Fork Updated

# Fetch from upstream
git fetch upstream

# Switch to main branch
git switch main

# Merge upstream changes
git merge upstream/main

# Push to your fork
git push origin main

Remote Troubleshooting

Connection Issues

HTTPS authentication error:
remote: Support for password authentication was removed on August 13, 2021.
remote: Please use a personal access token instead.
Solutions:
# Switch to SSH
git remote set-url origin [email protected]:user/repo.git

# Or use personal access token
git remote set-url origin https://username:[email protected]/user/repo.git

SSH Key Issues

# Test SSH connection
ssh -T [email protected]

# Add SSH key to agent
ssh-add ~/.ssh/id_ed25519

# Generate new SSH key if needed
ssh-keygen -t ed25519 -C "[email protected]"

Remote Branch Cleanup

# Remove deleted remote branches locally
git remote prune origin

# Or during fetch
git fetch --prune

# See what would be pruned
git remote prune origin --dry-run

Advanced Remote Operations

Partial Clone

# Clone without full history (shallow)
git clone --depth 1 https://github.com/user/repository.git

# Clone specific files only (sparse checkout)
git clone --filter=blob:none --sparse https://github.com/user/repository.git
cd repository
git sparse-checkout set docs/ src/

Multiple Push URLs

# Push to multiple repositories
git remote set-url --add --push origin [email protected]:user/repo.git
git remote set-url --add --push origin [email protected]:user/repo.git

# Now git push pushes to both

Remote Configuration

# Default remote for push
git config --global push.default simple

# Always create tracking branches
git config --global branch.autosetupmerge always

# Prune during fetch by default
git config --global fetch.prune true

# Show more context in push output
git config --global push.verbose true

Best Practices

Remote Naming Conventions

  • origin: Your primary remote (your fork, your repo)
  • upstream: Original repository (when working with forks)
  • backup: Backup repository
  • deploy: Deployment repository
  • team: Shared team repository

Security Best Practices

  • βœ… Use SSH keys instead of passwords
  • βœ… Use personal access tokens for HTTPS
  • βœ… Keep SSH keys secure and rotate them regularly
  • βœ… Use different SSH keys for different services
  • ❌ Never commit passwords or tokens to repositories

Summary

You now understand Git remotes:

  • βœ… Remotes are shared repositories for collaboration
  • βœ… git clone sets up local copy with remote connection
  • βœ… git remote manages remote connections
  • βœ… git fetch downloads changes without merging
  • βœ… Remote tracking branches connect local and remote branches
  • βœ… Multiple remotes enable complex workflows
  • βœ… SSH provides secure, passwordless authentication

Next Steps

Now that you understand remotes, let's learn how to sync changes with remote repositories:

β†’ Git - Pushing & Pulling

Practice Tip: Create a test repository on GitHub and practice cloning, adding remotes, and fetching. Understanding remotes is crucial for collaborative development.