GitWorktree.org logoGitWorktree.org

Git Worktree vs Clone: Which Should You Use?

When you need to work on multiple branches simultaneously, you have two options: create a git worktree or clone the repository a second time. Both give you a separate working directory, but they work very differently under the hood. This page breaks down the trade-offs so you can choose the right approach.

Comparison at a Glance

AspectGit WorktreeGit Clone (separate copy)
Disk spaceOnly the working tree files — all Git objects are shared with the main worktreeFull copy of the entire repository including all Git objects
Git history syncInstant — commits made in one worktree are visible in all others immediatelyManual — you must git fetch or git pull to sync between clones
Shared refsYes — branches, tags, stashes, and reflog are sharedNo — each clone has its own refs; they are independent repositories
Setup speedNear-instant (git worktree add takes milliseconds)Slow for large repos — must download all objects over the network (or copy locally)
IndependenceLinked — deleting the main worktree can break linked worktreesFully independent — each clone stands on its own
Branch restrictionA branch can only be checked out in one worktree at a timeNo restriction — the same branch can be checked out in multiple clones

When to Use Git Worktree

When to Use a Separate Clone

Practical Examples

Creating a Worktree vs Cloning

Using git worktree (fast, lightweight)
# From your existing repo:
git worktree add ../project-hotfix hotfix/login-bug

# Done in milliseconds. ../project-hotfix shares
# the same .git objects as your main checkout.
Using git clone (full copy)
# Creates a completely independent copy:
git clone https://github.com/you/project.git ../project-hotfix

# Must wait for the download to finish.
# The two repos are completely separate.

Syncing Changes Between Two Clones

With separate clones, you need to push and fetch to share work:

# In clone A:
git commit -am "Fix login bug"
git push origin hotfix/login-bug

# In clone B:
git fetch origin
git log origin/hotfix/login-bug

With worktrees, none of this is needed. A commit made in one worktree is visible in all others immediately because they share the same object store and refs:

# In worktree A (on hotfix/login-bug):
git commit -am "Fix login bug"

# In worktree B (on main):
git log hotfix/login-bug  # Already has the commit

Disk Space Comparison

# Check the size of the .git directory (shared by all worktrees):
du -sh .git
# 850M    .git

# A worktree only adds the checked-out files:
du -sh ../feature-worktree --exclude=.git
# 120M    ../feature-worktree

# A full clone duplicates everything:
du -sh ../project-clone
# 970M    ../project-clone

Related Pages