The `git fetch` command downloads new commits, branches, and tags from a remote repository without changing your local working copy. It's a safe way to see what others have been working on before you decide to integrate their changes.

## Fetching from a specific remote

To fetch updates from a named remote:

```bash
$ git fetch origin
remote: Enumerating objects: 12, done.
remote: Counting objects: 100% (12/12), done.
remote: Compressing objects: 100% (4/4), done.
From github.com:your-org/your-repo
   a1b2c3d..e4f5g6h  main       -> origin/main
 * [new branch]      staging    -> origin/staging
```

Here, `origin` is the name of the remote (the default when you clone a repository). Git contacts the remote, downloads any new data, and updates your remote-tracking branches (like `origin/main`) — but your local `main` branch stays exactly where it was.

You can then inspect what changed with `git log origin/main` or `git diff main origin/main` before deciding to merge or rebase.

## Fetching all remotes

If your project has multiple remotes (e.g. `origin` and `upstream` for a fork), you can fetch from all of them at once:

```bash
$ git fetch --all
Fetching origin
Fetching upstream
```

This is useful when you need to stay up to date with both the original repository and your fork.

## Pruning deleted branches

Over time, branches get merged and deleted on the remote, but your local copy still has stale references to them. Use the `--prune` flag to clean these up:

```bash
$ git fetch --prune
From github.com:your-org/your-repo
 - [deleted]         (none)     -> origin/old-feature
```

This removes any remote-tracking branches that no longer exist on the remote. You can also set this to happen automatically on every fetch:

```bash
$ git config --global fetch.prune true
```

For more on cleaning up stale branch references, see [How to clean up deleted branches](/git/faqs/how-to-clean-up-deleted-branches).

## Fetch vs pull

The key difference: `git fetch` only downloads — it never modifies your working copy or local branches. [git pull](/git/commands/git-pull) is essentially `git fetch` followed by `git merge` (or `git rebase`, depending on your config).

Use `fetch` when you want to review incoming changes before integrating them. Use `pull` when you're ready to update your local branch immediately. For a detailed comparison, see [Difference between git fetch and git pull](/git/faqs/difference-between-git-fetch-and-git-pull).

## Managing remotes

To see which remotes are configured, or to add and remove them, see [git remote](/git/commands/git-remote).

When you're ready to push your own changes back, [DeployHQ](https://www.deployhq.com) can automatically deploy on every push — so fetching, reviewing, and merging upstream changes is the safe first step before your code goes live.