summaryrefslogtreecommitdiff
path: root/Documentation/git-worktree.txt
blob: 3d288967f3be694a3fc650d6ae9c0544ec47b5db (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
git-worktree(1)
===============

NAME
----
git-worktree - Manage multiple worktrees


SYNOPSIS
--------
[verse]
'git worktree prune' [-n] [-v] [--expire <expire>]

DESCRIPTION
-----------

Manage multiple worktrees attached to the same repository. These are
created by the command `git checkout --to`.

A git repository can support multiple working trees, allowing you to check
out more than one branch at a time.  With `git checkout --to` a new working
tree is associated with the repository.  This new working tree is called a
"linked working tree" as opposed to the "main working tree" prepared by "git
init" or "git clone".  A repository has one main working tree (if it's not a
bare repository) and zero or more linked working trees.

Each linked working tree has a private sub-directory in the repository's
$GIT_DIR/worktrees directory.  The private sub-directory's name is usually
the base name of the linked working tree's path, possibly appended with a
number to make it unique.  For example, when `$GIT_DIR=/path/main/.git` the
command `git checkout --to /path/other/test-next next` creates the linked
working tree in `/path/other/test-next` and also creates a
`$GIT_DIR/worktrees/test-next` directory (or `$GIT_DIR/worktrees/test-next1`
if `test-next` is already taken).

Within a linked working tree, $GIT_DIR is set to point to this private
directory (e.g. `/path/main/.git/worktrees/test-next` in the example) and
$GIT_COMMON_DIR is set to point back to the main working tree's $GIT_DIR
(e.g. `/path/main/.git`). These settings are made in a `.git` file located at
the top directory of the linked working tree.

Path resolution via `git rev-parse --git-path` uses either
$GIT_DIR or $GIT_COMMON_DIR depending on the path. For example, in the
linked working tree `git rev-parse --git-path HEAD` returns
`/path/main/.git/worktrees/test-next/HEAD` (not
`/path/other/test-next/.git/HEAD` or `/path/main/.git/HEAD`) while `git
rev-parse --git-path refs/heads/master` uses
$GIT_COMMON_DIR and returns `/path/main/.git/refs/heads/master`,
since refs are shared across all working trees.

See linkgit:gitrepository-layout[5] for more information. The rule of
thumb is do not make any assumption about whether a path belongs to
$GIT_DIR or $GIT_COMMON_DIR when you need to directly access something
inside $GIT_DIR. Use `git rev-parse --git-path` to get the final path.

When you are done with a linked working tree you can simply delete it.
The working tree's entry in the repository's $GIT_DIR/worktrees
directory will eventually be removed automatically (see
`gc.pruneworktreesexpire` in linkgit::git-config[1]), or you can run
`git worktree prune` in the main or any linked working tree to
clean up any stale entries in $GIT_DIR/worktrees.

If you move a linked working directory to another file system, or
within a file system that does not support hard links, you need to run
at least one git command inside the linked working directory
(e.g. `git status`) in order to update its entry in $GIT_DIR/worktrees
so that it does not get automatically removed.

To prevent a $GIT_DIR/worktrees entry from from being pruned (which
can be useful in some situations, such as when the
entry's working tree is stored on a portable device), add a file named
'locked' to the entry's directory. The file contains the reason in
plain text. For example, if a linked working tree's `.git` file points
to `/path/main/.git/worktrees/test-next` then a file named
`/path/main/.git/worktrees/test-next/locked` will prevent the
`test-next` entry from being pruned.  See
linkgit:gitrepository-layout[5] for details.

Multiple checkout support for submodules is incomplete. It is NOT
recommended to make multiple checkouts of a superproject.

COMMANDS
--------
prune::

Prune working tree information in $GIT_DIR/worktrees.

OPTIONS
-------

-n::
--dry-run::
	With `prune`, do not remove anything; just report what it would
	remove.

-v::
--verbose::
	With `prune`, report all removals.

--expire <time>::
	With `prune`, only expire unused worktrees older than <time>.

SEE ALSO
--------

linkgit:git-checkout[1]

GIT
---
Part of the linkgit:git[1] suite