cherry-pick: add --empty
for more robust redundant commit handling
As with git-rebase(1) and git-am(1), git-cherry-pick(1) can result in a commit being made redundant if the content from the picked commit is already present in the target history. However, git-cherry-pick(1) does not have the same options available that git-rebase(1) and git-am(1) have. There are three things that can be done with these redundant commits: drop them, keep them, or have the cherry-pick stop and wait for the user to take an action. git-rebase(1) has the `--empty` option added in commite98c4269c8
(rebase (interactive-backend): fix handling of commits that become empty, 2020-02-15), which handles all three of these scenarios. Similarly, git-am(1) got its own `--empty` in7c096b8d61
(am: support --empty=<option> to handle empty patches, 2021-12-09). git-cherry-pick(1), on the other hand, only supports two of the three possiblities: Keep the redundant commits via `--keep-redundant-commits`, or have the cherry-pick fail by not specifying that option. There is no way to automatically drop redundant commits. In order to bring git-cherry-pick(1) more in-line with git-rebase(1) and git-am(1), this commit adds an `--empty` option to git-cherry-pick(1). It has the same three options (keep, drop, and stop), and largely behaves the same. The notable difference is that for git-cherry-pick(1), the default will be `stop`, which maintains the current behavior when the option is not specified. Like the existing `--keep-redundant-commits`, `--empty=keep` will imply `--allow-empty`. The `--keep-redundant-commits` option will be documented as a deprecated synonym of `--empty=keep`, and will be supported for backwards compatibility for the time being. Signed-off-by: Brian Lyles <brianmlyles@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:

committed by
Junio C Hamano

parent
bd2f9fd025
commit
ec79d763de
@ -2932,6 +2932,9 @@ static int populate_opts_cb(const char *key, const char *value,
|
||||
else if (!strcmp(key, "options.allow-empty-message"))
|
||||
opts->allow_empty_message =
|
||||
git_config_bool_or_int(key, value, ctx->kvi, &error_flag);
|
||||
else if (!strcmp(key, "options.drop-redundant-commits"))
|
||||
opts->drop_redundant_commits =
|
||||
git_config_bool_or_int(key, value, ctx->kvi, &error_flag);
|
||||
else if (!strcmp(key, "options.keep-redundant-commits"))
|
||||
opts->keep_redundant_commits =
|
||||
git_config_bool_or_int(key, value, ctx->kvi, &error_flag);
|
||||
@ -3476,6 +3479,9 @@ static int save_opts(struct replay_opts *opts)
|
||||
if (opts->allow_empty_message)
|
||||
res |= git_config_set_in_file_gently(opts_file,
|
||||
"options.allow-empty-message", "true");
|
||||
if (opts->drop_redundant_commits)
|
||||
res |= git_config_set_in_file_gently(opts_file,
|
||||
"options.drop-redundant-commits", "true");
|
||||
if (opts->keep_redundant_commits)
|
||||
res |= git_config_set_in_file_gently(opts_file,
|
||||
"options.keep-redundant-commits", "true");
|
||||
|
Reference in New Issue
Block a user