Git with broken hash generation to generate collisions between object IDs. Don't use this! https://undefinedbehavior.de/posts/commit-vandalism/
Go to file
Elijah Newren 37b65ce36b merge-recursive: new function for better colliding conflict resolutions
There are three conflict types that represent two (possibly entirely
unrelated) files colliding at the same location:
  * add/add
  * rename/add
  * rename/rename(2to1)

These three conflict types already share more similarity than might be
immediately apparent from their description: (1) the handling of the
rename variants already involves removing any entries from the index
corresponding to the original file names[*], thus only leaving entries
in the index for the colliding path; (2) likewise, any trace of the
original file name in the working tree is also removed.  So, in all
three cases we're left with how to represent two colliding files in both
the index and the working copy.

[*] Technically, this isn't quite true because rename/rename(2to1)
conflicts in the recursive (o->call_depth > 0) case do an "unrename"
since about seven years ago.  But even in that case, Junio felt
compelled to explain that my decision to "unrename" wasn't necessarily
the only or right answer -- search for "Comment from Junio" in t6036 for
details.

My initial motivation for looking at these three conflict types was that
if the handling of these three conflict types is the same, at least in
the limited set of cases where a renamed file is unmodified on the side
of history where the file is not renamed, then a significant performance
improvement for rename detection during merges is possible.  However,
while that served as motivation to look at these three types of
conflicts, the actual goal of this new function is to try to improve the
handling for all three cases, not to merely make them the same as each
other in that special circumstance.

=== Handling the working tree ===

The previous behavior for these conflict types in regards to the
working tree (assuming the file collision occurs at 'foo') was:
  * add/add does a two-way merge of the two files and records it as 'foo'.
  * rename/rename(2to1) records the two different files into two new
    uniquely named files (foo~HEAD and foo~$MERGE), while removing 'foo'
    from the working tree.
  * rename/add records the two different files into two different
    locations, recording the add at foo~$SIDE and, oddly, recording
    the rename at foo (why is the rename more important than the add?)

So, the question for what to write to the working tree boils down to
whether the two colliding files should be two-way merged and recorded in
place, or recorded into separate files.  As per discussion on the git
mailing lit, two-way merging was deemed to always be preferred, as that
makes these cases all more like content conflicts that users can handle
from within their favorite editor, IDE, or merge tool.  Note that since
renames already involve a content merge, rename/add and
rename/rename(2to1) conflicts could result in nested conflict markers.

=== Handling of the index ===

For a typical rename, unpack_trees() would set up the index in the
following fashion:
           old_path  new_path
   stage1: 5ca1ab1e  00000000
   stage2: f005ba11  00000000
   stage3: 00000000  b0a710ad
And merge-recursive would rewrite this to
           new_path
   stage1: 5ca1ab1e
   stage2: f005ba11
   stage3: b0a710ad
Removing old_path from the index means the user won't have to `git rm
old_path` manually every time a renamed path has a content conflict.
It also means they can use `git checkout [--ours|--theirs|--conflict|-m]
new_path`, `git diff [--ours|--theirs]` and various other commands that
would be difficult otherwise.

This strategy becomes a problem when we have a rename/add or
rename/rename(2to1) conflict, however, because then we have only three
slots to store blob sha1s and we need either four or six.  Previously,
this was handled by continuing to delete old_path from the index, and
just outright ignoring any blob shas from old_path.  That had the
downside of deleting any trace of changes made to old_path on the other
side of history.  This function instead does a three-way content merge of
the renamed file, and stores the blob sha1 for that at either stage2 or
stage3 for new_path (depending on which side the rename came from).  That
has the advantage of bringing information about changes on both sides and
still allows for easy resolution (no need to git rm old_path, etc.), but
does have the downside that if the content merge had conflict markers,
then what we store in the index is the sha1 of a blob with conflict
markers.  While that is a downside, it seems less problematic than the
downsides of any obvious alternatives, and certainly makes more sense
than the previous handling.  Further, it has a precedent in that when we
do recursive merges, we may accept a file with conflict markers as the
resolution for the merge of the merge-bases, which will then show up in
the index of the outer merge at stage 1 if a conflict exists at the outer
level.

Signed-off-by: Elijah Newren <newren@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2018-11-08 14:23:53 +09:00
.github
block-sha1
builtin Merge branch 'ab/fetch-tags-noclobber' 2018-09-17 13:54:00 -07:00
ci Merge branch 'nd/pack-deltify-regression-fix' 2018-08-22 11:17:05 -07:00
compat Merge branch 'en/incl-forward-decl' 2018-08-20 12:41:32 -07:00
contrib convert "hashcmp() != 0" to "!hasheq()" 2018-08-29 11:32:49 -07:00
Documentation Merge branch 'ab/fetch-tags-noclobber' 2018-09-17 13:54:00 -07:00
ewah ewah: delete unused 'rlwit_discharge_empty()' 2018-06-21 09:39:48 -07:00
git-gui
gitk-git
gitweb
mergetools mergetools: add support for guiffy 2018-04-06 08:11:39 +09:00
negotiator Merge branch 'jt/fetch-negotiator-skipping' 2018-08-02 15:30:46 -07:00
perl
po l10n: zh_CN: for git v2.19.0 l10n round 1 to 2 2018-09-09 22:38:39 +08:00
ppc
refs convert "oidcmp() != 0" to "!oideq()" 2018-08-29 11:32:49 -07:00
sha1collisiondetection@232357eb2e sha1dc: update from upstream 2018-08-02 13:54:58 -07:00
sha1dc sha1dc: update from upstream 2018-08-02 13:54:58 -07:00
t merge-recursive: increase marker length with depth of recursion 2018-11-08 14:23:53 +09:00
templates Update shell scripts to compute empty tree object ID 2018-05-02 13:59:53 +09:00
vcs-svn
xdiff Merge branch 'sb/indent-heuristic-optim' 2018-08-17 13:09:57 -07:00
.clang-format
.gitattributes .gitattributes: add conflict-marker-size for relevant files 2018-08-29 11:27:31 -07:00
.gitignore Sync 'ds/multi-pack-index' to v2.19.0-rc0 2018-08-20 15:29:54 -07:00
.gitmodules
.mailmap .mailmap: merge different spellings of names 2018-06-29 09:29:44 -07:00
.travis.yml
.tsan-suppressions
abspath.c
aclocal.m4
advice.c Merge branch 'ab/checkout-default-remote' 2018-08-02 15:30:41 -07:00
advice.h Merge branch 'ab/checkout-default-remote' 2018-08-02 15:30:41 -07:00
alias.c
alias.h completion: add and use --list-cmds=alias 2018-05-21 13:23:14 +09:00
alloc.c alloc: make allocate_alloc_state and clear_alloc_state more consistent 2018-08-15 11:52:09 -07:00
alloc.h alloc: make allocate_alloc_state and clear_alloc_state more consistent 2018-08-15 11:52:09 -07:00
apply.c apply.c: remove implicit dependency on the_index 2018-08-13 14:14:44 -07:00
apply.h Merge branch 'en/incl-forward-decl' 2018-08-20 12:41:32 -07:00
archive-tar.c Merge branch 'nd/no-the-index' 2018-08-20 11:33:53 -07:00
archive-zip.c Merge branch 'nd/no-the-index' 2018-08-20 11:33:53 -07:00
archive.c archive.c: avoid access to the_index 2018-08-13 14:14:43 -07:00
archive.h Merge branch 'en/incl-forward-decl' 2018-08-20 12:41:32 -07:00
argv-array.c
argv-array.h
attr.c attr: remove index from git_attr_set_direction() 2018-08-13 14:14:43 -07:00
attr.h Merge branch 'en/incl-forward-decl' 2018-08-20 12:41:32 -07:00
banned.h banned.h: mark strncpy() as banned 2018-07-26 10:12:51 -07:00
base85.c
bisect.c Merge branch 'nd/bisect-show-list-fix' 2018-09-17 13:54:00 -07:00
bisect.h Add missing includes and forward declarations 2018-08-15 11:52:09 -07:00
blame.c convert "oidcmp() != 0" to "!oideq()" 2018-08-29 11:32:49 -07:00
blame.h blame.c: remove implicit dependency on the_index 2018-08-13 14:14:44 -07:00
blob.c blob: allow lookup_blob to handle arbitrary repositories 2018-06-29 10:43:39 -07:00
blob.h blob: allow lookup_blob to handle arbitrary repositories 2018-06-29 10:43:39 -07:00
branch.c Merge branch 'ab/unconditional-free-and-null' 2018-08-27 14:33:42 -07:00
branch.h Move definition of enum branch_track from cache.h to branch.h 2018-08-15 11:52:09 -07:00
builtin.h Sync 'ds/multi-pack-index' to v2.19.0-rc0 2018-08-20 15:29:54 -07:00
bulk-checkin.c convert "oidcmp() == 0" to oideq() 2018-08-29 11:32:49 -07:00
bulk-checkin.h Add missing includes and forward declarations 2018-08-15 11:52:09 -07:00
bundle.c convert "oidcmp() != 0" to "!oideq()" 2018-08-29 11:32:49 -07:00
bundle.h
cache-tree.c Merge branch 'jk/cocci' 2018-09-17 13:53:57 -07:00
cache-tree.h Merge branch 'nd/unpack-trees-with-cache-tree' 2018-09-17 13:53:53 -07:00
cache.h Merge branch 'jk/cocci' 2018-09-17 13:53:57 -07:00
chdir-notify.c
chdir-notify.h
check_bindir
check-builtins.sh
check-racy.c
checkout.c
checkout.h
color.c color: protect against out-of-bounds reads and writes 2018-08-03 08:52:05 -07:00
color.h range-diff: use dim/bold cues to improve dual color mode 2018-08-13 10:44:52 -07:00
column.c
column.h Add missing includes and forward declarations 2018-08-15 11:52:09 -07:00
combine-diff.c convert "oidcmp() == 0" to oideq() 2018-08-29 11:32:49 -07:00
command-list.txt Sync 'ds/multi-pack-index' to v2.19.0-rc0 2018-08-20 15:29:54 -07:00
commit-graph.c Merge branch 'ds/commit-graph-tests' 2018-09-17 13:53:58 -07:00
commit-graph.h Merge branch 'ds/commit-graph-tests' 2018-09-17 13:53:58 -07:00
commit-reach.c Merge branch 'ds/reachable' 2018-09-17 13:53:52 -07:00
commit-reach.h commit-reach: make can_all_from_reach... linear 2018-07-20 15:38:56 -07:00
commit-slab-decl.h
commit-slab-impl.h commit-slabs: remove realloc counter outside of slab struct 2018-06-29 10:43:40 -07:00
commit-slab.h
commit.c Merge branch 'jk/cocci' 2018-09-17 13:53:57 -07:00
commit.h Merge branch 'jk/trailer-fixes' 2018-09-17 13:53:54 -07:00
common-main.c
config.c i18n: fix mistakes in translated strings 2018-08-23 14:29:12 -07:00
config.h Merge branch 'en/incl-forward-decl' 2018-08-20 12:41:32 -07:00
config.mak.dev Makefile: add a DEVOPTS flag to get pedantic compilation 2018-07-25 09:52:32 -07:00
config.mak.in
config.mak.uname Merge branch 'es/freebsd-iconv-portability' 2018-09-04 14:31:39 -07:00
configure.ac
connect.c convert "oidcmp() == 0" to oideq() 2018-08-29 11:32:49 -07:00
connect.h fixup! connect.h: avoid forward declaration of an enum 2018-07-09 14:35:39 -07:00
connected.c fetch-pack: write shallow, then check connectivity 2018-07-03 14:57:44 -07:00
connected.h Add missing includes and forward declarations 2018-08-15 11:52:09 -07:00
convert.c Merge branch 'nd/no-the-index' 2018-08-20 11:33:53 -07:00
convert.h Merge branch 'en/incl-forward-decl' 2018-08-20 12:41:32 -07:00
copy.c copy.c: use error_errno() 2016-05-09 12:29:08 -07:00
COPYING
credential-cache--daemon.c
credential-cache.c
credential-store.c
credential.c
credential.h
csum-file.c
csum-file.h Add missing includes and forward declarations 2018-08-15 11:52:09 -07:00
ctype.c
daemon.c Merge branch 'lw/daemon-log-destination' 2018-04-25 13:28:58 +09:00
date.c
decorate.c
decorate.h
delta-islands.c pack-objects: move 'layer' into 'struct packing_data' 2018-08-16 10:56:44 -07:00
delta-islands.h Add delta-islands.{c,h} 2018-08-16 10:51:17 -07:00
delta.h
detect-compiler
diff-delta.c
diff-lib.c Merge branch 'jk/cocci' 2018-09-17 13:53:57 -07:00
diff-no-index.c
diff.c Merge branch 'jk/cocci' 2018-09-17 13:53:57 -07:00
diff.h Merge branch 'sb/range-diff-colors' 2018-09-17 13:53:54 -07:00
diffcore-break.c convert "oidcmp() == 0" to oideq() 2018-08-29 11:32:49 -07:00
diffcore-delta.c
diffcore-order.c
diffcore-pickaxe.c
diffcore-rename.c convert "oidcmp() != 0" to "!oideq()" 2018-08-29 11:32:49 -07:00
diffcore.h Merge branch 'en/incl-forward-decl' 2018-08-20 12:41:32 -07:00
dir-iterator.c
dir-iterator.h Add missing includes and forward declarations 2018-08-15 11:52:09 -07:00
dir.c Merge branch 'jk/cocci' 2018-09-17 13:53:57 -07:00
dir.h dir.c: remove an implicit dependency on the_index in pathspec code 2018-08-13 14:14:42 -07:00
editor.c
entry.c Merge branch 'nd/clone-case-smashing-warning' 2018-09-17 13:53:47 -07:00
environment.c Merge branch 'en/incl-forward-decl' 2018-08-20 12:41:32 -07:00
exec-cmd.c exec-cmd.c: mark more strings for translation 2018-07-23 11:19:10 -07:00
exec-cmd.h
fast-import.c Merge branch 'jk/cocci' 2018-09-17 13:53:57 -07:00
fetch-negotiator.c negotiator: unknown fetch.negotiationAlgorithm should error out 2018-08-01 11:07:47 -07:00
fetch-negotiator.h negotiator/skipping: skip commits during fetch 2018-07-16 14:51:12 -07:00
fetch-object.c fetch-pack: unify ref in and out param 2018-08-01 15:00:52 -07:00
fetch-object.h
fetch-pack.c convert "oidcmp() != 0" to "!oideq()" 2018-08-29 11:32:49 -07:00
fetch-pack.h Merge branch 'jt/fetch-nego-tip' 2018-08-02 15:30:43 -07:00
fmt-merge-msg.h fmt-merge-msg: use branch.$name.description 2011-10-07 10:11:47 -07:00
fsck.c Merge branch 'sb/object-store-lookup' 2018-08-02 15:30:42 -07:00
fsck.h Add missing includes and forward declarations 2018-08-15 11:52:09 -07:00
fsmonitor.c
fsmonitor.h Add missing includes and forward declarations 2018-08-15 11:52:09 -07:00
generate-cmdlist.sh generate-cmdlist.sh: collect config from all config.txt files 2018-08-21 11:28:11 -07:00
gettext.c
gettext.h
git-add--interactive.perl Merge branch 'pw/add-p-recount' 2018-06-28 12:53:32 -07:00
git-archimport.perl
git-bisect.sh
git-compat-util.h Merge branch 'js/typofixes' 2018-08-20 11:33:50 -07:00
git-cvsexportcommit.perl
git-cvsimport.perl
git-cvsserver.perl
git-difftool--helper.sh
git-filter-branch.sh Merge branch 'mb/filter-branch-optim' 2018-07-18 12:20:32 -07:00
git-instaweb.sh git-instaweb: fix apache2 config with apache >= 2.4 2018-08-08 08:30:07 -07:00
git-merge-octopus.sh
git-merge-one-file.sh
git-merge-resolve.sh
git-mergetool--lib.sh
git-mergetool.sh mergetool: don't suggest to continue after last file 2018-08-13 12:11:19 -07:00
git-p4.py git-p4: add the p4-pre-submit hook 2018-08-01 13:37:18 -07:00
git-parse-remote.sh
git-quiltimport.sh
git-rebase--am.sh
git-rebase--interactive.sh Merge branch 'ag/rebase-p' 2018-06-25 13:22:39 -07:00
git-rebase--merge.sh Merge branch 'en/rebase-i-microfixes' 2018-07-18 12:20:33 -07:00
git-rebase--preserve-merges.sh git-rebase--preserve-merges: fix formatting of todo help message 2018-07-06 12:09:27 -07:00
git-rebase.sh Merge branch 'en/rebase-consistency' 2018-07-24 14:50:43 -07:00
git-remote-testgit.sh
git-request-pull.sh
git-send-email.perl Merge branch 'jm/send-email-tls-auth-on-batch' 2018-08-02 15:30:46 -07:00
git-sh-i18n.sh
git-sh-setup.sh
git-stash.sh
git-submodule.sh Merge branch 'sb/submodule-update-in-c' 2018-09-17 13:53:51 -07:00
git-svn.perl
GIT-VERSION-GEN Initial batch post 2.19 2018-09-17 14:16:29 -07:00
git-web--browse.sh
git.c Sync 'ds/multi-pack-index' to v2.19.0-rc0 2018-08-20 15:29:54 -07:00
git.rc
gpg-interface.c Merge branch 'jc/gpg-status' 2018-08-20 11:33:50 -07:00
gpg-interface.h Add missing includes and forward declarations 2018-08-15 11:52:09 -07:00
graph.c
graph.h
grep.c Merge branch 'tb/grep-only-matching' 2018-08-02 15:30:44 -07:00
grep.h Merge branch 'tb/grep-only-matching' 2018-08-02 15:30:44 -07:00
hash.h
hashmap.c
hashmap.h
help.c Merge branch 'hn/highlight-sideband-keywords' 2018-08-20 12:41:34 -07:00
help.h sideband: highlight keywords in remote sideband output 2018-08-08 15:20:09 -07:00
hex.c hex: switch to using the_hash_algo 2018-07-16 14:27:39 -07:00
http-backend.c Merge branch 'ds/multi-pack-index' 2018-09-17 13:53:50 -07:00
http-fetch.c
http-push.c Merge branch 'jk/cocci' 2018-09-17 13:53:57 -07:00
http-walker.c convert "hashcmp() != 0" to "!hasheq()" 2018-08-29 11:32:49 -07:00
http.c convert "hashcmp() != 0" to "!hasheq()" 2018-08-29 11:32:49 -07:00
http.h
ident.c
imap-send.c
INSTALL
interdiff.c interdiff: teach show_interdiff() to indent interdiff 2018-07-23 12:50:06 -07:00
interdiff.h interdiff: teach show_interdiff() to indent interdiff 2018-07-23 12:50:06 -07:00
iterator.h
json-writer.c json_writer: new routines to create JSON data 2018-07-16 13:55:39 -07:00
json-writer.h json_writer: new routines to create JSON data 2018-07-16 13:55:39 -07:00
khash.h Add missing includes and forward declarations 2018-08-15 11:52:09 -07:00
kwset.c
kwset.h
levenshtein.c
levenshtein.h
LGPL-2.1 provide a copy of the LGPLv2.1 2011-05-19 18:23:17 -07:00
line-log.c Merge branch 'sb/object-store-lookup' 2018-08-02 15:30:42 -07:00
line-log.h
line-range.c blame: prevent error if range ends past end of file 2018-06-15 10:29:13 -07:00
line-range.h line-range.h: drop extern from function declaration 2018-08-03 10:42:55 -07:00
linear-assignment.c linear-assignment: a function to solve least-cost assignment problems 2018-08-13 10:44:50 -07:00
linear-assignment.h linear-assignment: a function to solve least-cost assignment problems 2018-08-13 10:44:50 -07:00
list-objects-filter-options.c
list-objects-filter-options.h
list-objects-filter.c Merge branch 'sb/object-store-grafts' 2018-07-18 12:20:28 -07:00
list-objects-filter.h Add missing includes and forward declarations 2018-08-15 11:52:09 -07:00
list-objects.c Merge branch 'sb/object-store-lookup' 2018-08-02 15:30:42 -07:00
list-objects.h Add missing includes and forward declarations 2018-08-15 11:52:09 -07:00
list.h
ll-merge.c merge-recursive: increase marker length with depth of recursion 2018-11-08 14:23:53 +09:00
ll-merge.h merge-recursive: increase marker length with depth of recursion 2018-11-08 14:23:53 +09:00
lockfile.c
lockfile.h
log-tree.c Merge branch 'jk/cocci' 2018-09-17 13:53:57 -07:00
log-tree.h
ls-refs.c
ls-refs.h
mailinfo.c mailinfo: support format=flowed 2018-08-29 13:05:35 -07:00
mailinfo.h Merge branch 'rs/mailinfo-format-flowed' 2018-09-17 13:53:57 -07:00
mailmap.c
mailmap.h Add missing includes and forward declarations 2018-08-15 11:52:09 -07:00
Makefile Merge branch 'es/format-patch-interdiff' 2018-09-17 13:53:55 -07:00
match-trees.c convert "oidcmp() != 0" to "!oideq()" 2018-08-29 11:32:49 -07:00
mem-pool.c block alloc: add validations around cache_entry lifecyle 2018-07-03 10:58:27 -07:00
mem-pool.h block alloc: add validations around cache_entry lifecyle 2018-07-03 10:58:27 -07:00
merge-blobs.c
merge-blobs.h
merge-recursive.c merge-recursive: new function for better colliding conflict resolutions 2018-11-08 14:23:53 +09:00
merge-recursive.h Merge branch 'en/directory-renames-nothanks' 2018-09-04 14:31:38 -07:00
merge.c Merge branch 'en/dirty-merge-fixes' 2018-08-02 15:30:45 -07:00
mergesort.c
mergesort.h
midx.c packfile: add all_packs list 2018-08-20 15:31:40 -07:00
midx.h packfile: add all_packs list 2018-08-20 15:31:40 -07:00
name-hash.c trace.h: support nested performance tracing 2018-08-18 09:47:46 -07:00
notes-cache.c commit: add repository argument to lookup_commit_reference_gently 2018-06-29 10:43:39 -07:00
notes-cache.h
notes-merge.c Merge branch 'jk/cocci' 2018-09-17 13:53:57 -07:00
notes-merge.h Add missing includes and forward declarations 2018-08-15 11:52:09 -07:00
notes-utils.c commit: add repository argument to lookup_commit 2018-06-29 10:43:39 -07:00
notes-utils.h Add missing includes and forward declarations 2018-08-15 11:52:09 -07:00
notes.c convert "oidcmp() != 0" to "!oideq()" 2018-08-29 11:32:49 -07:00
notes.h Add missing includes and forward declarations 2018-08-15 11:52:09 -07:00
object-store.h packfile: add all_packs list 2018-08-20 15:31:40 -07:00
object.c convert "hashcmp() == 0" to hasheq() 2018-08-29 11:32:49 -07:00
object.h Merge branch 'ds/reachable' 2018-09-17 13:53:52 -07:00
oidmap.c convert hashmap comparison functions to oideq() 2018-08-29 11:32:49 -07:00
oidmap.h Add missing includes and forward declarations 2018-08-15 11:52:09 -07:00
oidset.c
oidset.h
pack-bitmap-write.c Merge branch 'ds/reachable' 2018-09-17 13:53:52 -07:00
pack-bitmap.c Merge branch 'jk/pack-objects-with-bitmap-fix' 2018-09-17 13:53:58 -07:00
pack-bitmap.h bitmap_has_sha1_in_uninteresting(): drop BUG check 2018-09-04 08:30:48 -07:00
pack-check.c convert "hashcmp() != 0" to "!hasheq()" 2018-08-29 11:32:49 -07:00
pack-objects.c Merge branch 'jk/cocci' 2018-09-17 13:53:57 -07:00
pack-objects.h Merge branch 'cc/delta-islands' 2018-09-17 13:53:55 -07:00
pack-revindex.c
pack-revindex.h
pack-write.c convert "hashcmp() != 0" to "!hasheq()" 2018-08-29 11:32:49 -07:00
pack.h
packfile.c Merge branch 'jk/cocci' 2018-09-17 13:53:57 -07:00
packfile.h packfile: add all_packs list 2018-08-20 15:31:40 -07:00
pager.c
parse-options-cb.c commit: add repository argument to lookup_commit_reference 2018-06-29 10:43:39 -07:00
parse-options.c Merge branch 'rs/parse-opt-lithelp' 2018-08-17 13:09:56 -07:00
parse-options.h
patch-delta.c patch-delta: handle truncated copy parameters 2018-08-30 10:30:23 -07:00
patch-ids.c convert hashmap comparison functions to oideq() 2018-08-29 11:32:49 -07:00
patch-ids.h Add missing includes and forward declarations 2018-08-15 11:52:09 -07:00
path.c Merge branch 'sb/object-store-grafts' 2018-07-18 12:20:28 -07:00
path.h Add missing includes and forward declarations 2018-08-15 11:52:09 -07:00
pathspec.c pathspec.c: use the right index instead of the_index 2018-08-13 14:14:43 -07:00
pathspec.h Add missing includes and forward declarations 2018-08-15 11:52:09 -07:00
pkt-line.c pkt-line.c: mark more strings for translation 2018-07-23 11:19:10 -07:00
pkt-line.h
preload-index.c Merge branch 'nd/unpack-trees-with-cache-tree' 2018-09-17 13:53:53 -07:00
pretty.c Merge branch 'jk/trailer-fixes' 2018-09-17 13:53:54 -07:00
pretty.h Add missing includes and forward declarations 2018-08-15 11:52:09 -07:00
prio-queue.c
prio-queue.h
progress.c
progress.h
prompt.c
prompt.h
protocol.c
protocol.h
quote.c Merge branch 'jk/sq-dequote-on-bogus-input' 2018-02-27 10:34:02 -08:00
quote.h
range-diff.c Merge branch 'es/format-patch-rangediff' 2018-09-17 13:53:56 -07:00
range-diff.h range-diff: relieve callers of low-level configuration burden 2018-08-14 14:27:04 -07:00
reachable.c tree: add repository argument to lookup_tree 2018-06-29 10:43:38 -07:00
reachable.h Add missing includes and forward declarations 2018-08-15 11:52:09 -07:00
read-cache.c Merge branch 'jk/cocci' 2018-09-17 13:53:57 -07:00
README.md
ref-filter.c Merge branch 'jk/trailer-fixes' 2018-09-17 13:53:54 -07:00
ref-filter.h
reflog-walk.c Merge branch 'nd/i18n' 2018-08-15 15:08:23 -07:00
reflog-walk.h Add missing includes and forward declarations 2018-08-15 11:52:09 -07:00
refs.c convert "oidcmp() != 0" to "!oideq()" 2018-08-29 11:32:49 -07:00
refs.h Add missing includes and forward declarations 2018-08-15 11:52:09 -07:00
refspec.c refspec.c: mark more strings for translation 2018-07-23 11:19:10 -07:00
refspec.h
RelNotes Initial batch post 2.19 2018-09-17 14:16:29 -07:00
remote-curl.c Merge branch 'js/typofixes' 2018-08-20 11:33:50 -07:00
remote-testsvn.c Merge branch 'sb/object-store-grafts' 2018-07-18 12:20:28 -07:00
remote.c Merge branch 'jk/cocci' 2018-09-17 13:53:57 -07:00
remote.h Merge branch 'ds/reachable' 2018-09-17 13:53:52 -07:00
replace-object.c Merge branch 'nd/i18n' 2018-08-15 15:08:23 -07:00
replace-object.h check_replace_refs: rename to read_replace_refs 2018-07-18 15:45:14 -07:00
repository.c Merge branch 'sb/object-store-alloc' 2018-06-25 13:22:38 -07:00
repository.h Merge branch 'en/incl-forward-decl' 2018-08-20 12:41:32 -07:00
rerere.c Merge branch 'tg/rerere' 2018-09-17 13:53:51 -07:00
rerere.h rerere.h: drop extern from function declaration 2018-08-03 10:42:55 -07:00
resolve-undo.c resolve-undo.c: use the right index instead of the_index 2018-08-13 14:14:44 -07:00
resolve-undo.h Add missing includes and forward declarations 2018-08-15 11:52:09 -07:00
revision.c Merge branch 'jk/cocci' 2018-09-17 13:53:57 -07:00
revision.h Merge branch 'es/format-patch-rangediff' 2018-09-17 13:53:56 -07:00
run-command.c
run-command.h
send-pack.c
send-pack.h Add missing includes and forward declarations 2018-08-15 11:52:09 -07:00
sequencer.c Merge branch 'jk/cocci' 2018-09-17 13:53:57 -07:00
sequencer.h Merge branch 'jk/trailer-fixes' 2018-09-17 13:53:54 -07:00
serve.c
serve.h
server-info.c treewide: use get_all_packs 2018-08-20 15:31:40 -07:00
setup.c
sh-i18n--envsubst.c
sha1-array.c convert "oidcmp() == 0" to oideq() 2018-08-29 11:32:49 -07:00
sha1-array.h
sha1-file.c convert "hashcmp() != 0" to "!hasheq()" 2018-08-29 11:32:49 -07:00
sha1-lookup.c Replace all die("BUG: ...") calls by BUG() ones 2018-05-06 19:06:13 +09:00
sha1-lookup.h
sha1-name.c Merge branch 'jk/cocci' 2018-09-17 13:53:57 -07:00
sha1dc_git.c
sha1dc_git.h
shallow.c commit.h: remove method declarations 2018-07-20 15:38:54 -07:00
shell.c
shortlog.h Add missing includes and forward declarations 2018-08-15 11:52:09 -07:00
sideband.c sideband: do not read beyond the end of input 2018-08-18 09:16:48 -07:00
sideband.h
sigchain.c
sigchain.h
split-index.c block alloc: allocate cache entries from mem_pool 2018-07-03 10:58:27 -07:00
split-index.h
strbuf.c Merge branch 'jk/size-t' 2018-08-15 15:08:25 -07:00
strbuf.h
streaming.c
streaming.h
string-list.c string-list.c: avoid conversion from void * to function pointer 2018-07-09 14:37:50 -07:00
string-list.h
sub-process.c
sub-process.h
submodule-config.c convert "oidcmp() != 0" to "!oideq()" 2018-08-29 11:32:49 -07:00
submodule-config.h submodule-config: make 'config_from_gitmodules' private 2018-06-26 12:56:12 -07:00
submodule.c Merge branch 'jk/cocci' 2018-09-17 13:53:57 -07:00
submodule.h Revert "Merge branch 'sb/submodule-core-worktree'" 2018-09-07 19:05:20 -07:00
symlinks.c
tag.c Merge branch 'jt/tags-to-promised-blobs-fix' 2018-08-02 15:30:46 -07:00
tag.h tag.c: allow deref_tag to handle arbitrary repositories 2018-06-29 10:43:40 -07:00
tar.h
tempfile.c
tempfile.h Add missing includes and forward declarations 2018-08-15 11:52:09 -07:00
thread-utils.c
thread-utils.h
tmp-objdir.c
tmp-objdir.h
trace.c trace.h: support nested performance tracing 2018-08-18 09:47:46 -07:00
trace.h trace.h: support nested performance tracing 2018-08-18 09:47:46 -07:00
trailer.c interpret-trailers: allow suppressing "---" divider 2018-08-23 10:08:51 -07:00
trailer.h Merge branch 'jk/trailer-fixes' 2018-09-17 13:53:54 -07:00
transport-helper.c Merge branch 'jt/connectivity-check-after-unshallow' 2018-08-15 15:08:28 -07:00
transport-internal.h fetch-pack: unify ref in and out param 2018-08-01 15:00:52 -07:00
transport.c convert "oidcmp() == 0" to oideq() 2018-08-29 11:32:49 -07:00
transport.h Merge branch 'jt/connectivity-check-after-unshallow' 2018-08-15 15:08:28 -07:00
tree-diff.c convert "oidcmp() != 0" to "!oideq()" 2018-08-29 11:32:49 -07:00
tree-walk.c Merge branch 'bc/object-id' 2018-08-02 15:30:39 -07:00
tree-walk.h Add missing includes and forward declarations 2018-08-15 11:52:09 -07:00
tree.c Merge branch 'jm/cache-entry-from-mem-pool' 2018-08-02 15:30:43 -07:00
tree.h tree: allow lookup_tree to handle arbitrary repositories 2018-06-29 10:43:39 -07:00
unicode-width.h unicode: update the width tables to Unicode 11 2018-07-09 14:02:51 -07:00
unimplemented.sh
unix-socket.c
unix-socket.h
unpack-trees.c Merge branch 'jk/cocci' 2018-09-17 13:53:57 -07:00
unpack-trees.h Merge branch 'nd/clone-case-smashing-warning' 2018-09-17 13:53:47 -07:00
upload-pack.c Merge branch 'ds/reachable' 2018-09-17 13:53:52 -07:00
upload-pack.h
url.c
url.h Add missing includes and forward declarations 2018-08-15 11:52:09 -07:00
urlmatch.c
urlmatch.h urlmatch.h: fix include guard 2018-08-15 11:52:09 -07:00
usage.c
userdiff.c attr: remove an implicit dependency on the_index 2018-08-13 14:14:42 -07:00
userdiff.h
utf8.c Merge branch 'jk/size-t' 2018-08-15 15:08:25 -07:00
utf8.h Merge branch 'en/incl-forward-decl' 2018-08-20 12:41:32 -07:00
varint.c
varint.h
version.c
version.h
versioncmp.c
walker.c Merge branch 'sb/object-store-grafts' 2018-07-18 12:20:28 -07:00
walker.h
wildmatch.c
wildmatch.h
worktree.c worktree: don't die() in library function find_worktree() 2018-08-30 09:28:02 -07:00
worktree.h Add missing includes and forward declarations 2018-08-15 11:52:09 -07:00
wrap-for-bin.sh Make running git under other debugger-like programs easy 2018-04-25 10:47:22 +09:00
wrapper.c
write-or-die.c
ws.c attr: remove an implicit dependency on the_index 2018-08-13 14:14:42 -07:00
wt-status.c convert "oidcmp() == 0" to oideq() 2018-08-29 11:32:49 -07:00
wt-status.h
xdiff-interface.c convert "oidcmp() == 0" to oideq() 2018-08-29 11:32:49 -07: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