]> git.ipfire.org Git - thirdparty/git.git/blame - Documentation/git-worktree.txt
Sync with 2.35.8
[thirdparty/git.git] / Documentation / git-worktree.txt
CommitLineData
df0b6cfb
NTND
1git-worktree(1)
2===============
3
4NAME
5----
bc483285 6git-worktree - Manage multiple working trees
df0b6cfb
NTND
7
8
9SYNOPSIS
10--------
11[verse]
0db4961c 12'git worktree add' [-f] [--detach] [--checkout] [--lock [--reason <string>]] [-b <new-branch>] <path> [<commit-ish>]
d97eb302 13'git worktree list' [-v | --porcelain [-z]]
58142c09 14'git worktree lock' [--reason <string>] <worktree>
9f792bb4 15'git worktree move' <worktree> <new-path>
7b722d90 16'git worktree prune' [-n] [-v] [--expire <expire>]
d228eea5 17'git worktree remove' [-f] <worktree>
b214ab5a 18'git worktree repair' [<path>...]
6d308627 19'git worktree unlock' <worktree>
df0b6cfb
NTND
20
21DESCRIPTION
22-----------
23
bc483285 24Manage multiple working trees attached to the same repository.
df0b6cfb 25
93a36493 26A git repository can support multiple working trees, allowing you to check
4d5a3c58 27out more than one branch at a time. With `git worktree add` a new working
c57bf8ce
DS
28tree is associated with the repository, along with additional metadata
29that differentiates that working tree from others in the same repository.
30The working tree, along with this metadata, is called a "worktree".
31
32This new worktree is called a "linked worktree" as opposed to the "main
33worktree" prepared by linkgit:git-init[1] or linkgit:git-clone[1].
34A repository has one main worktree (if it's not a bare repository) and
35zero or more linked worktrees. When you are done with a linked worktree,
36remove it with `git worktree remove`.
93a36493 37
dccadad7
ES
38In its simplest form, `git worktree add <path>` automatically creates a
39new branch whose name is the final component of `<path>`, which is
40convenient if you plan to work on a new topic. For instance, `git
41worktree add ../hotfix` creates new branch `hotfix` and checks it out at
c57bf8ce
DS
42path `../hotfix`. To instead work on an existing branch in a new worktree,
43use `git worktree add <path> <branch>`. On the other hand, if you just
44plan to make some experimental changes or do testing without disturbing
45existing development, it is often convenient to create a 'throwaway'
46worktree not associated with any branch. For instance,
47`git worktree add -d <path>` creates a new worktree with a detached `HEAD`
48at the same commit as the current branch.
dccadad7 49
3f0b42bd
ES
50If a working tree is deleted without using `git worktree remove`, then
51its associated administrative files, which reside in the repository
52(see "DETAILS" below), will eventually be removed automatically (see
5f5f553f 53`gc.worktreePruneExpire` in linkgit:git-config[1]), or you can run
c57bf8ce
DS
54`git worktree prune` in the main or any linked worktree to clean up any
55stale administrative files.
93a36493 56
c57bf8ce
DS
57If the working tree for a linked worktree is stored on a portable device
58or network share which is not always mounted, you can prevent its
59administrative files from being pruned by issuing the `git worktree lock`
60command, optionally specifying `--reason` to explain why the worktree is
61locked.
93a36493 62
df0b6cfb
NTND
63COMMANDS
64--------
c4738aed 65add <path> [<commit-ish>]::
fc56361f 66
c57bf8ce
DS
67Create a worktree at `<path>` and checkout `<commit-ish>` into it. The new worktree
68is linked to the current repository, sharing everything except per-worktree
69files such as `HEAD`, `index`, etc. As a convenience, `<commit-ish>` may
70be a bare "`-`", which is synonymous with `@{-1}`.
1eb07d82 71+
e79e313c 72If `<commit-ish>` is a branch name (call it `<branch>`) and is not found,
4e853331
TG
73and neither `-b` nor `-B` nor `--detach` are used, but there does
74exist a tracking branch in exactly one remote (call it `<remote>`)
661a5a38 75with a matching name, treat as equivalent to:
d023df1e 76+
4e853331
TG
77------------
78$ git worktree add --track -b <branch> <path> <remote>/<branch>
79------------
80+
8d7b558b
ÆAB
81If the branch exists in multiple remotes and one of them is named by
82the `checkout.defaultRemote` configuration variable, we'll use that
83one for the purposes of disambiguation, even if the `<branch>` isn't
84unique across all remotes. Set it to
85e.g. `checkout.defaultRemote=origin` to always checkout remote
86branches from there if `<branch>` is ambiguous but exists on the
e79e313c 87`origin` remote. See also `checkout.defaultRemote` in
8d7b558b
ÆAB
88linkgit:git-config[1].
89+
c4738aed 90If `<commit-ish>` is omitted and neither `-b` nor `-B` nor `--detach` used,
59970144
DS
91then, as a convenience, the new worktree is associated with a branch (call
92it `<branch>`) named after `$(basename <path>)`. If `<branch>` doesn't
93exist, a new branch based on `HEAD` is automatically created as if
94`-b <branch>` was given. If `<branch>` does exist, it will be checked out
95in the new worktree, if it's not checked out anywhere else, otherwise the
96command will refuse to create the worktree (unless `--force` is used).
fc56361f 97
bb9c03b8
MR
98list::
99
59970144
DS
100List details of each worktree. The main worktree is listed first,
101followed by each of the linked worktrees. The output details include
102whether the worktree is bare, the revision currently checked out, the
9b19a58f 103branch currently checked out (or "detached HEAD" if none), "locked" if
59970144
DS
104the worktree is locked, "prunable" if the worktree can be pruned by the
105`prune` command.
bb9c03b8 106
58142c09
NTND
107lock::
108
59970144
DS
109If a worktree is on a portable device or network share which is not always
110mounted, lock it to prevent its administrative files from being pruned
111automatically. This also prevents it from being moved or deleted.
112Optionally, specify a reason for the lock with `--reason`.
58142c09 113
9f792bb4
NTND
114move::
115
59970144
DS
116Move a worktree to a new location. Note that the main worktree or linked
117worktrees containing submodules cannot be moved with this command. (The
118`git worktree repair` command, however, can reestablish the connection
119with linked worktrees if you move the main worktree manually.)
9f792bb4 120
7b722d90
NTND
121prune::
122
59970144 123Prune worktree information in `$GIT_DIR/worktrees`.
7b722d90 124
cc73385c
NTND
125remove::
126
59970144
DS
127Remove a worktree. Only clean worktrees (no untracked files and no
128modification in tracked files) can be removed. Unclean worktrees or ones
129with submodules can be removed with `--force`. The main worktree cannot be
130removed.
cc73385c 131
b214ab5a 132repair [<path>...]::
e8e1ff24 133
59970144
DS
134Repair worktree administrative files, if possible, if they have become
135corrupted or outdated due to external factors.
bdd1f3e4 136+
59970144
DS
137For instance, if the main worktree (or bare repository) is moved, linked
138worktrees will be unable to locate it. Running `repair` in the main
139worktree will reestablish the connection from linked worktrees back to the
140main worktree.
b214ab5a 141+
59970144
DS
142Similarly, if the working tree for a linked worktree is moved without
143using `git worktree move`, the main worktree (or bare repository) will be
144unable to locate it. Running `repair` within the recently-moved worktree
145will reestablish the connection. If multiple linked worktrees are moved,
146running `repair` from any worktree with each tree's new `<path>` as an
147argument, will reestablish the connection to all the specified paths.
cf76baea 148+
59970144
DS
149If both the main worktree and linked worktrees have been moved manually,
150then running `repair` in the main worktree and specifying the new `<path>`
151of each linked worktree will reestablish all connections in both
152directions.
e8e1ff24 153
6d308627
NTND
154unlock::
155
59970144 156Unlock a worktree, allowing it to be pruned, moved or deleted.
6d308627 157
df0b6cfb
NTND
158OPTIONS
159-------
160
f4325444
ES
161-f::
162--force::
6036be14 163 By default, `add` refuses to create a new worktree when
cc73385c 164 `<commit-ish>` is a branch name and is already checked out by
6036be14
DS
165 another worktree, or if `<path>` is already assigned to some
166 worktree but is missing (for instance, if `<path>` was deleted
e19831c9 167 manually). This option overrides these safeguards. To add a missing but
6036be14 168 locked worktree path, specify `--force` twice.
e19831c9 169+
6036be14
DS
170`move` refuses to move a locked worktree unless `--force` is specified
171twice. If the destination is already assigned to some other worktree but is
810382ed 172missing (for instance, if `<new-path>` was deleted manually), then `--force`
e79e313c 173allows the move to proceed; use `--force` twice if the destination is locked.
68a6b3a1 174+
6036be14
DS
175`remove` refuses to remove an unclean worktree unless `--force` is used.
176To remove a locked worktree, specify `--force` twice.
f4325444 177
cbdf60fa
ES
178-b <new-branch>::
179-B <new-branch>::
180 With `add`, create a new branch named `<new-branch>` starting at
6036be14 181 `<commit-ish>`, and check out `<new-branch>` into the new worktree.
e79e313c 182 If `<commit-ish>` is omitted, it defaults to `HEAD`.
cbdf60fa
ES
183 By default, `-b` refuses to create a new branch if it already
184 exists. `-B` overrides this safeguard, resetting `<new-branch>` to
c4738aed 185 `<commit-ish>`.
cbdf60fa 186
c670aa47 187-d::
39ecb274 188--detach::
6036be14 189 With `add`, detach `HEAD` in the new worktree. See "DETACHED HEAD"
bc483285 190 in linkgit:git-checkout[1].
39ecb274 191
ef2a0ac9 192--[no-]checkout::
c4738aed 193 By default, `add` checks out `<commit-ish>`, however, `--no-checkout` can
ef2a0ac9
RZ
194 be used to suppress checkout in order to make customizations,
195 such as configuring sparse-checkout. See "Sparse checkout"
196 in linkgit:git-read-tree[1].
197
71d6682d
TG
198--[no-]guess-remote::
199 With `worktree add <path>`, without `<commit-ish>`, instead
e79e313c 200 of creating a new branch from `HEAD`, if there exists a tracking
50fdf7b1 201 branch in exactly one remote matching the basename of `<path>`,
71d6682d
TG
202 base the new branch on the remote-tracking branch, and mark
203 the remote-tracking branch as "upstream" from the new branch.
e92445a7
TG
204+
205This can also be set up as the default behaviour by using the
206`worktree.guessRemote` config option.
71d6682d 207
e284e892
TG
208--[no-]track::
209 When creating a new branch, if `<commit-ish>` is a branch,
210 mark it as "upstream" from the new branch. This is the
211 default if `<commit-ish>` is a remote-tracking branch. See
e79e313c 212 `--track` in linkgit:git-branch[1] for details.
e284e892 213
507e6e9e 214--lock::
6036be14 215 Keep the worktree locked after creation. This is the
507e6e9e 216 equivalent of `git worktree lock` after `git worktree add`,
ff1ce500 217 but without a race condition.
507e6e9e 218
df0b6cfb
NTND
219-n::
220--dry-run::
4f09825e 221 With `prune`, do not remove anything; just report what it would
df0b6cfb
NTND
222 remove.
223
bb9c03b8
MR
224--porcelain::
225 With `list`, output in an easy-to-parse format for scripts.
226 This format will remain stable across Git versions and regardless of user
d97eb302
PW
227 configuration. It is recommended to combine this with `-z`.
228 See below for details.
229
230-z::
231 Terminate each line with a NUL rather than a newline when
232 `--porcelain` is specified with `list`. This makes it possible
233 to parse the output when a worktree path contains a newline
234 character.
bb9c03b8 235
371979c2
EP
236-q::
237--quiet::
e79e313c 238 With `add`, suppress feedback messages.
371979c2 239
df0b6cfb
NTND
240-v::
241--verbose::
4f09825e 242 With `prune`, report all removals.
076b444a
RS
243+
244With `list`, output additional information about worktrees (see below).
df0b6cfb
NTND
245
246--expire <time>::
6036be14 247 With `prune`, only expire unused worktrees older than `<time>`.
9b19a58f 248+
6036be14
DS
249With `list`, annotate missing worktrees as prunable if they are older than
250`<time>`.
df0b6cfb 251
58142c09 252--reason <string>::
6036be14
DS
253 With `lock` or with `add --lock`, an explanation why the worktree
254 is locked.
58142c09
NTND
255
256<worktree>::
6036be14 257 Worktrees can be identified by path, either relative or absolute.
080739ba 258+
6036be14
DS
259If the last path components in the worktree's path is unique among
260worktrees, it can be used to identify a worktree. For example if you only
261have two worktrees, at `/abc/def/ghi` and `/abc/def/ggg`, then `ghi` or
262`def/ghi` is enough to point to the former worktree.
58142c09 263
8aff1a9c
NTND
264REFS
265----
a777d4c7
DS
266When using multiple worktrees, some refs are shared between all worktrees,
267but others are specific to an individual worktree. One example is `HEAD`,
268which is different for each worktree. This section is about the sharing
269rules and how to access refs of one worktree from another.
270
271In general, all pseudo refs are per-worktree and all refs starting with
272`refs/` are shared. Pseudo refs are ones like `HEAD` which are directly
273under `$GIT_DIR` instead of inside `$GIT_DIR/refs`. There are exceptions,
274however: refs inside `refs/bisect` and `refs/worktree` are not shared.
275
276Refs that are per-worktree can still be accessed from another worktree via
277two special paths, `main-worktree` and `worktrees`. The former gives
278access to per-worktree refs of the main worktree, while the latter to all
279linked worktrees.
3a3b9d8c 280
e79e313c 281For example, `main-worktree/HEAD` or `main-worktree/refs/bisect/good`
a777d4c7 282resolve to the same value as the main worktree's `HEAD` and
e79e313c
ES
283`refs/bisect/good` respectively. Similarly, `worktrees/foo/HEAD` or
284`worktrees/bar/refs/bisect/bad` are the same as
285`$GIT_COMMON_DIR/worktrees/foo/HEAD` and
286`$GIT_COMMON_DIR/worktrees/bar/refs/bisect/bad`.
3a3b9d8c 287
e79e313c 288To access refs, it's best not to look inside `$GIT_DIR` directly. Instead
14f74d59 289use commands such as linkgit:git-rev-parse[1] or linkgit:git-update-ref[1]
8aff1a9c
NTND
290which will handle refs correctly.
291
58b284a2
NTND
292CONFIGURATION FILE
293------------------
7b215826
DS
294By default, the repository `config` file is shared across all worktrees.
295If the config variables `core.bare` or `core.worktree` are present in the
296common config file and `extensions.worktreeConfig` is disabled, then they
297will be applied to the main worktree only.
58b284a2 298
7b215826
DS
299In order to have worktree-specific configuration, you can turn on the
300`worktreeConfig` extension, e.g.:
58b284a2
NTND
301
302------------
303$ git config extensions.worktreeConfig true
304------------
305
306In this mode, specific configuration stays in the path pointed by `git
307rev-parse --git-path config.worktree`. You can add or update
308configuration in this file with `git config --worktree`. Older Git
309versions will refuse to access repositories with this extension.
310
311Note that in this file, the exception for `core.bare` and `core.worktree`
ff1ce500 312is gone. If they exist in `$GIT_DIR/config`, you must move
7b215826
DS
313them to the `config.worktree` of the main worktree. You may also take this
314opportunity to review and move other configuration that you do not want to
315share to all worktrees:
58b284a2 316
5c11c0d5
DS
317 - `core.worktree` should never be shared.
318
319 - `core.bare` should not be shared if the value is `core.bare=true`.
58b284a2 320
7b215826
DS
321 - `core.sparseCheckout` should not be shared, unless you are sure you
322 always use sparse checkout for all worktrees.
58b284a2 323
5c11c0d5
DS
324See the documentation of `extensions.worktreeConfig` in
325linkgit:git-config[1] for more details.
326
af189b4c
ES
327DETAILS
328-------
f13a146c 329Each linked worktree has a private sub-directory in the repository's
e79e313c 330`$GIT_DIR/worktrees` directory. The private sub-directory's name is usually
f13a146c 331the base name of the linked worktree's path, possibly appended with a
af189b4c 332number to make it unique. For example, when `$GIT_DIR=/path/main/.git` the
4d5a3c58 333command `git worktree add /path/other/test-next next` creates the linked
f13a146c 334worktree in `/path/other/test-next` and also creates a
af189b4c
ES
335`$GIT_DIR/worktrees/test-next` directory (or `$GIT_DIR/worktrees/test-next1`
336if `test-next` is already taken).
337
f13a146c 338Within a linked worktree, `$GIT_DIR` is set to point to this private
af189b4c 339directory (e.g. `/path/main/.git/worktrees/test-next` in the example) and
f13a146c 340`$GIT_COMMON_DIR` is set to point back to the main worktree's `$GIT_DIR`
af189b4c 341(e.g. `/path/main/.git`). These settings are made in a `.git` file located at
f13a146c 342the top directory of the linked worktree.
af189b4c
ES
343
344Path resolution via `git rev-parse --git-path` uses either
e79e313c 345`$GIT_DIR` or `$GIT_COMMON_DIR` depending on the path. For example, in the
f13a146c 346linked worktree `git rev-parse --git-path HEAD` returns
af189b4c
ES
347`/path/main/.git/worktrees/test-next/HEAD` (not
348`/path/other/test-next/.git/HEAD` or `/path/main/.git/HEAD`) while `git
349rev-parse --git-path refs/heads/master` uses
e79e313c 350`$GIT_COMMON_DIR` and returns `/path/main/.git/refs/heads/master`,
f13a146c 351since refs are shared across all worktrees, except `refs/bisect` and
e79e313c 352`refs/worktree`.
af189b4c
ES
353
354See linkgit:gitrepository-layout[5] for more information. The rule of
355thumb is do not make any assumption about whether a path belongs to
e79e313c
ES
356`$GIT_DIR` or `$GIT_COMMON_DIR` when you need to directly access something
357inside `$GIT_DIR`. Use `git rev-parse --git-path` to get the final path.
af189b4c 358
f13a146c
DS
359If you manually move a linked worktree, you need to update the `gitdir` file
360in the entry's directory. For example, if a linked worktree is moved
618244e1
NTND
361to `/newpath/test-next` and its `.git` file points to
362`/path/main/.git/worktrees/test-next`, then update
363`/path/main/.git/worktrees/test-next/gitdir` to reference `/newpath/test-next`
b214ab5a
ES
364instead. Better yet, run `git worktree repair` to reestablish the connection
365automatically.
618244e1 366
e79e313c 367To prevent a `$GIT_DIR/worktrees` entry from being pruned (which
a8ba5dd7 368can be useful in some situations, such as when the
f13a146c 369entry's worktree is stored on a portable device), use the
58142c09 370`git worktree lock` command, which adds a file named
e79e313c 371`locked` to the entry's directory. The file contains the reason in
f13a146c 372plain text. For example, if a linked worktree's `.git` file points
a8ba5dd7
ES
373to `/path/main/.git/worktrees/test-next` then a file named
374`/path/main/.git/worktrees/test-next/locked` will prevent the
375`test-next` entry from being pruned. See
376linkgit:gitrepository-layout[5] for details.
377
e79e313c 378When `extensions.worktreeConfig` is enabled, the config file
58b284a2 379`.git/worktrees/<id>/config.worktree` is read after `.git/config` is.
a8ba5dd7 380
bb9c03b8
MR
381LIST OUTPUT FORMAT
382------------------
e79e313c 383The `worktree list` command has two output formats. The default format shows the
bb9c03b8
MR
384details on a single line with columns. For example:
385
386------------
22d11a6e 387$ git worktree list
bb9c03b8
MR
388/path/to/bare-source (bare)
389/path/to/linked-worktree abcd1234 [master]
390/path/to/other-linked-worktree 1234abc (detached HEAD)
391------------
392
07d85380 393The command also shows annotations for each worktree, according to its state.
9b19a58f
RS
394These annotations are:
395
07d85380
DS
396 * `locked`, if the worktree is locked.
397 * `prunable`, if the worktree can be pruned via `git worktree prune`.
9b19a58f
RS
398
399------------
400$ git worktree list
401/path/to/linked-worktree abcd1234 [master]
98c7656a 402/path/to/locked-worktree acbd5678 (brancha) locked
9b19a58f
RS
403/path/to/prunable-worktree 5678abc (detached HEAD) prunable
404------------
405
076b444a
RS
406For these annotations, a reason might also be available and this can be
407seen using the verbose mode. The annotation is then moved to the next line
408indented followed by the additional information.
409
410------------
411$ git worktree list --verbose
412/path/to/linked-worktree abcd1234 [master]
413/path/to/locked-worktree-no-reason abcd5678 (detached HEAD) locked
414/path/to/locked-worktree-with-reason 1234abcd (brancha)
07d85380 415 locked: worktree path is mounted on a portable device
076b444a
RS
416/path/to/prunable-worktree 5678abc1 (detached HEAD)
417 prunable: gitdir file points to non-existent location
418------------
419
420Note that the annotation is moved to the next line if the additional
421information is available, otherwise it stays on the same line as the
07d85380 422worktree itself.
076b444a 423
bb9c03b8
MR
424Porcelain Format
425~~~~~~~~~~~~~~~~
d97eb302
PW
426The porcelain format has a line per attribute. If `-z` is given then the lines
427are terminated with NUL rather than a newline. Attributes are listed with a
e79e313c 428label and value separated by a single space. Boolean attributes (like `bare`
ff1ce500 429and `detached`) are listed as a label only, and are present only
862c723d
RS
430if the value is true. Some attributes (like `locked`) can be listed as a label
431only or with a value depending upon whether a reason is available. The first
07d85380 432attribute of a worktree is always `worktree`, an empty line indicates the
862c723d 433end of the record. For example:
bb9c03b8
MR
434
435------------
22d11a6e 436$ git worktree list --porcelain
bb9c03b8
MR
437worktree /path/to/bare-source
438bare
439
440worktree /path/to/linked-worktree
441HEAD abcd1234abcd1234abcd1234abcd1234abcd1234
442branch refs/heads/master
443
444worktree /path/to/other-linked-worktree
445HEAD 1234abc1234abc1234abc1234abc1234abc1234a
446detached
447
862c723d
RS
448worktree /path/to/linked-worktree-locked-no-reason
449HEAD 5678abc5678abc5678abc5678abc5678abc5678c
450branch refs/heads/locked-no-reason
451locked
452
453worktree /path/to/linked-worktree-locked-with-reason
454HEAD 3456def3456def3456def3456def3456def3456b
455branch refs/heads/locked-with-reason
456locked reason why is locked
457
9b19a58f
RS
458worktree /path/to/linked-worktree-prunable
459HEAD 1233def1234def1234def1234def1234def1234b
460detached
461prunable gitdir file points to non-existent location
462
862c723d
RS
463------------
464
d97eb302 465Unless `-z` is used any "unusual" characters in the lock reason such as newlines
862c723d
RS
466are escaped and the entire reason is quoted as explained for the
467configuration variable `core.quotePath` (see linkgit:git-config[1]).
468For Example:
469
470------------
471$ git worktree list --porcelain
472...
473locked "reason\nwhy is locked"
474...
bb9c03b8
MR
475------------
476
96454597
ES
477EXAMPLES
478--------
479You are in the middle of a refactoring session and your boss comes in and
480demands that you fix something immediately. You might typically use
481linkgit:git-stash[1] to store your changes away temporarily, however, your
bc483285
MH
482working tree is in such a state of disarray (with new, moved, and removed
483files, and other bits and pieces strewn around) that you don't want to risk
07d85380 484disturbing any of it. Instead, you create a temporary linked worktree to
96454597
ES
485make the emergency fix, remove it when done, and then resume your earlier
486refactoring session.
487
488------------
cbdf60fa 489$ git worktree add -b emergency-fix ../temp master
96454597
ES
490$ pushd ../temp
491# ... hack hack hack ...
492$ git commit -a -m 'emergency fix for boss'
493$ popd
3f0b42bd 494$ git worktree remove ../temp
96454597
ES
495------------
496
6d3824cf
ES
497BUGS
498----
18b22dbe
JH
499Multiple checkout in general is still experimental, and the support
500for submodules is incomplete. It is NOT recommended to make multiple
501checkouts of a superproject.
6d3824cf 502
df0b6cfb
NTND
503GIT
504---
505Part of the linkgit:git[1] suite