Go to file
Jeff King da2926c8f5 revision: handle argv movement in parse_revision_opt()
The argument parser used by setup_revisions() modifies the argv array
that is passed to it, consolidating non-options and unknown options at
the start of the array. This led to problems with memory leaks when argv
pointed to allocated strings. We addressed that in cd43948798 (revision:
manage memory ownership of argv in setup_revisions(), 2025-09-19). Now
instead of copying strings to the earlier part of argv, we actually move
them, setting the original location to NULL (so that we know we have
exactly one pointer to the string).

This works fine for setup_revisions() itself, but the underlying
handle_revision_opt() has another entry point: parse_revision_opt().
This lets a parse-options user parse a single revision option, but the
movement introduced by cd43948798 confuses its error code path. If we
see an unknown option, then handle_revision_opt() will move it out of
the way (to the "unknown options" section) and return an error. But
parse_revision_opt() then tries to access the original argv location,
which has now been set to NULL, and you get:

  $ git shortlog -n --no-such-option
  error: unknown option `(null)'

Whereas prior to cd43948798, it would have been a leftover copy of the
pointer (that may or may not eventually get written over, but was valid
for this immediate message). And you get what you'd expect:

  $ git shortlog -n --no-such-option
  error: unknown option `--no-such-option'

Making things even more confusing, it only happens if there's another
option before the unknown one! That's because with just:

  $ git shortlog --no-such-option

we "consolidate" to the exact same spot, and no movement occurs at all.

Note that we use shortlog in these examples because it is one of only
two commands that use the parse_revision_opt() interface (the other is
blame).

There are a few options for fixing this. One is that we can observe that
the "move" semantics introduced by cd43948798 only matter when the argv
strings are allocated on the heap, in which case the caller passes in
the free_removed_argv_elements flag to tell us. But we never use that
flag with parse_revision_opt(). So we could do something like this:

  diff --git a/revision.c b/revision.c
  index ee1df92d1d..7b858d54c1 100644
  --- a/revision.c
  +++ b/revision.c
  @@ -2340,7 +2340,8 @@ static void overwrite_argv(int *argc, const char **argv,
   	if (*value != argv[*argc]) {
   		mark_argv_for_free(opt, revs, argv[*argc]);
   		argv[*argc] = *value;
  -		*value = NULL;
  +		if (opt && opt->free_removed_argv_elements)
  +			*value = NULL;
   	}
   	(*argc)++;
   }

to restore the pre-cd43948798 semantics when heap-allocated strings are
not in use. We'd just keep the extra pointer in the original location,
but nobody cares because they're not going to free anything anyway.
That's enough to fix this case, and could fix any other theoretical
cases we haven't noticed. The downside is that it's an accident waiting
to happen if we ever do teach parse_revision_opt() to handle allocated
argv strings.

But are there other theoretical cases? I don't think so. The code paths
touched by cd43948798 are either in setup_revisions() itself (which also
learned how to handle this movement) or in handle_revision_opt(), the
low-level static helper. It has only two callers: setup_revisions()
itself, and parse_revision_opt() in which we see the current breakage.
So fixing parse_revision_opt() should cover all of our bases, and keep
the code ready for a potential future change to handle allocated
strings.

The fix is just to tell parse_revision_opt() to look for the unknown
option in the consolidated destination rather than the original
location.  We might write to that consolidated location for other
reasons (like moving pseudo-revision options like "--all"), but there is
only one code path that returns the 0 for an unknown option, and it
always moves the option before doing so. So the "end" of that
consolidated area will always have our unknown option.

This patch implements that solution and demonstrates the breakage and
fix using shortlog.

Reported-by: Kristoffer Haugsbakk <kristofferhaugsbakk@fastmail.com>
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2026-09-25 15:15:38 -07:00
.github Merge branch 'js/ci-github-actions-update' 2025-11-06 14:52:57 -08:00
Documentation Git 2.52 2025-11-17 07:35:33 -08:00
bin-wrappers
…
block-sha1
…
builtin Merge branch 'tc/last-modified-active-paths-optimization' 2025-11-12 11:45:24 -08:00
ci Merge branch 'jc/ci-use-arm64-p4-on-macos' 2025-11-17 07:00:12 -08:00
compat mingw: order `#include`s alphabetically 2025-10-09 13:21:28 -07:00
compiler-tricks
…
contrib Merge branch 'dk/meson-html-dir' 2025-11-12 08:17:31 -08:00
ewah
…
git-gui Merge branch 'master' of https://github.com/j6t/git-gui 2025-09-10 14:28:23 -07:00
gitk-git Merge branch 'master' of https://github.com/j6t/gitk 2025-10-05 13:32:47 -07:00
gitweb
…
mergetools doc: update references to renamed AsciiDoc files 2025-06-06 15:05:47 -07:00
negotiator
…
oss-fuzz commit-graph: refactor `parse_commit_graph()` to take a repository 2025-08-15 09:34:47 -07:00
perl contrib: better support symbolic port names in git-credential-netrc 2025-06-25 09:43:59 -07:00
po l10n: zh_CN: updated translation for 2.52 2025-11-16 17:27:10 +08:00
refs Merge branch 'pk/reflog-migrate-message-fix' 2025-11-06 14:52:57 -08:00
reftable Merge branch 'kn/reftable-consistency-checks' 2025-10-13 22:00:35 -07:00
sha1
…
sha1collisiondetection@855827c583
…
sha1dc
…
sha256
…
src rust: support for Windows 2025-10-15 08:10:17 -07:00
subprojects meson: update subproject wrappers 2025-07-11 09:56:34 -07:00
t revision: handle argv movement in parse_revision_opt() 2026-09-25 15:15:38 -07:00
templates
…
trace2 trace2: do not use strbuf_split*() 2025-08-02 22:44:58 -07:00
xdiff Merge branch 'en/xdiff-cleanup' 2025-10-14 12:56:09 -07:00
.cirrus.yml ci: update FreeBSD image to 14.3 2025-07-01 07:46:22 -07:00
.clang-format clang-format: exclude control macros from SpaceBeforeParens 2025-09-28 08:37:23 -07:00
.editorconfig
…
.gitattributes
…
.gitignore Merge branch 'ps/rust-balloon' 2025-10-08 12:17:55 -07:00
.gitlab-ci.yml Merge branch 'ps/gitlab-ci-disable-windows-monitoring' into maint-2.51 2025-10-26 19:48:19 -07:00
.gitmodules
…
.mailmap mailmap: change primary address for Jonathan Tan 2025-10-07 10:38:21 -07:00
.tsan-suppressions
…
CODE_OF_CONDUCT.md
…
COPYING
…
Cargo.toml ci: verify minimum supported Rust version 2025-10-15 08:10:17 -07:00
GIT-BUILD-OPTIONS.in
…
GIT-VERSION-FILE.in
…
GIT-VERSION-GEN Git 2.52 2025-11-17 07:35:33 -08:00
INSTALL
…
LGPL-2.1
…
Makefile Merge branch 'tb/incremental-midx-part-3.1' 2025-10-29 12:38:24 -07:00
README.md gitk: add README with usage, build, and contribution details 2025-08-28 19:51:31 +02:00
RelNotes Git 2.51.2 2025-10-26 19:48:21 -07:00
SECURITY.md
…
abspath.c
…
abspath.h
…
aclocal.m4
…
add-interactive.c Merge branch 'sj/string-list' 2025-10-14 12:56:08 -07:00
add-interactive.h add-interactive: retain colorbool values longer 2025-09-16 18:00:25 -07:00
add-patch.c add-patch: quit on EOF 2025-10-26 16:34:39 -07:00
advice.c initial branch: give hints after switching the default name 2025-09-18 11:44:47 -07:00
advice.h initial branch: give hints after switching the default name 2025-09-18 11:44:47 -07:00
alias.c
…
alias.h
…
alloc.c alloc: fix dangling pointer in alloc_state cleanup 2025-09-04 15:24:16 -07:00
alloc.h alloc: fix dangling pointer in alloc_state cleanup 2025-09-04 15:24:16 -07:00
apply.c Merge branch 'ps/object-file-wo-the-repository' 2025-08-05 11:53:55 -07:00
apply.h
…
archive-tar.c config: drop `git_config()` wrapper 2025-07-23 08:15:18 -07:00
archive-zip.c archive: flush deflate stream until Z_STREAM_END 2025-08-04 13:36:35 -07:00
archive.c config: drop `git_config_get_bool()` wrapper 2025-07-23 08:15:20 -07:00
archive.h
…
attr.c odb: rename `repo_read_object_file()` 2025-07-01 14:46:38 -07:00
attr.h
…
banned.h
…
base85.c
…
base85.h
…
bisect.c revision: add wrapper to setup_revisions() from a strvec 2025-09-22 14:27:03 -07:00
bisect.h rev-list: make "struct rev_list_info" static to the only user 2025-07-21 15:40:46 -07:00
blame.c blame: drop explicit check for commit graph 2025-09-04 16:16:21 -07:00
blame.h
…
blob.c
…
blob.h
…
bloom.c commit-graph: return commit graph from `repo_find_commit_pos_in_graph()` 2025-09-04 16:16:22 -07:00
bloom.h bloom: replace struct bloom_key * with struct bloom_keyvec 2025-07-14 10:03:03 -07:00
branch.c config: drop `git_config_get_multivar_gently()` wrapper 2025-07-23 08:15:21 -07:00
branch.h
…
builtin.h Merge branch 'tc/last-modified' 2025-09-08 14:54:35 -07:00
bundle-uri.c Merge branch 'ps/object-store' 2025-07-15 15:18:18 -07:00
bundle-uri.h
…
bundle.c Merge branch 'bc/use-sha256-by-default-in-3.0' 2025-07-21 09:14:25 -07:00
bundle.h
…
cache-tree.c odb: add transaction interface 2025-09-16 11:37:06 -07:00
cache-tree.h
…
cbtree.c
…
cbtree.h
…
chdir-notify.c
…
chdir-notify.h
…
check-builtins.sh
…
checkout.c config: drop `git_config_get_string()` wrapper 2025-07-23 08:15:19 -07:00
checkout.h
…
chunk-format.c
…
chunk-format.h
…
color.c color: return bool from want_color() 2025-09-16 18:00:25 -07:00
color.h color: return bool from want_color() 2025-09-16 18:00:25 -07:00
column.c
…
column.h
…
combine-diff.c Merge branch 'tc/last-modified-recursive-fix' 2025-09-29 11:40:35 -07:00
command-list.txt Merge branch 'tc/last-modified' 2025-09-08 14:54:35 -07:00
commit-graph.c Merge branch 'ps/commit-graph-per-object-source' 2025-10-13 22:00:35 -07:00
commit-graph.h commit-graph: return commit graph from `repo_find_commit_pos_in_graph()` 2025-09-04 16:16:22 -07:00
commit-reach.c commit-reach: avoid commit_list_insert_by_date() 2025-10-24 10:13:17 -07:00
commit-reach.h
…
commit-slab-decl.h
…
commit-slab-impl.h
…
commit-slab.h
…
commit.c Merge branch 'ps/remote-rename-fix' 2025-08-21 13:46:58 -07:00
commit.h Merge branch 'lm/add-p-context' 2025-08-04 08:10:33 -07:00
common-exit.c
…
common-init.c
…
common-init.h
…
common-main.c
…
config.c Merge branch 'dk/parseopt-optional-filename-fixes' 2025-11-06 15:17:01 -08:00
config.h Merge branch 'ps/config-wo-the-repository' 2025-08-04 08:10:33 -07:00
config.mak.dev
…
config.mak.in
…
config.mak.uname Merge branch 'bs/config-mak-freebsd' 2025-07-14 11:19:23 -07:00
configure.ac Merge branch 'rj/freebsd-sysinfo-build-fix' 2025-07-14 11:19:28 -07:00
connect.c Merge branch 'jc/string-list-split' 2025-08-21 13:46:59 -07:00
connect.h
…
connected.c packfile: introduce macro to iterate through packs 2025-10-16 14:42:39 -07:00
connected.h
…
convert.c config: drop `git_config()` wrapper 2025-07-23 08:15:18 -07:00
convert.h
…
copy.c
…
copy.h
…
credential.c
…
credential.h
…
csum-file.c
…
csum-file.h
…
ctype.c
…
daemon.c Merge branch 'ps/config-wo-the-repository' 2025-08-04 08:10:33 -07:00
date.c
…
date.h
…
decorate.c
…
decorate.h
…
delta-islands.c
…
delta-islands.h
…
delta.h
…
detect-compiler
…
diagnose.c odb: get rid of `the_repository` in `for_each()` functions 2025-07-01 14:46:36 -07:00
diagnose.h
…
diff-delta.c
…
diff-lib.c diff: teach tree-diff a max-depth parameter 2025-08-07 15:29:35 -07:00
diff-merges.c
…
diff-merges.h
…
diff-no-index.c diff --no-index: fix logic for paths ending in '/' 2025-09-25 11:35:20 -07:00
diff.c diff: simplify run_external_diff() quiet logic 2025-10-24 10:38:58 -07:00
diff.h diff: replace diff_options.dry_run flag with NULL file 2025-10-24 10:15:22 -07:00
diffcore-break.c
…
diffcore-delta.c
…
diffcore-order.c
…
diffcore-pickaxe.c
…
diffcore-rename.c
…
diffcore-rotate.c
…
diffcore.h
…
dir-iterator.c
…
dir-iterator.h
…
dir.c Merge branch 'jk/match-pathname-fix' 2025-11-03 06:49:55 -08:00
dir.h dir: add generic "walk all files" helper 2025-09-12 08:59:52 -07:00
editor.c config: drop `git_config_get_string()` wrapper 2025-07-23 08:15:19 -07:00
editor.h
…
entry.c odb: rename `repo_read_object_file()` 2025-07-01 14:46:38 -07:00
entry.h
…
environment.c Merge branch 'pw/3.0-commentchar-auto-deprecation' 2025-09-18 10:07:00 -07:00
environment.h config: warn on core.commentString=auto 2025-08-26 08:52:44 -07:00
exec-cmd.c
…
exec-cmd.h
…
fetch-negotiator.c
…
fetch-negotiator.h
…
fetch-pack.c packfile: split up responsibilities of `reprepare_packed_git()` 2025-09-24 11:53:50 -07:00
fetch-pack.h
…
fmt-merge-msg.c Merge branch 'ac/deglobal-fmt-merge-log-config' 2025-08-22 13:13:21 -07:00
fmt-merge-msg.h environment: remove the global variable 'merge_log_config' 2025-08-11 09:16:55 -07:00
for-each-ref.h Merge branch 'ja/doc-lint-sections-and-synopsis' 2025-08-25 14:22:02 -07:00
fsck.c fsck: consider gpgsig headers expected in tags 2025-10-09 17:46:14 -07:00
fsck.h Merge branch 'bc/sha1-256-interop-01' 2025-10-22 11:38:58 -07:00
fsmonitor--daemon.h
…
fsmonitor-ipc.c
…
fsmonitor-ipc.h
…
fsmonitor-ll.h
…
fsmonitor-path-utils.h
…
fsmonitor-settings.c
…
fsmonitor-settings.h
…
fsmonitor.c config: drop `git_config_get_int()` wrapper 2025-07-23 08:15:20 -07:00
fsmonitor.h
…
generate-cmdlist.sh
…
generate-configlist.sh Merge branch 'jc/sed-build-fixes' 2025-06-13 13:29:14 -07:00
generate-hooklist.sh
…
generate-perl.sh perl: also mark git-contacts executable 2025-11-06 09:57:47 -08:00
generate-python.sh
…
generate-script.sh git-gui: honor TCLTK_PATH in git-gui--askpass 2025-07-31 18:42:54 +02:00
gettext.c
…
gettext.h
…
git-archimport.perl
…
git-compat-util.h whatchanged: hint about git-log(1) and aliasing 2025-09-17 13:47:24 -07:00
git-curl-compat.h curl: add support for curl_global_trace() components 2025-08-27 09:49:43 -07:00
git-cvsexportcommit.perl
…
git-cvsimport.perl
…
git-cvsserver.perl cvsserver: remove unused escapeRefName function 2025-05-27 08:25:08 -07:00
git-difftool--helper.sh
…
git-filter-branch.sh
…
git-instaweb.sh
…
git-merge-octopus.sh
…
git-merge-one-file.sh
…
git-merge-resolve.sh
…
git-mergetool--lib.sh
…
git-mergetool.sh
…
git-p4.py
…
git-quiltimport.sh
…
git-request-pull.sh
…
git-send-email.perl Merge branch 'nb/send-email-no-dup-reply-to' 2025-09-29 11:40:33 -07:00
git-sh-i18n.sh
…
git-sh-setup.sh
…
git-submodule.sh
…
git-svn.perl
…
git-web--browse.sh
…
git-zlib.c
…
git-zlib.h
…
git.c Merge branch 'kh/you-still-use-whatchanged-fix' 2025-10-02 12:26:12 -07:00
git.rc.in
…
gpg-interface.c Merge branch 'cc/fast-import-export-i18n-cleanup' 2025-11-06 15:17:01 -08:00
gpg-interface.h gpg-interface: use left shift to define GPG_VERIFY_* 2025-10-30 07:06:58 -07:00
graph.c
…
graph.h
…
grep.c grep: don't treat grep_opt.color as a strict bool 2025-09-16 13:37:05 -07:00
grep.h color: use git_colorbool enum type to store colorbools 2025-09-16 17:59:53 -07:00
hash-lookup.c
…
hash-lookup.h
…
hash.c
…
hash.h Merge branch 'bc/use-sha256-by-default-in-3.0' 2025-07-21 09:14:25 -07:00
hashmap.c
…
hashmap.h
…
help.c help: report on whether or not Rust is enabled 2025-10-02 09:32:31 -07:00
help.h
…
hex-ll.c
…
hex-ll.h
…
hex.c
…
hex.h
…
hook.c
…
hook.h
…
http-backend.c packfile: introduce macro to iterate through packs 2025-10-16 14:42:39 -07:00
http-fetch.c config: move Git config parsing into "environment.c" 2025-07-23 08:15:22 -07:00
http-push.c Merge branch 'js/curl-off-t-fixes' into maint-2.51 2025-10-14 13:40:53 -07:00
http-walker.c odb: rename `has_object()` 2025-07-01 14:46:38 -07:00
http.c packfile: introduce macro to iterate through packs 2025-10-16 14:42:39 -07:00
http.h Merge branch 'js/curl-off-t-fixes' 2025-10-07 12:25:27 -07:00
ident.c Merge branch 'ps/reflog-migrate-fixes' into maint-2.51 2025-10-15 10:29:28 -07:00
ident.h ident: fix type of string length parameter 2025-08-06 07:36:30 -07:00
imap-send.c Merge branch 'js/curl-off-t-fixes' into maint-2.51 2025-10-14 13:40:53 -07:00
iterator.h
…
json-writer.c
…
json-writer.h
…
khash.h
…
kwset.c
…
kwset.h
…
levenshtein.c
…
levenshtein.h
…
line-log.c Merge branch 'sg/line-log-boundary-fixes' into maint-2.51 2025-10-15 10:29:30 -07:00
line-log.h
…
line-range.c
…
line-range.h
…
linear-assignment.c
…
linear-assignment.h
…
list-objects-filter-options.c config: drop `git_config_set()` wrapper 2025-07-23 08:15:21 -07:00
list-objects-filter-options.h
…
list-objects-filter.c use repo_get_oid_with_flags() 2025-09-10 14:29:49 -07:00
list-objects-filter.h
…
list-objects.c odb: rename `has_object()` 2025-07-01 14:46:38 -07:00
list-objects.h
…
list.h
…
lockfile.c
…
lockfile.h
…
log-tree.c Merge branch 'kh/format-patch-range-diff-notes' 2025-10-14 12:56:09 -07:00
log-tree.h color: use git_colorbool enum type to store colorbools 2025-09-16 17:59:53 -07:00
loose.c loose: write loose objects map via their source 2025-07-16 22:16:15 -07:00
loose.h loose: write loose objects map via their source 2025-07-16 22:16:15 -07:00
ls-refs.c config: drop `git_config()` wrapper 2025-07-23 08:15:18 -07:00
ls-refs.h
…
mailinfo.c config: move Git config parsing into "environment.c" 2025-07-23 08:15:22 -07:00
mailinfo.h
…
mailmap.c string-list: change "string_list_find_insert_index" return type to "size_t" 2025-10-06 09:11:07 -07:00
mailmap.h
…
match-trees.c odb: introduce `odb_write_object()` 2025-07-16 22:16:15 -07:00
match-trees.h
…
mem-pool.c
…
mem-pool.h
…
merge-blobs.c odb: rename `repo_read_object_file()` 2025-07-01 14:46:38 -07:00
merge-blobs.h
…
merge-ll.c config: drop `git_config()` wrapper 2025-07-23 08:15:18 -07:00
merge-ll.h
…
merge-ort-wrappers.c
…
merge-ort-wrappers.h
…
merge-ort.c Merge branch 'en/ort-rename-fixes' into maint-2.51 2025-10-15 10:29:28 -07:00
merge-ort.h
…
merge.c
…
merge.h
…
mergesort.h
…
meson.build meson: make GIT_HTML_PATH configurable 2025-11-06 09:58:56 -08:00
meson_options.txt meson: make GIT_HTML_PATH configurable 2025-11-06 09:58:56 -08:00
midx-write.c Merge branch 'ds/midx-write-fixes' into maint-2.51 2025-10-15 10:29:30 -07:00
midx.c packfile: move `get_multi_pack_index()` into "midx.c" 2025-09-24 11:53:50 -07:00
midx.h packfile: move `get_multi_pack_index()` into "midx.c" 2025-09-24 11:53:50 -07:00
name-hash.c
…
name-hash.h
…
notes-cache.c odb: introduce `odb_write_object()` 2025-07-16 22:16:15 -07:00
notes-cache.h
…
notes-merge.c odb: rename `repo_read_object_file()` 2025-07-01 14:46:38 -07:00
notes-merge.h
…
notes-utils.c config: drop `git_config()` wrapper 2025-07-23 08:15:18 -07:00
notes-utils.h
…
notes.c Merge branch 'jc/string-list-split' 2025-08-21 13:46:59 -07:00
notes.h
…
object-file-convert.c
…
object-file-convert.h
…
object-file.c Merge branch 'ps/packfile-store' 2025-10-07 12:25:27 -07:00
object-file.h odb: add transaction interface 2025-09-16 11:37:06 -07:00
object-name.c packfile: introduce macro to iterate through packs 2025-10-16 14:42:39 -07:00
object-name.h
…
object.c alloc: fix dangling pointer in alloc_state cleanup 2025-09-04 15:24:16 -07:00
object.h last-modified: implement faster algorithm 2025-11-03 07:25:41 -08:00
odb.c Merge branch 'ps/packfile-store' 2025-10-07 12:25:27 -07:00
odb.h Merge branch 'ps/odb-clean-stale-wrappers' 2025-10-07 12:25:28 -07:00
oid-array.c
…
oid-array.h
…
oidmap.c
…
oidmap.h
…
oidset.c
…
oidset.h
…
oidtree.c
…
oidtree.h
…
pack-bitmap-write.c Merge branch 'ps/object-store' 2025-07-15 15:18:18 -07:00
pack-bitmap.c packfile: introduce macro to iterate through packs 2025-10-16 14:42:39 -07:00
pack-bitmap.h pack-bitmap: add load corrupt bitmap test 2025-07-01 14:41:54 -07:00
pack-check.c object-store: rename files to "odb.{c,h}" 2025-07-01 14:46:34 -07:00
pack-mtimes.c object-store: rename files to "odb.{c,h}" 2025-07-01 14:46:34 -07:00
pack-mtimes.h
…
pack-objects.c Merge branch 'ps/remove-packfile-store-get-packs' 2025-10-30 08:00:19 -07:00
pack-objects.h Merge branch 'ps/object-store' 2025-07-15 15:18:18 -07:00
pack-refs.c builtin/pack-refs: factor out core logic into a shared library 2025-09-19 10:02:55 -07:00
pack-refs.h builtin/pack-refs: factor out core logic into a shared library 2025-09-19 10:02:55 -07:00
pack-revindex.c midx: compute paths via their source 2025-08-11 09:22:23 -07:00
pack-revindex.h
…
pack-write.c object-file: get rid of `the_repository` in `finalize_object_file()` 2025-07-16 22:16:14 -07:00
pack.h object-file: get rid of `the_repository` in `finalize_object_file()` 2025-07-16 22:16:14 -07:00
packfile.c packfile: rename `packfile_store_get_all_packs()` 2025-10-16 14:42:40 -07:00
packfile.h packfile: rename `packfile_store_get_all_packs()` 2025-10-16 14:42:40 -07:00
pager.c
…
pager.h
…
parallel-checkout.c config: drop `git_config_get_int()` wrapper 2025-07-23 08:15:20 -07:00
parallel-checkout.h
…
parse-options-cb.c color: use git_colorbool enum type to store colorbools 2025-09-16 17:59:53 -07:00
parse-options.c Merge branch 'dk/parseopt-optional-filename-fixes' 2025-11-06 15:17:01 -08:00
parse-options.h Merge branch 'lm/add-p-context' 2025-08-04 08:10:33 -07:00
parse.c
…
parse.h
…
patch-delta.c
…
patch-ids.c
…
patch-ids.h
…
path-walk.c path-walk: create initializer for path lists 2025-08-25 09:01:17 -07:00
path-walk.h
…
path.c object-store: rename files to "odb.{c,h}" 2025-07-01 14:46:34 -07:00
path.h
…
pathspec.c string-list: split-then-remove-empty can be done while splitting 2025-08-02 22:34:45 -07:00
pathspec.h
…
pkt-line.c Use legacy hash for legacy formats 2025-07-01 14:58:24 -07:00
pkt-line.h
…
preload-index.c preload-index: stop depending on 'the_repository' 2025-06-10 10:10:40 -07:00
preload-index.h
…
pretty.c color: use git_colorbool enum type to store colorbools 2025-09-16 17:59:53 -07:00
pretty.h color: use git_colorbool enum type to store colorbools 2025-09-16 17:59:53 -07:00
prio-queue.c prio-queue: add prio_queue_replace() 2025-07-22 07:28:35 -07:00
prio-queue.h prio-queue: add prio_queue_replace() 2025-07-22 07:28:35 -07:00
progress.c progress: pay attention to (customized) delay time 2025-08-25 15:50:17 -07:00
progress.h
…
promisor-remote.c promisor-remote: use string_list_split() in mark_remotes_as_accepted() 2025-09-08 10:30:56 -07:00
promisor-remote.h
…
prompt.c interactive: do strip trailing CRLF from input 2025-07-31 14:17:54 -07:00
prompt.h
…
protocol-caps.c odb: rename `oid_object_info()` 2025-07-01 14:46:37 -07:00
protocol-caps.h
…
protocol.c Merge branch 'jc/string-list-split' 2025-08-21 13:46:59 -07:00
protocol.h
…
prune-packed.c object-file: get rid of `the_repository` in loose object iterators 2025-07-16 22:16:17 -07:00
prune-packed.h
…
pseudo-merge.c
…
pseudo-merge.h
…
quote.c
…
quote.h
…
range-diff.c range-diff: rename other_arg to log_arg 2025-09-25 11:34:11 -07:00
range-diff.h range-diff: rename other_arg to log_arg 2025-09-25 11:34:11 -07:00
reachable.c Merge branch 'ps/object-file-wo-the-repository' 2025-08-05 11:53:55 -07:00
reachable.h
…
read-cache-ll.h
…
read-cache.c Merge branch 'ps/rust-balloon' 2025-10-08 12:17:55 -07:00
read-cache.h
…
rebase-interactive.c config: drop `git_config_get_value()` wrapper 2025-07-23 08:15:18 -07:00
rebase-interactive.h
…
rebase.c
…
rebase.h
…
ref-filter.c ref-filter: export ref_kind_from_refname() 2025-10-21 14:40:37 -07:00
ref-filter.h Merge branch 'jt/repo-structure' 2025-11-04 07:48:07 -08:00
reflog-walk.c refs: pass refname when invoking reflog entry callback 2025-08-06 14:19:30 -07:00
reflog-walk.h
…
reflog.c Merge branch 'ps/remote-rename-fix' 2025-08-21 13:46:58 -07:00
reflog.h Merge branch 'ps/remote-rename-fix' 2025-08-21 13:46:58 -07:00
refs.c Merge branch 'kn/refs-files-case-insensitive' into maint-2.51 2025-10-15 10:29:31 -07:00
refs.h Merge branch 'kn/refs-files-case-insensitive' into maint-2.51 2025-10-15 10:29:31 -07:00
refspec.c
…
refspec.h
…
remote-curl.c Merge branch 'js/curl-off-t-fixes' into maint-2.51 2025-10-14 13:40:53 -07:00
remote.c Merge branch 'dl/push-missing-object-error' into maint-2.51 2025-10-15 10:29:28 -07:00
remote.h submodule: look up remotes by URL first 2025-06-23 16:38:57 -07:00
repack-cruft.c packfile: introduce macro to iterate through packs 2025-10-16 14:42:39 -07:00
repack-filtered.c repack: move `write_filtered_pack()` out of the builtin 2025-10-16 10:08:57 -07:00
repack-geometry.c packfile: introduce macro to iterate through packs 2025-10-16 14:42:39 -07:00
repack-midx.c repack: 'write_midx_included_packs' API from the builtin 2025-10-16 10:08:56 -07:00
repack-promisor.c builtin/repack.c: remove "repack_promisor_objects()" from the builtin 2025-10-16 10:08:55 -07:00
repack.c packfile: introduce macro to iterate through packs 2025-10-16 14:42:39 -07:00
repack.h repack: move `write_cruft_pack()` out of the builtin 2025-10-16 10:08:57 -07:00
replace-object.c object-store: rename files to "odb.{c,h}" 2025-07-01 14:46:34 -07:00
replace-object.h object-store: rename files to "odb.{c,h}" 2025-07-01 14:46:34 -07:00
repo-settings.c Merge branch 'ds/path-walk-2' 2025-06-17 10:44:38 -07:00
repo-settings.h Merge branch 'ds/path-walk-2' 2025-06-17 10:44:38 -07:00
repository.c Merge branch 'pw/3.0-commentchar-auto-deprecation' 2025-09-18 10:07:00 -07:00
repository.h config: warn on core.commentString=auto 2025-08-26 08:52:44 -07:00
rerere.c config: move Git config parsing into "environment.c" 2025-07-23 08:15:22 -07:00
rerere.h
…
reset.c
…
reset.h
…
resolve-undo.c
…
resolve-undo.h
…
revision.c revision: handle argv movement in parse_revision_opt() 2026-09-25 15:15:38 -07:00
revision.h Merge branch 'kh/format-patch-range-diff-notes' 2025-10-14 12:56:09 -07:00
run-command.c config: drop `git_config_get_bool()` wrapper 2025-07-23 08:15:20 -07:00
run-command.h
…
sane-ctype.h sane-ctype: fix compiler error on Amazon Linux 2 2025-07-10 11:18:37 -07:00
scalar.c commit-graph: add new config for changed-paths & recommend it in scalar 2025-10-22 10:40:11 -07:00
send-pack.c Merge branch 'ps/object-store' 2025-07-15 15:18:18 -07:00
send-pack.h
…
sequencer.c Merge branch 'pw/rebase-i-cleanup-fix' into maint-2.51 2025-10-15 10:29:31 -07:00
sequencer.h treewide: pass strvecs around for setup_revisions_from_strvec() 2025-09-22 14:27:03 -07:00
serve.c Use legacy hash for legacy formats 2025-07-01 14:58:24 -07:00
serve.h
…
server-info.c packfile: introduce macro to iterate through packs 2025-10-16 14:42:39 -07:00
server-info.h
…
setup.c Merge branch 'jc/string-list-split' 2025-08-21 13:46:59 -07:00
setup.h setup: use the default algorithm to initialize repo format 2025-07-01 14:58:24 -07:00
sh-i18n--envsubst.c
…
sha1dc_git.c
…
sha1dc_git.h
…
shallow.c treewide: pass strvecs around for setup_revisions_from_strvec() 2025-09-22 14:27:03 -07:00
shallow.h treewide: pass strvecs around for setup_revisions_from_strvec() 2025-09-22 14:27:03 -07:00
shared.mak Makefile: introduce infrastructure to build internal Rust library 2025-10-02 09:32:31 -07:00
shell.c
…
shortlog.h
…
sideband.c color: use git_colorbool enum type to store colorbools 2025-09-16 17:59:53 -07:00
sideband.h
…
sigchain.c
…
sigchain.h
…
simple-ipc.h
…
sparse-index.c sparse-index: improve advice message instructions 2025-10-20 09:20:50 -07:00
sparse-index.h
…
split-index.c
…
split-index.h
…
stable-qsort.c
…
statinfo.c
…
statinfo.h
…
strbuf.c strbuf: convert predicates to return bool 2025-07-16 08:18:06 -07:00
strbuf.h strbuf: convert predicates to return bool 2025-07-16 08:18:06 -07:00
streaming.c odb: rename `oid_object_info()` 2025-07-01 14:46:37 -07:00
streaming.h
…
string-list.c string-list: change "string_list_find_insert_index" return type to "size_t" 2025-10-06 09:11:07 -07:00
string-list.h string-list: change "string_list_find_insert_index" return type to "size_t" 2025-10-06 09:11:07 -07:00
strmap.c
…
strmap.h
…
strvec.c
…
strvec.h
…
sub-process.c sub-process: do not use strbuf_split*() 2025-08-02 22:44:58 -07:00
sub-process.h doc: update references to renamed AsciiDoc files 2025-06-06 15:05:47 -07:00
submodule-config.c config: drop `git_config_set_in_file_gently()` wrapper 2025-07-23 08:15:21 -07:00
submodule-config.h
…
submodule.c treewide: use setup_revisions_from_strvec() when we have a strvec 2025-09-22 14:27:03 -07:00
submodule.h odb: get rid of `the_repository` when handling submodule sources 2025-07-01 14:46:37 -07:00
symlinks.c
…
symlinks.h
…
tag.c odb: rename `repo_read_object_file()` 2025-07-01 14:46:38 -07:00
tag.h
…
tar.h
…
tempfile.c
…
tempfile.h
…
thread-utils.c thread-utils.c: detect online CPU count on OpenBSD / NetBSD 2025-06-01 17:15:13 -07:00
thread-utils.h
…
tmp-objdir.c object-file: get rid of `the_repository` in `finalize_object_file()` 2025-07-16 22:16:14 -07:00
tmp-objdir.h
…
trace.c
…
trace.h
…
trace2.c
…
trace2.h
…
trailer.c config: drop `git_config()` wrapper 2025-07-23 08:15:18 -07:00
trailer.h
…
transport-helper.c packfile: split up responsibilities of `reprepare_packed_git()` 2025-09-24 11:53:50 -07:00
transport-internal.h
…
transport.c Merge branch 'jk/color-variable-fixes' 2025-09-29 11:40:35 -07:00
transport.h
…
tree-diff.c diff: teach tree-diff a max-depth parameter 2025-08-07 15:29:35 -07:00
tree-walk.c odb: rename `read_object_with_reference()` 2025-07-01 14:46:39 -07:00
tree-walk.h
…
tree.c odb: rename `repo_read_object_file()` 2025-07-01 14:46:38 -07:00
tree.h
…
unicode-width.h unicode: update the width tables to Unicode 17 2025-10-21 10:03:00 -07:00
unimplemented.sh
…
unix-socket.c
…
unix-socket.h
…
unix-stream-server.c
…
unix-stream-server.h
…
unpack-trees.c object-store: rename files to "odb.{c,h}" 2025-07-01 14:46:34 -07:00
unpack-trees.h
…
upload-pack.c Merge branch 'ps/upload-pack-oom-protection' into maint-2.51 2025-10-15 10:29:30 -07:00
upload-pack.h
…
url.c
…
url.h
…
urlmatch.c
…
urlmatch.h
…
usage.c Merge branch 'kh/you-still-use-whatchanged-fix' 2025-10-02 12:26:12 -07:00
userdiff.c userdiff: add support for R programming language 2025-05-29 15:29:37 -07:00
userdiff.h
…
utf8.c
…
utf8.h
…
varint.c varint: use explicit width for integers 2025-10-02 09:32:32 -07:00
varint.h varint: use explicit width for integers 2025-10-02 09:32:32 -07:00
version-def.h.in
…
version.c
…
version.h
…
versioncmp.c config: drop `git_config_get_string_multi()` wrapper 2025-07-23 08:15:19 -07:00
versioncmp.h
…
walker.c Merge branch 'rs/pop-recent-commit-with-prio-queue' 2025-07-28 12:02:34 -07:00
walker.h
…
wildmatch.c
…
wildmatch.h
…
worktree.c config: drop `git_config_set_in_file_gently()` wrapper 2025-07-23 08:15:21 -07:00
worktree.h
…
wrapper.c config: values of pathname type can be prefixed with :(optional) 2025-10-07 10:05:48 -07:00
wrapper.h config: values of pathname type can be prefixed with :(optional) 2025-10-07 10:05:48 -07:00
write-or-die.c
…
write-or-die.h
…
ws.c
…
ws.h
…
wt-status.c Merge branch 'jk/status-z-short-fix' 2025-10-24 13:48:04 -07:00
wt-status.h color: use git_colorbool enum type to store colorbools 2025-09-16 17:59:53 -07:00
xdiff-interface.c config: move Git config parsing into "environment.c" 2025-07-23 08:15:22 -07:00
xdiff-interface.h diff: ensure consistent diff behavior with ignore options 2025-08-08 07:54:44 -07:00

README.md

Build status

Git - fast, scalable, distributed revision control system

Git is a fast, scalable, distributed revision control system with an unusually rich command set that provides both high-level operations and full access to internals.

Git is an Open Source project covered by the GNU General Public License version 2 (some parts of it are under different licenses, compatible with the GPLv2). It was originally written by Linus Torvalds with help of a group of hackers around the net.

Please read the file INSTALL for installation instructions.

Many Git online resources are accessible from https://git-scm.com/ including full documentation and Git related tools.

See Documentation/gittutorial.adoc to get started, then see Documentation/giteveryday.adoc for a useful minimum set of commands, and Documentation/git-<commandname>.adoc for documentation of each command. If git has been correctly installed, then the tutorial can also be read with man gittutorial or git help tutorial, and the documentation of each command with man git-<commandname> or git help <commandname>.

CVS users may also want to read Documentation/gitcvs-migration.adoc (man gitcvs-migration or git help cvs-migration if git is installed).

The user discussion and development of Git take place on the Git mailing list -- everyone is welcome to post bug reports, feature requests, comments and patches to git@vger.kernel.org (read Documentation/SubmittingPatches for instructions on patch submission and Documentation/CodingGuidelines).

Those wishing to help with error message, usage and informational message string translations (localization l10) should see po/README.md (a po file is a Portable Object file that holds the translations).

To subscribe to the list, send an email to git+subscribe@vger.kernel.org (see https://subspace.kernel.org/subscribing.html for details). The mailing list archives are available at https://lore.kernel.org/git/, https://marc.info/?l=git and other archival sites.

Issues which are security relevant should be disclosed privately to the Git Security mailing list git-security@googlegroups.com.

The maintainer frequently sends the "What's cooking" reports that list the current status of various development topics to the mailing list. The discussion following them give a good reference for project status, development direction and remaining tasks.

The name "git" was given by Linus Torvalds when he wrote the very first version. He described the tool as "the stupid content tracker" and the name as (depending on your mood):

  • random three-letter combination that is pronounceable, and not actually used by any common UNIX command. The fact that it is a mispronunciation of "get" may or may not be relevant.
  • stupid. contemptible and despicable. simple. Take your pick from the dictionary of slang.
  • "global information tracker": you're in a good mood, and it actually works for you. Angels sing, and a light suddenly fills the room.
  • "goddamn idiotic truckload of sh*t": when it breaks