git-commit-vandalism/builtin
Nguyễn Thái Ngọc Duy 6eff409e8a checkout: prevent losing staged changes with --merge
When --merge is specified, we may need to do a real merge (instead of
three-way tree unpacking), the steps are best seen in git-checkout.sh
version before it's removed:

    # Match the index to the working tree, and do a three-way.
    git diff-files --name-only | git update-index --remove --stdin &&
    work=`git write-tree` &&
    git read-tree $v --reset -u $new || exit

    git merge-recursive $old -- $new $work

    # Do not register the cleanly merged paths in the index yet.
    # this is not a real merge before committing, but just carrying
    # the working tree changes along.
    unmerged=`git ls-files -u`
    git read-tree $v --reset $new
    case "$unmerged" in
    '')     ;;
    *)
            (
                    z40=0000000000000000000000000000000000000000
                    echo "$unmerged" |
                    sed -e 's/^[0-7]* [0-9a-f]* /'"0 $z40 /"
                    echo "$unmerged"
            ) | git update-index --index-info
            ;;
    esac

Notice the last 'read-tree --reset' step. We restore worktree back to
'new' tree after worktree's messed up by merge-recursive. If there are
staged changes before this whole command sequence is executed, they
are lost because they are unlikely part of the 'new' tree to be
restored.

There is no easy way to fix this. Elijah may have something up his
sleeves [1], but until then, check if there are staged changes and
refuse to run and lose them. The user would need to do "git reset" to
continue in this case.

A note about the test update. 'checkout -m' in that test will fail
because a deletion is staged. This 'checkout -m' was previously needed
to verify quietness behavior of unpack-trees. But a different check
has been put in place in the last patch. We can safely drop
'checkout -m' now.

[1] CABPp-BFoL_U=bzON4SEMaQSKU2TKwnOgNqjt5MUaOejTKGUJxw@mail.gmail.com

Reported-by: Phillip Wood <phillip.wood@dunelm.org.uk>
Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2019-03-24 21:35:34 +09:00
..
add.c Merge branch 'nd/the-index-final' 2019-02-06 22:05:23 -08:00
am.c Merge branch 'nd/completion-more-parameters' 2019-03-07 09:59:58 +09:00
annotate.c
apply.c
archive.c pack-protocol.txt: accept error packets in any context 2019-01-02 13:05:30 -08:00
bisect--helper.c Fix typos in translatable strings for v2.21.0 2019-02-11 12:58:06 -08:00
blame.c Merge branch 'nd/diff-parseopt' 2019-03-07 09:59:52 +09:00
branch.c Merge branch 'du/branch-show-current' 2019-03-07 09:59:54 +09:00
bundle.c create_bundle(): drop unused "header" parameter 2019-01-24 12:35:44 -08:00
cat-file.c Merge branch 'jk/loose-object-cache-oid' 2019-02-06 22:05:27 -08:00
check-attr.c cache.h: flip NO_THE_INDEX_COMPATIBILITY_MACROS switch 2019-01-24 11:55:06 -08:00
check-ignore.c cache.h: flip NO_THE_INDEX_COMPATIBILITY_MACROS switch 2019-01-24 11:55:06 -08:00
check-mailmap.c
check-ref-format.c
checkout-index.c Merge branch 'nd/the-index-final' 2019-02-06 22:05:23 -08:00
checkout.c checkout: prevent losing staged changes with --merge 2019-03-24 21:35:34 +09:00
clean.c cache.h: flip NO_THE_INDEX_COMPATIBILITY_MACROS switch 2019-01-24 11:55:06 -08:00
clone.c Merge branch 'nd/the-index-final' 2019-02-06 22:05:23 -08:00
column.c
commit-graph.c commit-graph: rename "large edges" to "extra edges" 2019-01-22 11:33:46 -08:00
commit-tree.c commit-tree: utilize parse-options api 2019-03-08 10:31:24 +09:00
commit.c Merge branch 'nd/completion-more-parameters' 2019-03-07 09:59:58 +09:00
config.c Merge branch 'jk/save-getenv-result' 2019-01-29 12:47:54 -08:00
count-objects.c rename "alternate_object_database" to "object_directory" 2018-11-13 14:22:02 +09:00
credential.c
describe.c Merge branch 'ss/describe-dirty-in-the-right-directory' 2019-02-06 22:05:29 -08:00
diff-files.c cache.h: flip NO_THE_INDEX_COMPATIBILITY_MACROS switch 2019-01-24 11:55:06 -08:00
diff-index.c cache.h: flip NO_THE_INDEX_COMPATIBILITY_MACROS switch 2019-01-24 11:55:06 -08:00
diff-tree.c Merge branch 'en/combined-all-paths' 2019-03-07 09:59:54 +09:00
diff.c Merge branch 'jk/diff-no-index-initialize' 2019-03-07 09:59:59 +09:00
difftool.c Merge branch 'nd/the-index-final' 2019-02-06 22:05:23 -08:00
fast-export.c Merge branch 'en/fast-export-import' 2019-01-04 13:33:33 -08:00
fetch-pack.c Merge branch 'jt/fetch-v2-sideband' 2019-02-05 14:26:11 -08:00
fetch.c Merge branch 'jk/no-sigpipe-during-network-transport' 2019-03-20 15:16:06 +09:00
fmt-merge-msg.c
for-each-ref.c
fsck.c Merge branch 'jk/fsck-doc' 2019-03-20 15:16:06 +09:00
gc.c Merge branch 'js/gc-repack-close-before-remove' 2019-01-18 13:49:57 -08:00
get-tar-commit-id.c
grep.c Merge branch 'nd/the-index-final' 2019-02-06 22:05:23 -08:00
hash-object.c cache.h: flip NO_THE_INDEX_COMPATIBILITY_MACROS switch 2019-01-24 11:55:06 -08:00
help.c completion: add more parameter value completion 2019-02-20 12:31:56 -08:00
index-pack.c convert has_sha1_file() callers to has_object_file() 2019-01-08 09:41:06 -08:00
init-db.c Merge branch 'ma/clear-repository-format' 2019-03-20 15:16:07 +09:00
interpret-trailers.c
log.c completion: add more parameter value completion 2019-02-20 12:31:56 -08:00
ls-files.c Merge branch 'nd/the-index-final' 2019-02-06 22:05:23 -08:00
ls-remote.c Merge branch 'jk/proto-v2-ref-prefix-fix' 2018-11-13 22:37:17 +09:00
ls-tree.c Merge branch 'nd/attr-pathspec-in-tree-walk' 2019-01-14 15:29:28 -08:00
mailinfo.c
mailsplit.c
merge-base.c
merge-file.c
merge-index.c cache.h: flip NO_THE_INDEX_COMPATIBILITY_MACROS switch 2019-01-24 11:55:06 -08:00
merge-ours.c cache.h: flip NO_THE_INDEX_COMPATIBILITY_MACROS switch 2019-01-24 11:55:06 -08:00
merge-recursive.c Merge branch 'nd/the-index-final' 2019-02-06 22:05:23 -08:00
merge-tree.c Merge branch 'nd/the-index-final' 2019-02-06 22:05:23 -08:00
merge.c Merge branch 'nd/diff-parseopt' 2019-03-07 09:59:52 +09:00
mktag.c
mktree.c
multi-pack-index.c
mv.c cache.h: flip NO_THE_INDEX_COMPATIBILITY_MACROS switch 2019-01-24 11:55:06 -08:00
name-rev.c
notes.c Merge branch 'nd/the-index' into md/list-objects-filter-by-depth 2019-01-15 15:38:29 -08:00
pack-objects.c trace2:data: pack-objects: add trace2 regions 2019-02-22 15:28:21 -08:00
pack-redundant.c Merge branch 'sc/pack-redundant' 2019-03-07 09:59:54 +09:00
pack-refs.c
patch-id.c
prune-packed.c Merge branch 'rj/prune-packed-excess-args' 2019-03-07 09:59:55 +09:00
prune.c prune: check SEEN flag for reachability 2019-02-14 15:25:33 -08:00
pull.c completion: add more parameter value completion 2019-02-20 12:31:56 -08:00
push.c Merge branch 'nd/style-opening-brace' 2019-01-18 13:49:52 -08:00
range-diff.c
read-tree.c read-tree: add --quiet 2019-03-24 21:35:34 +09:00
rebase--interactive.c Merge branch 'nd/the-index-final' 2019-02-06 22:05:23 -08:00
rebase.c Merge branch 'js/rebase-orig-head-fix' 2019-03-20 15:16:05 +09:00
receive-pack.c Merge branch 'ab/receive-pack-use-after-free-fix' 2019-03-07 09:59:57 +09:00
reflog.c Merge branch 'jk/loose-object-cache-oid' 2019-02-06 22:05:27 -08:00
remote-ext.c
remote-fd.c
remote.c
repack.c Merge branch 'js/gc-repack-close-before-remove' 2019-01-18 13:49:57 -08:00
replace.c completion: add more parameter value completion 2019-02-20 12:31:56 -08:00
rerere.c Merge branch 'nd/the-index' into md/list-objects-filter-by-depth 2019-01-15 15:38:29 -08:00
reset.c trace2:data: add subverb to reset command 2019-02-22 15:28:21 -08:00
rev-list.c Merge branch 'jk/virtual-objects-do-exist' 2019-03-20 15:16:07 +09:00
rev-parse.c cache.h: flip NO_THE_INDEX_COMPATIBILITY_MACROS switch 2019-01-24 11:55:06 -08:00
revert.c Merge branch 'nd/the-index' 2019-01-04 13:33:33 -08:00
rm.c cache.h: flip NO_THE_INDEX_COMPATIBILITY_MACROS switch 2019-01-24 11:55:06 -08:00
send-pack.c pack-protocol.txt: accept error packets in any context 2019-01-02 13:05:30 -08:00
serve.c
shortlog.c Merge branch 'nd/show-gitcomp-compilation-fix' into maint 2018-12-15 12:24:33 +09:00
show-branch.c
show-index.c
show-ref.c convert has_sha1_file() callers to has_object_file() 2019-01-08 09:41:06 -08:00
stripspace.c stripspace: allow -s/-c outside git repository 2018-12-26 15:41:47 -08:00
submodule--helper.c trace2: create new combined trace facility 2019-02-22 15:27:59 -08:00
symbolic-ref.c
tag.c
unpack-file.c
unpack-objects.c
update-index.c Merge branch 'nd/diff-parseopt' 2019-03-07 09:59:52 +09:00
update-ref.c
update-server-info.c
upload-archive.c
upload-pack.c
var.c
verify-commit.c
verify-pack.c
verify-tag.c
worktree.c trace2:data: add trace2 hook classification 2019-02-22 15:28:21 -08:00
write-tree.c cache.h: flip NO_THE_INDEX_COMPATIBILITY_MACROS switch 2019-01-24 11:55:06 -08:00