Git with broken hash generation to generate collisions between object IDs. Don't use this! https://undefinedbehavior.de/posts/commit-vandalism/
Go to file
Michael Platings 1d028dc682 blame: add a fingerprint heuristic to match ignored lines
This algorithm will replace the heuristic used to identify lines from
ignored commits with one that finds likely candidate lines in the
parent's version of the file.  The actual replacement occurs in an
upcoming commit.

The old heuristic simply assigned lines in the target to the same line
number (plus offset) in the parent. The new function uses a
fingerprinting algorithm to detect similarity between lines.

The new heuristic is designed to accurately match changes made
mechanically by formatting tools such as clang-format and clang-tidy.
These tools make changes such as breaking up lines to fit within a
character limit or changing identifiers to fit with a naming convention.
The heuristic is not intended to match more extensive refactoring
changes and may give misleading results in such cases.

In most cases formatting tools preserve line ordering, so the heuristic
is optimised for such cases. (Some types of changes do reorder lines
e.g. sorting keep the line content identical, the git blame -M option
can already be used to address this). The reason that it is advantageous
to rely on ordering is due to source code repeating the same character
sequences often e.g. declaring an identifier on one line and using that
identifier on several subsequent lines.  This means that lines can look
very similar to each other which presents a problem when doing fuzzy
matching. Relying on ordering gives us extra clues to point towards the
true match.

The heuristic operates on a single diff chunk change at a time. It
creates a “fingerprint” for each line on each side of the change.
Fingerprints are described in detail in the comment for `struct
fingerprint`, but essentially are a multiset of the character pairs in a
line. The heuristic first identifies the line in the target entry whose
fingerprint is most clearly matched to a line fingerprint in the parent
entry. Where fingerprints match identically, the position of the lines
is used as a tie-break. The heuristic locks in the best match, and
subtracts the fingerprint of the line in the target entry from the
fingerprint of the line in the parent entry to prevent other lines being
matched on the same parts of that line. It then repeats the process
recursively on the section of the chunk before the match, and then the
section of the chunk after the match.

Here's an example of the difference the fingerprinting makes. Consider
a file with two commits:

        commit-a 1) void func_1(void *x, void *y);
        commit-b 2) void func_2(void *x, void *y);

After a commit 'X', we have:

        commit-X 1) void func_1(void *x,
        commit-X 2)             void *y);
        commit-X 3) void func_2(void *x,
        commit-X 4)             void *y);

When we blame-ignored with the old algorithm, we get:

        commit-a 1) void func_1(void *x,
        commit-b 2)             void *y);
        commit-X 3) void func_2(void *x,
        commit-X 4)             void *y);

Where commit-b is blamed for 2 instead of 3.  With the fingerprint
algorithm, we get:

        commit-a 1) void func_1(void *x,
        commit-a 2)             void *y);
        commit-b 3) void func_2(void *x,
        commit-b 4)             void *y);

Note line 2 could be matched with either commit-a or commit-b as it is
equally similar to both lines, but is matched with commit-a because its
position as a fraction of the new line range is more similar to commit-a
as a fraction of the old line range. Line 4 is also equally similar to
both lines, but as it appears after line 3 which will be matched first
it cannot be matched with an earlier line.

For many more examples, see t/t8014-blame-ignore-fuzzy.sh which contains
example parent and target files and the line numbers in the parent that
must be matched.

Signed-off-by: Michael Platings <michael@platin.gs>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2019-06-20 13:38:08 -07:00
.github
block-sha1
builtin blame: add config options for the output of ignored or unblamable lines 2019-05-16 11:36:23 +09:00
ci Merge branch 'ab/dynamic-gettext-poison' 2018-11-19 16:24:39 +09:00
compat Merge branch 'tb/use-common-win32-pathfuncs-on-cygwin' 2019-01-14 15:29:32 -08:00
contrib Merge branch 'jc/cocci-preincr' into maint 2018-11-21 22:58:08 +09:00
Documentation blame: add config options for the output of ignored or unblamable lines 2019-05-16 11:36:23 +09:00
ewah
git-gui
gitk-git
gitweb
mergetools
negotiator
perl
po l10n: de.po: fix two messages 2018-12-07 19:43:07 +01:00
ppc
refs Merge branch 'nd/per-worktree-ref-iteration' 2018-11-26 23:13:43 +09:00
sha1collisiondetection@232357eb2e
sha1dc
t blame: add a fingerprint heuristic to match ignored lines 2019-06-20 13:38:08 -07:00
templates
vcs-svn
xdiff
.clang-format
.editorconfig
.gitattributes Merge branch 'ds/hash-independent-tests-fix' into maint 2018-12-15 12:24:32 +09:00
.gitignore
.gitmodules
.mailmap mailmap: update brandon williams's email address 2018-12-09 10:59:00 +09:00
.travis.yml Merge branch 'ab/dynamic-gettext-poison' 2018-11-19 16:24:39 +09:00
.tsan-suppressions
abspath.c
aclocal.m4
advice.c push: add an advice on unqualified <dst> push 2018-11-14 15:27:55 +09:00
advice.h push: add an advice on unqualified <dst> push 2018-11-14 15:27:55 +09:00
alias.c alias.c: mark split_cmdline_strerror() strings for translation 2018-11-12 14:47:09 +09:00
alias.h
alloc.c
alloc.h
apply.c Merge branch 'nd/checkout-noisy' 2019-01-14 15:29:29 -08:00
apply.h
archive-tar.c Indent code with TABs 2018-12-09 12:37:32 +09:00
archive-zip.c
archive.c Merge branch 'nd/indentation-fix' 2019-01-14 15:29:32 -08:00
archive.h
argv-array.c
argv-array.h
attr.c Merge branch 'nd/i18n' 2019-01-04 13:33:31 -08:00
attr.h
banned.h
base85.c
bisect.c bisect.c: remove the_repository reference 2018-11-12 14:50:05 +09:00
bisect.h bisect.c: remove the_repository reference 2018-11-12 14:50:05 +09:00
blame.c blame: add a fingerprint heuristic to match ignored lines 2019-06-20 13:38:08 -07:00
blame.h blame: optionally track line fingerprints during fill_blame_origin() 2019-05-16 11:36:23 +09:00
blob.c
blob.h
branch.c branch.c: remove the_repository reference 2018-11-12 14:50:06 +09:00
branch.h branch.c: remove the_repository reference 2018-11-12 14:50:06 +09:00
builtin.h
bulk-checkin.c
bulk-checkin.h
bundle.c Merge branch 'nd/the-index' 2019-01-04 13:33:33 -08:00
bundle.h bundle.c: remove the_repository references 2018-11-12 14:50:06 +09:00
cache-tree.c Merge branch 'nd/indentation-fix' 2019-01-14 15:29:32 -08:00
cache-tree.h cache-tree.c: remove the_repository references 2018-11-12 14:50:06 +09:00
cache.h checkout: print something when checking out paths 2018-11-14 15:10:35 +09:00
chdir-notify.c
chdir-notify.h
check_bindir
check-builtins.sh
check-racy.c
checkout.c
checkout.h
color.c
color.h
column.c
column.h
combine-diff.c Merge branch 'nd/the-index' 2019-01-04 13:33:33 -08:00
command-list.txt Merge branch 'du/cherry-is-plumbing' into maint 2018-11-21 22:58:05 +09:00
commit-graph.c Merge branch 'ab/commit-graph-progress-fix' 2019-01-14 15:29:28 -08:00
commit-graph.h Merge branch 'ds/commit-graph-with-grafts' into maint 2018-11-21 22:57:47 +09:00
commit-reach.c
commit-reach.h Merge branch 'ds/add-missing-tags' 2018-11-13 22:37:24 +09:00
commit-slab-decl.h
commit-slab-impl.h
commit-slab.h
commit.c Merge branch 'ds/commit-graph-with-grafts' into maint 2018-11-21 22:57:47 +09:00
commit.h Merge branch 'js/shallow-and-fetch-prune' into maint 2018-11-21 22:57:51 +09:00
common-main.c
config.c index: make index.threads=true enable ieot and eoie 2018-11-21 16:46:54 +09:00
config.h index: make index.threads=true enable ieot and eoie 2018-11-21 16:46:54 +09:00
config.mak.dev Merge branch 'jk/dev-build-format-security' into maint 2018-11-21 22:57:56 +09:00
config.mak.in
config.mak.uname Merge branch 'tb/use-common-win32-pathfuncs-on-cygwin' 2019-01-14 15:29:32 -08:00
configure.ac Merge branch 'dd/poll-dot-h' 2018-11-19 16:24:41 +09:00
connect.c
connect.h
connected.c
connected.h
convert.c Indent code with TABs 2018-12-09 12:37:32 +09:00
convert.h
copy.c
COPYING
credential-cache--daemon.c
credential-cache.c
credential-store.c
credential.c
credential.h
csum-file.c
csum-file.h
ctype.c
daemon.c
date.c approxidate: fix NULL dereference in date_time() 2018-11-07 11:04:06 +09:00
decorate.c
decorate.h
delta-islands.c delta-islands.c: remove the_repository references 2018-11-12 14:50:06 +09:00
delta-islands.h delta-islands.c: remove the_repository references 2018-11-12 14:50:06 +09:00
delta.h
detect-compiler
diff-delta.c
diff-lib.c diff-lib.c: remove the_repository references 2018-11-12 14:50:06 +09:00
diff-no-index.c
diff.c Merge branch 'sb/diff-color-moved-config-option-fixup' 2019-01-14 15:29:31 -08:00
diff.h Merge branch 'sb/diff-color-moved-config-option-fixup' 2019-01-14 15:29:31 -08:00
diffcore-break.c
diffcore-delta.c
diffcore-order.c
diffcore-pickaxe.c Merge branch 'tb/log-G-binary' 2019-01-14 15:29:31 -08:00
diffcore-rename.c
diffcore.h
dir-iterator.c
dir-iterator.h
dir.c dir.c: move, rename and export match_attrs() 2018-11-19 10:50:33 +09:00
dir.h
editor.c
entry.c Merge branch 'nd/checkout-noisy' 2019-01-14 15:29:29 -08:00
environment.c Merge branch 'jk/loose-object-cache' 2019-01-04 13:33:32 -08:00
exec-cmd.c
exec-cmd.h
fast-import.c Merge branch 'en/fast-export-import' 2019-01-04 13:33:33 -08:00
fetch-negotiator.c
fetch-negotiator.h
fetch-object.c
fetch-object.h
fetch-pack.c Merge branch 'jk/loose-object-cache' 2019-01-04 13:33:32 -08:00
fetch-pack.h
fmt-merge-msg.h
fsck.c Move oidset_parse_file() to oidset.c 2019-05-16 11:36:23 +09:00
fsck.h
fsmonitor.c
fsmonitor.h
fuzz-pack-headers.c
fuzz-pack-idx.c
generate-cmdlist.sh
gettext.c i18n: make GETTEXT_POISON a runtime option 2018-11-09 11:25:19 +09:00
gettext.h i18n: make GETTEXT_POISON a runtime option 2018-11-09 11:25:19 +09:00
git-add--interactive.perl
git-archimport.perl
git-bisect.sh
git-compat-util.h Merge branch 'nd/indentation-fix' 2019-01-14 15:29:32 -08:00
git-cvsexportcommit.perl
git-cvsimport.perl
git-cvsserver.perl
git-difftool--helper.sh
git-filter-branch.sh
git-instaweb.sh
git-legacy-rebase.sh rebase --stat: fix when rebasing to an unrelated history 2018-11-30 14:43:00 +09:00
git-merge-octopus.sh
git-merge-one-file.sh
git-merge-resolve.sh
git-mergetool--lib.sh
git-mergetool.sh
git-p4.py
git-parse-remote.sh
git-quiltimport.sh
git-rebase--am.sh
git-rebase--common.sh
git-rebase--merge.sh
git-rebase--preserve-merges.sh
git-remote-testgit.sh
git-request-pull.sh
git-send-email.perl Merge branch 'nd/complete-format-patch' 2018-11-13 22:37:28 +09:00
git-sh-i18n.sh i18n: make GETTEXT_POISON a runtime option 2018-11-09 11:25:19 +09:00
git-sh-setup.sh
git-stash.sh stash: tolerate missing user identity 2018-11-19 08:24:34 +09:00
git-submodule.sh Merge branch 'ao/submodule-wo-gitmodules-checked-out' 2018-11-13 22:37:22 +09:00
git-svn.perl
GIT-VERSION-GEN Prepare for 2.21 cycle to start soonish 2018-12-15 12:36:06 +09:00
git-web--browse.sh
git.c Merge branch 'nd/i18n' 2019-01-04 13:33:31 -08:00
git.rc
gpg-interface.c
gpg-interface.h
graph.c Merge branch 'np/log-graph-octopus-fix' into maint 2018-11-21 22:57:49 +09:00
graph.h
grep.c Merge branch 'nd/the-index' 2019-01-04 13:33:33 -08:00
grep.h
hash.h
hashmap.c
hashmap.h
help.c help -a: handle aliases with long names gracefully 2018-12-12 17:18:38 +09:00
help.h help.h: fix coding style 2018-12-12 17:18:29 +09:00
hex.c
http-backend.c Merge branch 'mk/http-backend-kill-children-before-exit' 2019-01-04 13:33:35 -08:00
http-fetch.c
http-push.c Upcast size_t variables to uintmax_t when printing 2018-11-12 16:43:52 +09:00
http-walker.c sha1_file_name(): overwrite buffer instead of appending 2018-11-13 14:22:02 +09:00
http.c Merge branch 'jk/loose-object-cache' 2019-01-04 13:33:32 -08:00
http.h
ident.c
imap-send.c
INSTALL
interdiff.c
interdiff.h
iterator.h
json-writer.c
json-writer.h
khash.h
kwset.c
kwset.h
levenshtein.c
levenshtein.h
LGPL-2.1
line-log.c line-log.c: remove the_repository reference 2018-11-12 14:50:06 +09:00
line-log.h
line-range.c
line-range.h
linear-assignment.c
linear-assignment.h
list-objects-filter-options.c
list-objects-filter-options.h
list-objects-filter.c list-objects-filter.c: remove implicit dependency on the_index 2018-11-12 14:50:05 +09:00
list-objects-filter.h list-objects-filter.c: remove implicit dependency on the_index 2018-11-12 14:50:05 +09:00
list-objects.c Merge branch 'nd/attr-pathspec-in-tree-walk' 2019-01-14 15:29:28 -08:00
list-objects.h
list.h
ll-merge.c Merge branch 'en/merge-path-collision' 2019-01-04 13:33:32 -08:00
ll-merge.h Merge branch 'en/merge-path-collision' 2019-01-04 13:33:32 -08:00
lockfile.c
lockfile.h
log-tree.c range-diff: always pass at least minimal diff options 2018-12-04 10:36:14 +09:00
log-tree.h
ls-refs.c
ls-refs.h
mailinfo.c
mailinfo.h
mailmap.c
mailmap.h
Makefile Merge branch 'js/mingw-o-append' into maint 2018-11-21 22:57:44 +09:00
match-trees.c
mem-pool.c
mem-pool.h
merge-blobs.c
merge-blobs.h
merge-recursive.c Merge branch 'nd/attr-pathspec-in-tree-walk' 2019-01-14 15:29:28 -08:00
merge-recursive.h
merge.c
mergesort.c
mergesort.h
midx.c Merge branch 'jk/loose-object-cache' 2019-01-04 13:33:32 -08:00
midx.h Merge branch 'ds/test-multi-pack-index' 2018-11-13 22:37:19 +09:00
name-hash.c
notes-cache.c notes-cache.c: remove the_repository references 2018-11-12 14:50:06 +09:00
notes-cache.h notes-cache.c: remove the_repository references 2018-11-12 14:50:06 +09:00
notes-merge.c notes-merge.c: remove implicit dependency the_repository 2018-11-12 14:50:05 +09:00
notes-merge.h notes-merge.c: remove implicit dependency on the_index 2018-11-12 14:50:05 +09:00
notes-utils.c
notes-utils.h
notes.c
notes.h
object-store.h sha1-file: use loose object cache for quick existence check 2018-11-13 14:22:03 +09:00
object.c sha1-file: use an object_directory for the main object dir 2018-11-13 14:22:03 +09:00
object.h
oidmap.c
oidmap.h
oidset.c Move oidset_parse_file() to oidset.c 2019-05-16 11:36:23 +09:00
oidset.h Move oidset_parse_file() to oidset.c 2019-05-16 11:36:23 +09:00
pack-bitmap-write.c pack-*.c: remove the_repository references 2018-11-12 14:50:06 +09:00
pack-bitmap.c pack-*.c: remove the_repository references 2018-11-12 14:50:06 +09:00
pack-bitmap.h pack-*.c: remove the_repository references 2018-11-12 14:50:06 +09:00
pack-check.c pack-check.c: remove the_repository references 2018-11-12 14:50:06 +09:00
pack-objects.c pack-*.c: remove the_repository references 2018-11-12 14:50:06 +09:00
pack-objects.h Merge branch 'nd/the-index' 2019-01-04 13:33:33 -08:00
pack-revindex.c
pack-revindex.h
pack-write.c
pack.h pack-check.c: remove the_repository references 2018-11-12 14:50:06 +09:00
packfile.c Merge branch 'jk/loose-object-cache' 2019-01-04 13:33:32 -08:00
packfile.h
pager.c
parse-options-cb.c Merge branch 'nd/i18n' 2019-01-04 13:33:31 -08:00
parse-options.c Merge branch 'nd/indentation-fix' 2019-01-14 15:29:32 -08:00
parse-options.h Merge branch 'nd/indentation-fix' 2019-01-14 15:29:32 -08:00
patch-delta.c
patch-ids.c
patch-ids.h
path.c Merge branch 'jk/loose-object-cache' 2019-01-04 13:33:32 -08:00
path.h
pathspec.c dir.c: move, rename and export match_attrs() 2018-11-19 10:50:33 +09:00
pathspec.h dir.c: move, rename and export match_attrs() 2018-11-19 10:50:33 +09:00
pkt-line.c
pkt-line.h
preload-index.c Merge branch 'nd/pthreads' 2018-11-18 18:23:52 +09:00
pretty.c Merge branch 'jk/trailer-fixes' into maint 2018-11-21 22:57:42 +09:00
pretty.h
prio-queue.c
prio-queue.h
progress.c
progress.h
prompt.c
prompt.h
protocol.c
protocol.h protocol: introduce enum protocol_version value protocol_v2 2018-03-14 14:15:07 -07:00
quote.c Indent code with TABs 2018-12-09 12:37:32 +09:00
quote.h
range-diff.c format-patch: do not let its diff-options affect --range-diff 2018-11-30 13:47:55 +09:00
range-diff.h format-patch: do not let its diff-options affect --range-diff 2018-11-30 13:47:55 +09:00
reachable.c
reachable.h
read-cache.c Merge branch 'nd/indentation-fix' 2019-01-14 15:29:32 -08:00
README.md
rebase-interactive.c rebase-interactive.c: remove the_repository references 2018-11-12 14:50:06 +09:00
rebase-interactive.h rebase-interactive.c: remove the_repository references 2018-11-12 14:50:06 +09:00
ref-filter.c Merge branch 'nd/the-index' 2019-01-04 13:33:33 -08:00
ref-filter.h
reflog-walk.c
reflog-walk.h
refs.c Merge branch 'ds/commit-graph-with-grafts' into maint 2018-11-21 22:57:47 +09:00
refs.h Merge branch 'ds/commit-graph-with-grafts' into maint 2018-11-21 22:57:47 +09:00
refspec.c
refspec.h
RelNotes Prepare for 2.21 cycle to start soonish 2018-12-15 12:36:06 +09:00
remote-curl.c Merge branch 'en/double-semicolon-fix' into maint 2018-11-21 22:57:55 +09:00
remote-testsvn.c
remote.c Merge branch 'ab/push-dwim-dst' 2019-01-04 13:33:34 -08:00
remote.h
replace-object.c Merge branch 'ds/commit-graph-with-grafts' into maint 2018-11-21 22:57:47 +09:00
replace-object.h
repository.c sha1-file: use an object_directory for the main object dir 2018-11-13 14:22:03 +09:00
repository.h
rerere.c Merge branch 'en/rerere-multi-stage-1-fix' into maint 2018-11-21 22:57:44 +09:00
rerere.h rerere.c: remove the_repository references 2018-11-12 14:50:06 +09:00
resolve-undo.c
resolve-undo.h
revision.c Merge branch 'nd/indentation-fix' 2019-01-14 15:29:32 -08:00
revision.h Merge branch 'md/exclude-promisor-objects-fix-cleanup' 2019-01-14 15:29:31 -08:00
run-command.c Merge branch 'jc/run-command-report-exec-failure-fix' into maint 2018-12-15 12:24:34 +09:00
run-command.h
send-pack.c
send-pack.h
sequencer.c Merge branch 'nd/the-index' 2019-01-04 13:33:33 -08:00
sequencer.h Merge branch 'nd/the-index' 2019-01-04 13:33:33 -08:00
serve.c
serve.h
server-info.c
setup.c
sh-i18n--envsubst.c
sha1-array.c
sha1-array.h
sha1-file.c Merge branch 'jk/loose-object-cache' 2019-01-04 13:33:32 -08:00
sha1-lookup.c
sha1-lookup.h
sha1-name.c object-store: provide helpers for loose_objects_cache 2018-11-13 14:22:03 +09:00
sha1dc_git.c
sha1dc_git.h
shallow.c
shell.c Merge branch 'nd/command-list' 2018-06-01 15:06:37 +09:00
shortlog.h
sideband.c sideband: color lines with keyword only 2018-12-04 12:12:46 +09:00
sideband.h
sigchain.c
sigchain.h
split-index.c
split-index.h
strbuf.c
strbuf.h
streaming.c
streaming.h
string-list.c Merge branch 'sb/string-list-remove-unused' into maint 2018-11-21 22:57:56 +09:00
string-list.h
sub-process.c
sub-process.h
submodule-config.c Merge branch 'ao/submodule-wo-gitmodules-checked-out' 2018-11-13 22:37:22 +09:00
submodule-config.h
submodule.c Merge branch 'sm/show-superproject-while-conflicted' into maint 2018-11-21 22:57:48 +09:00
submodule.h Merge branch 'ao/submodule-wo-gitmodules-checked-out' 2018-11-13 22:37:22 +09:00
symlinks.c Indent code with TABs 2018-12-09 12:37:32 +09:00
tag.c
tag.h
tar.h
tempfile.c
tempfile.h Merge branch 'jk/reopen-tempfile-truncate' into maint 2018-11-21 22:57:43 +09:00
thread-utils.c
thread-utils.h
tmp-objdir.c
tmp-objdir.h
trace.c
trace.h
trailer.c
trailer.h Merge branch 'jk/trailer-fixes' into maint 2018-11-21 22:57:42 +09:00
transport-helper.c Merge branch 'nd/n18n-fix' 2018-11-29 16:28:39 +09:00
transport-internal.h
transport.c Merge branch 'nd/the-index' 2019-01-04 13:33:33 -08:00
transport.h transport.c: remove implicit dependency on the_index 2018-11-12 14:50:05 +09:00
tree-diff.c tree-walk.c: make tree_entry_interesting() take an index 2018-11-19 10:50:33 +09:00
tree-walk.c tree-walk: support :(attr) matching 2018-11-19 10:50:33 +09:00
tree-walk.h tree-walk.c: make tree_entry_interesting() take an index 2018-11-19 10:50:33 +09:00
tree.c tree-walk.c: make tree_entry_interesting() take an index 2018-11-19 10:50:33 +09:00
tree.h tree.c: make read_tree*() take 'struct repository *' 2018-11-19 10:50:33 +09:00
unicode-width.h
unimplemented.sh
unix-socket.c
unix-socket.h
unpack-trees.c Merge branch 'nd/checkout-noisy' 2019-01-14 15:29:29 -08:00
unpack-trees.h
upload-pack.c Merge branch 'jk/uploadpack-packobjectshook-fix' into maint 2018-11-21 22:58:09 +09:00
upload-pack.h
url.c
url.h
urlmatch.c
urlmatch.h
usage.c
userdiff.c notes-cache.c: remove the_repository references 2018-11-12 14:50:06 +09:00
userdiff.h notes-cache.c: remove the_repository references 2018-11-12 14:50:06 +09:00
utf8.c
utf8.h
varint.c
varint.h
version.c
version.h
versioncmp.c
walker.c
walker.h
wildmatch.c
wildmatch.h
worktree.c Merge branch 'nd/per-worktree-ref-iteration' 2018-11-13 22:37:26 +09:00
worktree.h Merge branch 'nd/per-worktree-ref-iteration' 2018-11-13 22:37:26 +09:00
wrap-for-bin.sh
wrapper.c
write-or-die.c
ws.c
wt-status.c Merge branch 'nd/the-index' 2019-01-04 13:33:33 -08:00
wt-status.h wt-status.c: remove implicit dependency the_repository 2018-11-12 14:50:05 +09:00
xdiff-interface.c Merge branch 'jk/xdiff-interface' 2018-11-13 22:37:27 +09:00
xdiff-interface.h
zlib.c

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.txt to get started, then see Documentation/giteveryday.txt for a useful minimum set of commands, and Documentation/git-.txt 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.txt (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). To subscribe to the list, send an email with just "subscribe git" in the body to majordomo@vger.kernel.org. The mailing list archives are available at https://public-inbox.org/git/, http://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