Merge branch 'nd/switch-and-restore'
authorJunio C Hamano <gitster@pobox.com>
Tue, 9 Jul 2019 22:25:44 +0000 (15:25 -0700)
committerJunio C Hamano <gitster@pobox.com>
Tue, 9 Jul 2019 22:25:44 +0000 (15:25 -0700)
Two new commands "git switch" and "git restore" are introduced to
split "checking out a branch to work on advancing its history" and
"checking out paths out of the index and/or a tree-ish to work on
advancing the current history" out of the single "git checkout"
command.

* nd/switch-and-restore: (46 commits)
  completion: disable dwim on "git switch -d"
  switch: allow to switch in the middle of bisect
  t2027: use test_must_be_empty
  Declare both git-switch and git-restore experimental
  help: move git-diff and git-reset to different groups
  doc: promote "git restore"
  user-manual.txt: prefer 'merge --abort' over 'reset --hard'
  completion: support restore
  t: add tests for restore
  restore: support --patch
  restore: replace --force with --ignore-unmerged
  restore: default to --source=HEAD when only --staged is specified
  restore: reject invalid combinations with --staged
  restore: add --worktree and --staged
  checkout: factor out worktree checkout code
  restore: disable overlay mode by default
  restore: make pathspec mandatory
  restore: take tree-ish from --source option instead
  checkout: split part of it to new command 'restore'
  doc: promote "git switch"
  ...

41 files changed:
1  2 
.gitignore
Documentation/config/advice.txt
Documentation/config/branch.txt
Documentation/config/diff.txt
Documentation/git-branch.txt
Documentation/git-checkout.txt
Documentation/git-clean.txt
Documentation/git-format-patch.txt
Documentation/git-merge.txt
Documentation/git-rebase.txt
Documentation/git-rerere.txt
Documentation/git-reset.txt
Documentation/git-revert.txt
Documentation/git-stash.txt
Documentation/git.txt
Documentation/gitattributes.txt
Documentation/githooks.txt
Documentation/revisions.txt
Makefile
advice.c
branch.c
branch.h
builtin.h
builtin/am.c
builtin/checkout.c
builtin/clone.c
builtin/commit.c
builtin/rebase.c
builtin/reset.c
builtin/revert.c
contrib/completion/git-completion.bash
git-add--interactive.perl
git.c
parse-options-cb.c
parse-options.h
sequencer.c
sequencer.h
sha1-name.c
t/t7512-status-help.sh
unpack-trees.c
wt-status.c

diff --cc .gitignore
Simple merge
Simple merge
Simple merge
Simple merge
@@@ -53,14 -45,10 +53,14 @@@ argument is missing it defaults to `HEA
  branch).
  
  The command's second form creates a new branch head named <branchname>
 -which points to the current `HEAD`, or <start-point> if given.
 +which points to the current `HEAD`, or <start-point> if given. As a
 +special case, for <start-point>, you may use `"A...B"` as a shortcut for
 +the merge base of `A` and `B` if there is exactly one merge base. You
 +can leave out at most one of `A` and `B`, in which case it defaults to
 +`HEAD`.
  
  Note that this will create the new branch, but it will not switch the
- working tree to it; use "git checkout <newbranch>" to switch to the
+ working tree to it; use "git switch <newbranch>" to switch to the
  new branch.
  
  When a local branch is started off a remote-tracking branch, Git sets up the
@@@ -242,13 -255,11 +255,13 @@@ should result in deletion of the path)
  +
  When checking out paths from the index, this option lets you recreate
  the conflicted merge in the specified paths.
 ++
 +When switching branches with `--merge`, staged changes may be lost.
  
  --conflict=<style>::
-       The same as --merge option above, but changes the way the
+       The same as `--merge` option above, but changes the way the
        conflicting hunks are presented, overriding the
-       merge.conflictStyle configuration variable.  Possible values are
+       `merge.conflictStyle` configuration variable.  Possible values are
        "merge" (default) and "diff3" (in addition to what is shown by
        "merge" style, shows the original contents).
  
@@@ -312,11 -327,7 +329,11 @@@ leave out at most one of `A` and `B`, i
  
  <start_point>::
        The name of a commit at which to start the new branch; see
-       linkgit:git-branch[1] for details. Defaults to HEAD.
+       linkgit:git-branch[1] for details. Defaults to `HEAD`.
 ++
 +As a special case, you may use `"A...B"` as a shortcut for the
 +merge base of `A` and `B` if there is exactly one merge base. You can
 +leave out at most one of `A` and `B`, in which case it defaults to `HEAD`.
  
  <tree-ish>::
        Tree to checkout from (when paths are given). If not specified,
@@@ -55,15 -55,16 +55,15 @@@ OPTION
  
  -e <pattern>::
  --exclude=<pattern>::
 -      In addition to those found in .gitignore (per directory) and
 -      $GIT_DIR/info/exclude, also consider these patterns to be in the
 -      set of the ignore rules in effect.
 +      Use the given exclude pattern in addition to the standard ignore rules
 +      (see linkgit:gitignore[5]).
  
  -x::
 -      Don't use the standard ignore rules read from .gitignore (per
 -      directory) and $GIT_DIR/info/exclude, but do still use the ignore
 -      rules given with `-e` options.  This allows removing all untracked
 +      Don't use the standard ignore rules (see linkgit:gitignore[5]), but
 +      still use the ignore rules given with `-e` options from the command
 +      line.  This allows removing all untracked
        files, including build products.  This can be used (possibly in
-       conjunction with 'git reset') to create a pristine
+       conjunction with 'git restore' or 'git reset') to create a pristine
        working directory to test a clean build.
  
  -X::
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
diff --cc Makefile
Simple merge
diff --cc advice.c
Simple merge
diff --cc branch.c
+++ b/branch.c
@@@ -344,13 -348,7 +344,13 @@@ void remove_merge_branch_state(struct r
        unlink(git_path_merge_rr(r));
        unlink(git_path_merge_msg(r));
        unlink(git_path_merge_mode(r));
- void remove_branch_state(struct repository *r)
 +}
 +
-       sequencer_post_commit_cleanup(r);
++void remove_branch_state(struct repository *r, int verbose)
 +{
++      sequencer_post_commit_cleanup(r, verbose);
        unlink(git_path_squash_msg(r));
 +      remove_merge_branch_state(r);
  }
  
  void die_if_checked_out(const char *branch, int ignore_current_worktree)
diff --cc branch.h
Simple merge
diff --cc builtin.h
+++ b/builtin.h
@@@ -123,131 -123,133 +123,133 @@@ int fmt_merge_msg(struct strbuf *in, st
   * You should most likely use a default of 0 or 1. "Punt" (-1) could be useful
   * to be able to fall back to some historical compatibility name.
   */
 -extern void setup_auto_pager(const char *cmd, int def);
 +void setup_auto_pager(const char *cmd, int def);
  
 -extern int is_builtin(const char *s);
 +int is_builtin(const char *s);
  
 -extern int cmd_add(int argc, const char **argv, const char *prefix);
 -extern int cmd_am(int argc, const char **argv, const char *prefix);
 -extern int cmd_annotate(int argc, const char **argv, const char *prefix);
 -extern int cmd_apply(int argc, const char **argv, const char *prefix);
 -extern int cmd_archive(int argc, const char **argv, const char *prefix);
 -extern int cmd_bisect__helper(int argc, const char **argv, const char *prefix);
 -extern int cmd_blame(int argc, const char **argv, const char *prefix);
 -extern int cmd_branch(int argc, const char **argv, const char *prefix);
 -extern int cmd_bundle(int argc, const char **argv, const char *prefix);
 -extern int cmd_cat_file(int argc, const char **argv, const char *prefix);
 -extern int cmd_checkout(int argc, const char **argv, const char *prefix);
 -extern int cmd_checkout_index(int argc, const char **argv, const char *prefix);
 -extern int cmd_check_attr(int argc, const char **argv, const char *prefix);
 -extern int cmd_check_ignore(int argc, const char **argv, const char *prefix);
 -extern int cmd_check_mailmap(int argc, const char **argv, const char *prefix);
 -extern int cmd_check_ref_format(int argc, const char **argv, const char *prefix);
 -extern int cmd_cherry(int argc, const char **argv, const char *prefix);
 -extern int cmd_cherry_pick(int argc, const char **argv, const char *prefix);
 -extern int cmd_clone(int argc, const char **argv, const char *prefix);
 -extern int cmd_clean(int argc, const char **argv, const char *prefix);
 -extern int cmd_column(int argc, const char **argv, const char *prefix);
 -extern int cmd_commit(int argc, const char **argv, const char *prefix);
 -extern int cmd_commit_graph(int argc, const char **argv, const char *prefix);
 -extern int cmd_commit_tree(int argc, const char **argv, const char *prefix);
 -extern int cmd_config(int argc, const char **argv, const char *prefix);
 -extern int cmd_count_objects(int argc, const char **argv, const char *prefix);
 -extern int cmd_credential(int argc, const char **argv, const char *prefix);
 -extern int cmd_describe(int argc, const char **argv, const char *prefix);
 -extern int cmd_diff_files(int argc, const char **argv, const char *prefix);
 -extern int cmd_diff_index(int argc, const char **argv, const char *prefix);
 -extern int cmd_diff(int argc, const char **argv, const char *prefix);
 -extern int cmd_diff_tree(int argc, const char **argv, const char *prefix);
 -extern int cmd_difftool(int argc, const char **argv, const char *prefix);
 -extern int cmd_fast_export(int argc, const char **argv, const char *prefix);
 -extern int cmd_fetch(int argc, const char **argv, const char *prefix);
 -extern int cmd_fetch_pack(int argc, const char **argv, const char *prefix);
 -extern int cmd_fmt_merge_msg(int argc, const char **argv, const char *prefix);
 -extern int cmd_for_each_ref(int argc, const char **argv, const char *prefix);
 -extern int cmd_format_patch(int argc, const char **argv, const char *prefix);
 -extern int cmd_fsck(int argc, const char **argv, const char *prefix);
 -extern int cmd_gc(int argc, const char **argv, const char *prefix);
 -extern int cmd_get_tar_commit_id(int argc, const char **argv, const char *prefix);
 -extern int cmd_grep(int argc, const char **argv, const char *prefix);
 -extern int cmd_hash_object(int argc, const char **argv, const char *prefix);
 -extern int cmd_help(int argc, const char **argv, const char *prefix);
 -extern int cmd_index_pack(int argc, const char **argv, const char *prefix);
 -extern int cmd_init_db(int argc, const char **argv, const char *prefix);
 -extern int cmd_interpret_trailers(int argc, const char **argv, const char *prefix);
 -extern int cmd_log(int argc, const char **argv, const char *prefix);
 -extern int cmd_log_reflog(int argc, const char **argv, const char *prefix);
 -extern int cmd_ls_files(int argc, const char **argv, const char *prefix);
 -extern int cmd_ls_tree(int argc, const char **argv, const char *prefix);
 -extern int cmd_ls_remote(int argc, const char **argv, const char *prefix);
 -extern int cmd_mailinfo(int argc, const char **argv, const char *prefix);
 -extern int cmd_mailsplit(int argc, const char **argv, const char *prefix);
 -extern int cmd_merge(int argc, const char **argv, const char *prefix);
 -extern int cmd_merge_base(int argc, const char **argv, const char *prefix);
 -extern int cmd_merge_index(int argc, const char **argv, const char *prefix);
 -extern int cmd_merge_ours(int argc, const char **argv, const char *prefix);
 -extern int cmd_merge_file(int argc, const char **argv, const char *prefix);
 -extern int cmd_merge_recursive(int argc, const char **argv, const char *prefix);
 -extern int cmd_merge_tree(int argc, const char **argv, const char *prefix);
 -extern int cmd_mktag(int argc, const char **argv, const char *prefix);
 -extern int cmd_mktree(int argc, const char **argv, const char *prefix);
 -extern int cmd_multi_pack_index(int argc, const char **argv, const char *prefix);
 -extern int cmd_mv(int argc, const char **argv, const char *prefix);
 -extern int cmd_name_rev(int argc, const char **argv, const char *prefix);
 -extern int cmd_notes(int argc, const char **argv, const char *prefix);
 -extern int cmd_pack_objects(int argc, const char **argv, const char *prefix);
 -extern int cmd_pack_redundant(int argc, const char **argv, const char *prefix);
 -extern int cmd_patch_id(int argc, const char **argv, const char *prefix);
 -extern int cmd_prune(int argc, const char **argv, const char *prefix);
 -extern int cmd_prune_packed(int argc, const char **argv, const char *prefix);
 -extern int cmd_pull(int argc, const char **argv, const char *prefix);
 -extern int cmd_push(int argc, const char **argv, const char *prefix);
 -extern int cmd_range_diff(int argc, const char **argv, const char *prefix);
 -extern int cmd_read_tree(int argc, const char **argv, const char *prefix);
 -extern int cmd_rebase(int argc, const char **argv, const char *prefix);
 -extern int cmd_rebase__interactive(int argc, const char **argv, const char *prefix);
 -extern int cmd_receive_pack(int argc, const char **argv, const char *prefix);
 -extern int cmd_reflog(int argc, const char **argv, const char *prefix);
 -extern int cmd_remote(int argc, const char **argv, const char *prefix);
 -extern int cmd_remote_ext(int argc, const char **argv, const char *prefix);
 -extern int cmd_remote_fd(int argc, const char **argv, const char *prefix);
 -extern int cmd_repack(int argc, const char **argv, const char *prefix);
 -extern int cmd_rerere(int argc, const char **argv, const char *prefix);
 -extern int cmd_reset(int argc, const char **argv, const char *prefix);
 -extern int cmd_restore(int argc, const char **argv, const char *prefix);
 -extern int cmd_rev_list(int argc, const char **argv, const char *prefix);
 -extern int cmd_rev_parse(int argc, const char **argv, const char *prefix);
 -extern int cmd_revert(int argc, const char **argv, const char *prefix);
 -extern int cmd_rm(int argc, const char **argv, const char *prefix);
 -extern int cmd_send_pack(int argc, const char **argv, const char *prefix);
 -extern int cmd_serve(int argc, const char **argv, const char *prefix);
 -extern int cmd_shortlog(int argc, const char **argv, const char *prefix);
 -extern int cmd_show(int argc, const char **argv, const char *prefix);
 -extern int cmd_show_branch(int argc, const char **argv, const char *prefix);
 -extern int cmd_show_index(int argc, const char **argv, const char *prefix);
 -extern int cmd_status(int argc, const char **argv, const char *prefix);
 -extern int cmd_stripspace(int argc, const char **argv, const char *prefix);
 -extern int cmd_submodule__helper(int argc, const char **argv, const char *prefix);
 -extern int cmd_switch(int argc, const char **argv, const char *prefix);
 -extern int cmd_symbolic_ref(int argc, const char **argv, const char *prefix);
 -extern int cmd_tag(int argc, const char **argv, const char *prefix);
 -extern int cmd_tar_tree(int argc, const char **argv, const char *prefix);
 -extern int cmd_unpack_file(int argc, const char **argv, const char *prefix);
 -extern int cmd_unpack_objects(int argc, const char **argv, const char *prefix);
 -extern int cmd_update_index(int argc, const char **argv, const char *prefix);
 -extern int cmd_update_ref(int argc, const char **argv, const char *prefix);
 -extern int cmd_update_server_info(int argc, const char **argv, const char *prefix);
 -extern int cmd_upload_archive(int argc, const char **argv, const char *prefix);
 -extern int cmd_upload_archive_writer(int argc, const char **argv, const char *prefix);
 -extern int cmd_upload_pack(int argc, const char **argv, const char *prefix);
 -extern int cmd_var(int argc, const char **argv, const char *prefix);
 -extern int cmd_verify_commit(int argc, const char **argv, const char *prefix);
 -extern int cmd_verify_tag(int argc, const char **argv, const char *prefix);
 -extern int cmd_version(int argc, const char **argv, const char *prefix);
 -extern int cmd_whatchanged(int argc, const char **argv, const char *prefix);
 -extern int cmd_worktree(int argc, const char **argv, const char *prefix);
 -extern int cmd_write_tree(int argc, const char **argv, const char *prefix);
 -extern int cmd_verify_pack(int argc, const char **argv, const char *prefix);
 -extern int cmd_show_ref(int argc, const char **argv, const char *prefix);
 -extern int cmd_pack_refs(int argc, const char **argv, const char *prefix);
 -extern int cmd_replace(int argc, const char **argv, const char *prefix);
 +int cmd_add(int argc, const char **argv, const char *prefix);
 +int cmd_am(int argc, const char **argv, const char *prefix);
 +int cmd_annotate(int argc, const char **argv, const char *prefix);
 +int cmd_apply(int argc, const char **argv, const char *prefix);
 +int cmd_archive(int argc, const char **argv, const char *prefix);
 +int cmd_bisect__helper(int argc, const char **argv, const char *prefix);
 +int cmd_blame(int argc, const char **argv, const char *prefix);
 +int cmd_branch(int argc, const char **argv, const char *prefix);
 +int cmd_bundle(int argc, const char **argv, const char *prefix);
 +int cmd_cat_file(int argc, const char **argv, const char *prefix);
 +int cmd_checkout(int argc, const char **argv, const char *prefix);
 +int cmd_checkout_index(int argc, const char **argv, const char *prefix);
 +int cmd_check_attr(int argc, const char **argv, const char *prefix);
 +int cmd_check_ignore(int argc, const char **argv, const char *prefix);
 +int cmd_check_mailmap(int argc, const char **argv, const char *prefix);
 +int cmd_check_ref_format(int argc, const char **argv, const char *prefix);
 +int cmd_cherry(int argc, const char **argv, const char *prefix);
 +int cmd_cherry_pick(int argc, const char **argv, const char *prefix);
 +int cmd_clone(int argc, const char **argv, const char *prefix);
 +int cmd_clean(int argc, const char **argv, const char *prefix);
 +int cmd_column(int argc, const char **argv, const char *prefix);
 +int cmd_commit(int argc, const char **argv, const char *prefix);
 +int cmd_commit_graph(int argc, const char **argv, const char *prefix);
 +int cmd_commit_tree(int argc, const char **argv, const char *prefix);
 +int cmd_config(int argc, const char **argv, const char *prefix);
 +int cmd_count_objects(int argc, const char **argv, const char *prefix);
 +int cmd_credential(int argc, const char **argv, const char *prefix);
 +int cmd_describe(int argc, const char **argv, const char *prefix);
 +int cmd_diff_files(int argc, const char **argv, const char *prefix);
 +int cmd_diff_index(int argc, const char **argv, const char *prefix);
 +int cmd_diff(int argc, const char **argv, const char *prefix);
 +int cmd_diff_tree(int argc, const char **argv, const char *prefix);
 +int cmd_difftool(int argc, const char **argv, const char *prefix);
 +int cmd_fast_export(int argc, const char **argv, const char *prefix);
 +int cmd_fetch(int argc, const char **argv, const char *prefix);
 +int cmd_fetch_pack(int argc, const char **argv, const char *prefix);
 +int cmd_fmt_merge_msg(int argc, const char **argv, const char *prefix);
 +int cmd_for_each_ref(int argc, const char **argv, const char *prefix);
 +int cmd_format_patch(int argc, const char **argv, const char *prefix);
 +int cmd_fsck(int argc, const char **argv, const char *prefix);
 +int cmd_gc(int argc, const char **argv, const char *prefix);
 +int cmd_get_tar_commit_id(int argc, const char **argv, const char *prefix);
 +int cmd_grep(int argc, const char **argv, const char *prefix);
 +int cmd_hash_object(int argc, const char **argv, const char *prefix);
 +int cmd_help(int argc, const char **argv, const char *prefix);
 +int cmd_index_pack(int argc, const char **argv, const char *prefix);
 +int cmd_init_db(int argc, const char **argv, const char *prefix);
 +int cmd_interpret_trailers(int argc, const char **argv, const char *prefix);
 +int cmd_log(int argc, const char **argv, const char *prefix);
 +int cmd_log_reflog(int argc, const char **argv, const char *prefix);
 +int cmd_ls_files(int argc, const char **argv, const char *prefix);
 +int cmd_ls_tree(int argc, const char **argv, const char *prefix);
 +int cmd_ls_remote(int argc, const char **argv, const char *prefix);
 +int cmd_mailinfo(int argc, const char **argv, const char *prefix);
 +int cmd_mailsplit(int argc, const char **argv, const char *prefix);
 +int cmd_merge(int argc, const char **argv, const char *prefix);
 +int cmd_merge_base(int argc, const char **argv, const char *prefix);
 +int cmd_merge_index(int argc, const char **argv, const char *prefix);
 +int cmd_merge_ours(int argc, const char **argv, const char *prefix);
 +int cmd_merge_file(int argc, const char **argv, const char *prefix);
 +int cmd_merge_recursive(int argc, const char **argv, const char *prefix);
 +int cmd_merge_tree(int argc, const char **argv, const char *prefix);
 +int cmd_mktag(int argc, const char **argv, const char *prefix);
 +int cmd_mktree(int argc, const char **argv, const char *prefix);
 +int cmd_multi_pack_index(int argc, const char **argv, const char *prefix);
 +int cmd_mv(int argc, const char **argv, const char *prefix);
 +int cmd_name_rev(int argc, const char **argv, const char *prefix);
 +int cmd_notes(int argc, const char **argv, const char *prefix);
 +int cmd_pack_objects(int argc, const char **argv, const char *prefix);
 +int cmd_pack_redundant(int argc, const char **argv, const char *prefix);
 +int cmd_patch_id(int argc, const char **argv, const char *prefix);
 +int cmd_prune(int argc, const char **argv, const char *prefix);
 +int cmd_prune_packed(int argc, const char **argv, const char *prefix);
 +int cmd_pull(int argc, const char **argv, const char *prefix);
 +int cmd_push(int argc, const char **argv, const char *prefix);
 +int cmd_range_diff(int argc, const char **argv, const char *prefix);
 +int cmd_read_tree(int argc, const char **argv, const char *prefix);
 +int cmd_rebase(int argc, const char **argv, const char *prefix);
 +int cmd_rebase__interactive(int argc, const char **argv, const char *prefix);
 +int cmd_receive_pack(int argc, const char **argv, const char *prefix);
 +int cmd_reflog(int argc, const char **argv, const char *prefix);
 +int cmd_remote(int argc, const char **argv, const char *prefix);
 +int cmd_remote_ext(int argc, const char **argv, const char *prefix);
 +int cmd_remote_fd(int argc, const char **argv, const char *prefix);
 +int cmd_repack(int argc, const char **argv, const char *prefix);
 +int cmd_rerere(int argc, const char **argv, const char *prefix);
 +int cmd_reset(int argc, const char **argv, const char *prefix);
++int cmd_restore(int argc, const char **argv, const char *prefix);
 +int cmd_rev_list(int argc, const char **argv, const char *prefix);
 +int cmd_rev_parse(int argc, const char **argv, const char *prefix);
 +int cmd_revert(int argc, const char **argv, const char *prefix);
 +int cmd_rm(int argc, const char **argv, const char *prefix);
 +int cmd_send_pack(int argc, const char **argv, const char *prefix);
 +int cmd_shortlog(int argc, const char **argv, const char *prefix);
 +int cmd_show(int argc, const char **argv, const char *prefix);
 +int cmd_show_branch(int argc, const char **argv, const char *prefix);
 +int cmd_show_index(int argc, const char **argv, const char *prefix);
 +int cmd_status(int argc, const char **argv, const char *prefix);
 +int cmd_stash(int argc, const char **argv, const char *prefix);
 +int cmd_stripspace(int argc, const char **argv, const char *prefix);
 +int cmd_submodule__helper(int argc, const char **argv, const char *prefix);
++int cmd_switch(int argc, const char **argv, const char *prefix);
 +int cmd_symbolic_ref(int argc, const char **argv, const char *prefix);
 +int cmd_tag(int argc, const char **argv, const char *prefix);
 +int cmd_tar_tree(int argc, const char **argv, const char *prefix);
 +int cmd_unpack_file(int argc, const char **argv, const char *prefix);
 +int cmd_unpack_objects(int argc, const char **argv, const char *prefix);
 +int cmd_update_index(int argc, const char **argv, const char *prefix);
 +int cmd_update_ref(int argc, const char **argv, const char *prefix);
 +int cmd_update_server_info(int argc, const char **argv, const char *prefix);
 +int cmd_upload_archive(int argc, const char **argv, const char *prefix);
 +int cmd_upload_archive_writer(int argc, const char **argv, const char *prefix);
 +int cmd_upload_pack(int argc, const char **argv, const char *prefix);
 +int cmd_var(int argc, const char **argv, const char *prefix);
 +int cmd_verify_commit(int argc, const char **argv, const char *prefix);
 +int cmd_verify_tag(int argc, const char **argv, const char *prefix);
 +int cmd_version(int argc, const char **argv, const char *prefix);
 +int cmd_whatchanged(int argc, const char **argv, const char *prefix);
 +int cmd_worktree(int argc, const char **argv, const char *prefix);
 +int cmd_write_tree(int argc, const char **argv, const char *prefix);
 +int cmd_verify_pack(int argc, const char **argv, const char *prefix);
 +int cmd_show_ref(int argc, const char **argv, const char *prefix);
 +int cmd_pack_refs(int argc, const char **argv, const char *prefix);
 +int cmd_replace(int argc, const char **argv, const char *prefix);
  
  #endif
diff --cc builtin/am.c
Simple merge
@@@ -786,9 -755,9 +771,9 @@@ static int merge_working_tree(const str
                        o.branch1 = new_branch_info->name;
                        o.branch2 = "local";
                        ret = merge_trees(&o,
-                                         get_commit_tree(new_branch_info->commit),
+                                         new_tree,
                                          work,
 -                                        get_commit_tree(old_branch_info->commit),
 +                                        old_tree,
                                          &result);
                        if (ret < 0)
                                exit(128);
diff --cc builtin/clone.c
Simple merge
@@@ -1658,7 -1666,8 +1658,7 @@@ int cmd_commit(int argc, const char **a
                die("%s", err.buf);
        }
  
-       sequencer_post_commit_cleanup(the_repository);
 -      unlink(git_path_cherry_pick_head(the_repository));
 -      unlink(git_path_revert_head(the_repository));
++      sequencer_post_commit_cleanup(the_repository, 0);
        unlink(git_path_merge_head(the_repository));
        unlink(git_path_merge_msg(the_repository));
        unlink(git_path_merge_mode(the_repository));
        if (commit_index_files())
                die(_("repository has been updated, but unable to write\n"
                      "new_index file. Check that disk is not full and quota is\n"
-                     "not exceeded, and then \"git reset HEAD\" to recover."));
+                     "not exceeded, and then \"git restore --staged :/\" to recover."));
  
 -      if (git_env_bool(GIT_TEST_COMMIT_GRAPH, 0))
 -              write_commit_graph_reachable(get_object_directory(), 0, 0);
 +      if (git_env_bool(GIT_TEST_COMMIT_GRAPH, 0) &&
 +          write_commit_graph_reachable(get_object_directory(), 0))
 +              return 1;
  
        repo_rerere(the_repository, 0);
        run_command_v_opt(argv_gc_auto, RUN_GIT_CMD);
@@@ -1630,8 -1292,8 +1630,8 @@@ int cmd_rebase(int argc, const char **a
                               NULL, NULL) < 0)
                        die(_("could not move back to %s"),
                            oid_to_hex(&options.orig_head));
-               remove_branch_state(the_repository);
+               remove_branch_state(the_repository, 0);
 -              ret = finish_rebase(&options);
 +              ret = !!finish_rebase(&options);
                goto cleanup;
        }
        case ACTION_QUIT: {
diff --cc builtin/reset.c
Simple merge
Simple merge
Simple merge
diff --cc git.c
Simple merge
Simple merge
diff --cc parse-options.h
Simple merge
diff --cc sequencer.c
@@@ -2289,57 -2221,6 +2289,59 @@@ static ssize_t strbuf_read_file_or_whin
        return len;
  }
  
- void sequencer_post_commit_cleanup(struct repository *r)
 +static int have_finished_the_last_pick(void)
 +{
 +      struct strbuf buf = STRBUF_INIT;
 +      const char *eol;
 +      const char *todo_path = git_path_todo_file();
 +      int ret = 0;
 +
 +      if (strbuf_read_file(&buf, todo_path, 0) < 0) {
 +              if (errno == ENOENT) {
 +                      return 0;
 +              } else {
 +                      error_errno("unable to open '%s'", todo_path);
 +                      return 0;
 +              }
 +      }
 +      /* If there is only one line then we are done */
 +      eol = strchr(buf.buf, '\n');
 +      if (!eol || !eol[1])
 +              ret = 1;
 +
 +      strbuf_release(&buf);
 +
 +      return ret;
 +}
 +
-               unlink(git_path_cherry_pick_head(r));
++void sequencer_post_commit_cleanup(struct repository *r, int verbose)
 +{
 +      struct replay_opts opts = REPLAY_OPTS_INIT;
 +      int need_cleanup = 0;
 +
 +      if (file_exists(git_path_cherry_pick_head(r))) {
-               unlink(git_path_revert_head(r));
++              if (!unlink(git_path_cherry_pick_head(r)) && verbose)
++                      warning(_("cancelling a cherry picking in progress"));
 +              opts.action = REPLAY_PICK;
 +              need_cleanup = 1;
 +      }
 +
 +      if (file_exists(git_path_revert_head(r))) {
++              if (!unlink(git_path_revert_head(r)) && verbose)
++                      warning(_("cancelling a revert in progress"));
 +              opts.action = REPLAY_REVERT;
 +              need_cleanup = 1;
 +      }
 +
 +      if (!need_cleanup)
 +              return;
 +
 +      if (!have_finished_the_last_pick())
 +              return;
 +
 +      sequencer_remove_state(&opts);
 +}
 +
  static int read_populate_todo(struct repository *r,
                              struct todo_list *todo_list,
                              struct replay_opts *opts)
diff --cc sequencer.h
@@@ -199,7 -143,4 +199,7 @@@ int read_author_script(const char *path
  
  void parse_strategy_opts(struct replay_opts *opts, char *raw_opts);
  int write_basic_state(struct replay_opts *opts, const char *head_name,
 -                    const char *onto, const char *orig_head);
 +                    struct commit *onto, const char *orig_head);
- void sequencer_post_commit_cleanup(struct repository *r);
++void sequencer_post_commit_cleanup(struct repository *r, int verbose);
 +int sequencer_get_last_command(struct repository* r,
 +                             enum replay_action *action);
diff --cc sha1-name.c
Simple merge
Simple merge
diff --cc unpack-trees.c
Simple merge
diff --cc wt-status.c
Simple merge