When you need to get changes that other team members have pushed to the remote repository, you have two commands to choose from: [`git fetch`](/git/commands/git-fetch) and [`git pull`](/git/commands/git-pull). They both download data from the remote, but they differ in what happens next.

## Quick comparison

| | `git fetch` | `git pull` |
|---|---|---|
| Downloads remote changes | Yes | Yes |
| Updates your working files | No | Yes (auto-merges) |
| Risk of merge conflicts | None | Possible |
| Safe to run anytime | Yes | Be careful on dirty working trees |
| Equivalent to | Just the download step | `git fetch` + `git merge` |

The short version: `git fetch` downloads changes and lets you decide what to do with them. `git pull` downloads *and* merges in one step.

## How `git fetch` works

`git fetch` retrieves commits, branches, and tags from the remote without touching your local branches or working directory. It updates your *remote-tracking branches* (like `origin/main`) so you can see what's changed.

```bash
git fetch origin
```

After fetching, you can inspect the differences before merging:

```bash
# See what commits are on the remote that you don't have
git log HEAD..origin/main --oneline

# See the actual code changes
git diff HEAD origin/main
```

You can run `git fetch` as often as you like --- it won't break anything or create merge conflicts. It's purely a read operation on your local repository.

## How `git pull` works

`git pull` is essentially a shortcut for running `git fetch` followed by [`git merge`](/git/commands/git-merge). It downloads the remote changes and immediately merges them into your current branch:

```bash
git pull origin main
```

This is convenient when you know you want the latest changes and expect a clean merge. Most developers run `git pull` at the start of the day or before starting work on a new feature.

The downside is that if there are conflicting changes, you'll need to resolve merge conflicts right away --- you don't get a chance to review the incoming changes first.

## When to use fetch vs pull

**Use `git fetch` when:**

- You want to see what's changed on the remote before merging
- You're in the middle of work and don't want to deal with conflicts yet
- You're reviewing a colleague's branch before integrating it
- You want to compare branches (`git diff main origin/main`)

**Use `git pull` when:**

- You're starting fresh work and need the latest code
- You're on a branch that only you work on
- You're confident there won't be conflicts

## Using fetch + merge as an alternative to pull

Instead of `git pull`, you can fetch and merge as separate steps. This gives you the same result but with a chance to inspect changes between the two steps:

```bash
git fetch origin
git log HEAD..origin/main --oneline   # review what's coming in
git merge origin/main                  # merge when ready
```

This workflow is especially useful on long-running feature branches where you want to understand what's changed on `main` before pulling it in.

## Pull with rebase for cleaner history

By default, `git pull` creates a merge commit when your local branch has diverged from the remote. Over time, these merge commits clutter the log. You can use [`rebase`](/git/commands/git-rebase) instead to replay your local commits on top of the remote changes:

```bash
git pull --rebase origin main
```

This produces a linear history without merge commits. To make rebase the default for all pulls:

```bash
git config --global pull.rebase true
```

**When to avoid rebase:** if you've already pushed the commits you'd be rebasing, or if you're working on a shared branch where others depend on the exact commit hashes.

## Related

- [`git fetch` command reference](/git/commands/git-fetch)
- [`git pull` command reference](/git/commands/git-pull)
- [`git merge` command reference](/git/commands/git-merge)
- [`git rebase` command reference](/git/commands/git-rebase)

---

[DeployHQ](https://www.deployhq.com) automatically fetches the latest changes from your repository when deploying, so your production server always gets the right version. [Try it free](https://www.deployhq.com/signup).
