Ayush Chandekar <ayu.chandekar@xxxxxxxxx> writes: > When core.commentChar is set to "auto", Git selects a comment character > by scanning the commit message contents and avoiding any character > already present in the message. > > If the message still contains old conflict comments (starting with a > comment character), Git assumes that character is in use and chooses a > different one. As a result, those existing comment lines are no longer > recognized as comments and end up being included in the final commit > message. > > To avoid this, skip scanning the trailing comment block when selecting > the comment character. This allows Git to safely reuse the original > character when appropriate, keeping the commit message clean and free of > leftover conflict information. > > Background: > > The "auto" value for core.commentchar was introduced in the commit > `84c9dc2` (commit: allow core.commentChar=auto for character auto > selection) but did not exhibt this issue at that time. Use "git log -1 --format=reference", i.e. 84c9dc2c (commit: allow core.commentChar=auto for character auto selection, 2014-05-17) > The bug was introduced in commit `a6c2654` (rebase -m: fix --signoff > with conflicts) where Git started writing conflict comments to the file > at 'rebase_path_message()'. Ditto. > diff --git a/builtin/commit.c b/builtin/commit.c > index fba0dded64..63e7158e98 100644 > --- a/builtin/commit.c > +++ b/builtin/commit.c > @@ -688,6 +688,10 @@ static void adjust_comment_line_char(const struct strbuf *sb) > char candidates[] = "#;@!$%^&|:"; > char *candidate; > const char *p; > + size_t cutoff; > + > + /* Ignore comment chars in trailing comments (e.g., Conflicts:) */ > + cutoff = sb->len - ignored_log_message_bytes(sb->buf, sb->len); > > if (!memchr(sb->buf, candidates[0], sb->len)) { > free(comment_line_str_to_free); > @@ -700,7 +704,7 @@ static void adjust_comment_line_char(const struct strbuf *sb) > candidate = strchr(candidates, *p); > if (candidate) > *candidate = ' '; > - for (p = sb->buf; *p; p++) { > + for (p = sb->buf; p + 1 < sb->buf + cutoff; p++) { > if ((p[0] == '\n' || p[0] == '\r') && p[1]) { > candidate = strchr(candidates, p[1]); > if (candidate) Looks quite straight-forward. Nice. Thanks.