GIT(1) GIT(1)
NAME
git, git/conf, git/query, git/walk, git/clone, git/branch,
git/commit, git/diff, git/init, git/log, git/merge,
git/push, git/pull, git/rm, git/serve, git/hist - manage git
repositories
SYNOPSIS
git/add [ -r ] path ...
git/branch [ -armns ] [ -b base ] newbranch
git/clone [ remote [ local ] ]
git/commit [ -re ] [ -m msg ] [ file ... ]
git/compat
git/conf [ -r ] [ -f file ] keys ...
git/diff [ -c branch ] [ -su ] [ file ... ]
git/export [ commits ... ]
git/import [ -n ] [ commits ... ]
git/init [ -b ] [ -u upstream ] [ dir ]
git/log [ -c commit | -e expr ] [ -n count ] [ -s ] [ files
... ]
git/merge theirs
git/rebase [ -s src ] [ -n ] onto
git/pull [ -fq ] [ -u upstream ]
git/push [ -af ] [ -u upstream ] [ -b branch ] [ -r branch ]
git/query [ -pcr ] query
git/revert [ -c commit ] file ...
git/rm path ...
git/serve [ -w ] [ -r path ]
git/walk [ -qc ] [ -b branch ] [ -f filters ] [ -r rel ] [
file ... ]
git/hist [ -n count ] files...
Page 1 Plan 9 (printed 11/6/25)
GIT(1) GIT(1)
DESCRIPTION
Git is a distributed version control system. This means
that each repository contains a full copy of the history.
This history is then synced between computers as needed.
These programs provide tools to manage and interoperate with
repositories hosted in git.
CONCEPTS
Git stores snapshots of the working directory. Files can
either be in a tracked or untracked state. Each commit
takes the current version of all tracked files and adds them
to a new commit.
This history is stored in the .git directory. This suite of
git tools provides a file interface to the .git directory
mounted on $repo/.git/fs. Modifications to the repository
are done directly to the .git directory, and are reflected
in the file system interface. This allows for easy script-
ing, without excessive complexity in the file API.
COMMANDS
Git/init is used to create a new git repository, with no
code or commits. The repository is created in the current
directory by default. Passing a directory name will cause
the repository to be created there instead. Passing the -b
option will cause the repository to be initialized as a bare
repository. Passing the -u upstream option will cause the
upstream to be configured to upstream.
Git/clone will take an existing repository, served over
either the git:// or ssh:// protocols. The first argument
is the repository to clone. The second argument, option-
ally, specifies the location to clone into. If not speci-
fied, the repository will be cloned into the last path com-
ponent of the clone source, with the .git stripped off if
present.
Git/push is used to push the current changes to a remote
repository. When no arguments are provided, the remote
repository is taken from the origin configured in
.git/config, and only the changes on the current branch are
pushed. When passed the -a option, all branches are pushed.
When passed the -u upstream option, the changes are pushed
to upstream instead of the configured origin. When given
the -r option, the branch is deleted from origin, instead of
updated.
Git/revert restores the named files from HEAD. When passed
the -c flag, restores files from the named commit.
Git/pull behaves in a similar manner to git/push, however it
Page 2 Plan 9 (printed 11/6/25)
GIT(1) GIT(1)
gets changes from the upstream repository. After fetching,
it checks out the changes into the working directory. When
passed the -f option, the update of the working copy is sup-
pressed. When passed the -q option, the listing of changes
is silenced. When passed the -u upstream option, the
changes are pulled from upstream instead of the configured
origin.
Git/serve serves repositories using the git:// protocol over
stdin. By default, it serves them read-only. The -w flag,
it allows pushing into repositories. The -r path flag
serves repositories relative to path.
Git/fs serves a file system on $repo/.git/fs. For full doc-
umentation, see gitfs(4)
Git/add adds a file to the list of tracked files. When
passed the -r flag, the file is removed from the list of
tracked files. The copy of the file in the repository is
left untouched.
Git/rm is an alias for git/add -r.
Git/commit creates a new commit consisting of all changes to
the specified files. By default, $editor is opened to pre-
pare the commit message. If $editor is undefined hold(1) is
used. The -m flag supplies the commit message directly.
The -r flag revises the contents of the previous commit,
reusing the message. The -e flag opens an editor to final-
ize the commit message, regardless of whether or not it was
specified explicitly or reused. To amend a commit message,
-r can be used in conjunction with -m or -e.
Git/branch is used to list or switch branches. When invoked
with no arguments, it lists the current branch. To list all
branches, pass the -a option. To switch between branches,
pass a branch name. When passed the -n option, the branch
will be created, overwriting existing branch. When passed
the -b base option, the branch created is based off of base
instead of HEAD. When passed the -s option, the branch is
created but the files are not checked out. When passed the
-r option, the branch is removed.
When switching branches, git/branch will refuse to clobber
modifications. Passing the -m option will cause it to
attempt to merge the changes between the branches.
Git/log shows a history of the current branch. When passed
a list of files, only commits affecting those files are
shown. The -c commit option logs starting from the provided
commit, instead of HEAD. The -s option shows a summary of
the commit, instead of the full message. The -n count
Page 3 Plan 9 (printed 11/6/25)
GIT(1) GIT(1)
option stops printing messages after count messages. The -e
expr option shows commits matching the query expression pro-
vided. The expression is in the syntax of git/query.
Git/diff shows the differences between the currently checked
out code and the HEAD commit. When passed the -c base
option, the diff is computed against base instead of HEAD.
When passed the -s option, only the file statuses are
printed. When passed the -u option, untracked files are
listed. The -u option implies -s.
Git/export exports a list of commits in a format that
git/import can apply. If multiple patches are generated,
they are separated with a ⑨ character.
Git/import imports a commit with message, author, and date
information. When passed the -n option, it applies the con-
tents of the commit without committing to the branch.
Git/import can accept multiple patches on stdin. When mul-
tiple patches are supplied, each patch must be separated
with a ⑨ character.
Git/merge takes two branches and merges them filewise using
merge3 (see diff(1)). The next commit made will be a merge
commit.
Git/rebase prints the commands to move commits from one
branch onto another, using git/export and git/import. The -n
option is passed directly to git/import.
Git/conf is a tool for querying the git configuration. The
configuration key is provided as a dotted string. Spaces
are accepted. For example, to find the URL of the origin
repository, one might pass 'remote "origin".url'. When
given the -r option, the root of the current repository is
printed.
Git/query takes an expression describing a commit, or set of
commits, and resolves it to a list of commits. The -r
option reverses the order of the commit list. With the -p
option, instead of printing the commit hashes, the full path
to their git/fs path is printed. With the -c option, the
query must resolve to two commits. The blobs that have
changed in the commits are printed.
Git/walk shows the status of files in the repository. It
prints a list of paths prefixed with the status character.
It exits with a non-empty status if the repository is not
clean. The -c option suppresses the status, so only the
paths are printed. The -q option suppresses all output.
The -r option causes paths to be printed relative to the
supplied directory rel. The -f option filters files by
Page 4 Plan 9 (printed 11/6/25)
GIT(1) GIT(1)
status, and only matching items are printed. By default,
the filters are TRMA.
The status characters are as follows:
T Tracked, not modified since last commit.
M Modified since last commit.
R This file will be gone in the next commit.
A This file will be present in the next commit.
U This file is not tracked by git.
Git/compat spawns an rc subshell with a compatibility stub
in $path. This compatibility stub provides enough of the
Unix git commands to run tools like go get but not much
more.
Git/hist provides the diffs of specific files in reverse
chronological order. The -n flag may be used to limit the
output to the last count commits.
REF SYNTAX
Refs are specified with a simple query syntax. A bare hash
always evaluates to itself. Ref names are resolved to their
hashes. The a ^ suffix operator finds the parent of a com-
mit. The a b @ suffix operator finds the common ancestor of
the previous two commits. The a .. b or a : b operator
finds all commits between a and b. Between is defined as
the set of all commits which are reachable from b but not
reachable from a.
PROTOCOLS
Git supports URL schemes of the format
transport://dial/repo. The transport portion specifies the
protocol to use. If the transport portion is omitted, then
the transport used is ssh. The dial portion is either a
Plan 9 dial string, or a conventional host:port pair. For
the ssh protocol, it may also include a user@ prefix. repo
portion is the path of the repository on the server.
The supported transports are ssh://, git://, hjgit://,
gits://, http://, and https://. Two of these are specific
to git9: gits:// and hjgit://. Both are the git:// proto-
col, tunneled over TLS. Hjgit:// authenticates with the
server using Plan 9 authentication, using tlsclient -a. Any
of these protocol names may be prefixed with git+, for
copy-paste compatibility with Unix git.
EXAMPLES
Page 5 Plan 9 (printed 11/6/25)
GIT(1) GIT(1)
In order to create a new repository, run git/init:
git/init myrepo
To clone an existing repository from a git server, run:
git/clone https://github.com/Harvey-OS/harvey
cd harvey
# edit files
git/commit foo.c
git/push
To set a user and email for commits, run:
% mkdir $home/lib/git
% >$home/lib/git/config echo '
[user]
name = Ori Bernstein
email = ori@eigenstate.org
'
FILES
$repo/.git
The full git repository.
$repo/.git/config
The configuration file for a repository.
$home/lib/git/config
The user-wide configuration for git. The contents of
this file are used as fallbacks for the per-repository
config.
/sys/lib/git/config
The system-wide configuration for git. The contents of
this file are used as fallbacks for the per-user con-
fig.
SEE ALSO
diff(1), patch(1), replica(1), gitfs(4)
BUGS
Repositories with submodules are effectively read-only.
There are some missing commands, features, and tools.
Git/compat only works within a git repository.
Sharing git repositories between Plan 9 and Linux leads to
indexes going out of sync. To work around this, reset the
state of the tracked files on Plan 9 with git/add:
Page 6 Plan 9 (printed 11/6/25)
GIT(1) GIT(1)
git/add `{@{git/fs && git/walk -c}}
And on Linux, with:
git checkout HEAD -- $(find . -type f)
Page 7 Plan 9 (printed 11/6/25)