Git Worktree Operations

From NovaOrdis Knowledge Base
Revision as of 01:10, 16 July 2020 by Ovidiu (talk | contribs)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search

Internal

Typical Working Tree Workflow

Assuming that a developer is in the middle of a major refactoring on a branch and it is impractical to commit a stable checkpoint, or even stash, switching to a different branch while leaving the current branch in the state it is in involves:

git worktree add ../playground-temp /existing/task/branch/I/need/to/work/on

It is also possible to create a new branch on-the-fly. The branch is based on the branch specified in command line:

git worktree add -b temp-emergency-branch  ../playground-temp /existing/task/branch/I/need/to/work/on

To interact with the newly checked out branch in the new working tree, simply go to the working tree directory:

cd ../playground-temp

After operating changes, commit as usual, and possibly remove the working tree:

git commit -m "some work"
cd ../playground
git worktree remove ../playground-temp

Work Tree Info

git branch shows the branches active in different work tree in different colors: green in the current working tree, blue in other trees.

List Work Trees

git worktree list

Create a Working Tree

git worktree add <absolute-or-relative-local-path> <branch|commit|tag>
cd playground
git worktree add ../playground-kubernetes-experiments /task/kubernetes-experiments

Note that <absolute-or-relative-local-path> must be outside of the main repository directory.

A remote branch for which there is no local tracking branch can be initialized in a work tree as follows. Note that the remote tracked branch is <remote>/<branch-name>.

git worktree add --track -b <branch-name> <absolute-or-relative-local-path> <remote>/<branch-name>

Remove a Working Tree

Linked working trees can be removed with:

git worktree remove <path>

The full path can be used, or if the last segment of the path uniquely identifies the worktree, only that last segment can be used:

git worktree remove ../playground-wk-1
git worktree remove playground-wk-1

The main working tree cannot be removed.

It is possible to remove the work tree local filesystem directory without calling git worktree remove. The associated administrative files will be eventually removed automatically. Alternatively,

git worktree prune

can be execute to clean up state.

If a branch was checked out in the working tree that was removed, the branch remains in the local repository, it is just not checked out.