From: Junio C Hamano <gitster@pobox.com>
To: skillzero@gmail.com
Cc: git@vger.kernel.org
Subject: Re: Retry conflicting merge with matching line endings?
Date: Tue, 17 Feb 2009 18:18:58 -0800 [thread overview]
Message-ID: <7v8wo41o8d.fsf@gitster.siamese.dyndns.org> (raw)
In-Reply-To: <2729632a0902171755n3e89e717p6b3a38b556252bfb@mail.gmail.com> (skillzero@gmail.com's message of "Tue, 17 Feb 2009 17:55:42 -0800")
skillzero@gmail.com writes:
> I've been running into a lot of merge conflicts due to line endings
> changing. For example, I branch from master when a file has CRLF line
> endings (incorrectly) then somebody fixes a bug in that file (still
> has CRLF line endings) on master then I realize the file should have
> LF line endings so I change them. When I try to rebase on master
> later, I get a merge conflict because it looks like every line has
> changed and it conflicts with that other bug fix.
>
> Would it be reasonable that if you get a conflict during a merge and
> the line endings of the two commits are different then change the line
> endings to match, retry the merge of that file, then apply the line
> ending change commit?
This is not specific to fixing line ending but applies any "global token
replacement" (e.g. you renamed a variable) operation in general.
Suppose the conflicted path is hello.c when you were merging branch
"other", e.g.
$ git merge other
$ git ls-files -u
100644 b040a96e50... 1 hello.c
100644 6b9c715d21... 2 hello.c
100644 1c57d4c958... 3 hello.c
You can first extract the blobs involved into plain files, apply such
"global token replacement" (be it fixing the line ending or renaming a
variable) to the common ancestor version and the other's version, and run
three-way file-level merge.
$ git cat-file blob :1:hello.c | replacement_filter >ancestor
$ git cat-file blob :2:hello.c >mine
$ git cat-file blob :3:hello.c | replacement_filter >theirs
$ git merge-file mine ancestor theirs
where replacement_filter would be whatever global replacement you did to
your version since the ancestor (e.g. dos2unix).
The "mine" file merge-file leaves will hopefully have much smaller
conflicts, as it won't have to see your line endings change. If it looks
Ok, cat it into hello.c and "git add" it.
next prev parent reply other threads:[~2009-02-18 2:20 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-02-18 1:55 Retry conflicting merge with matching line endings? skillzero
2009-02-18 2:18 ` Junio C Hamano [this message]
2009-02-18 3:44 ` skillzero
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=7v8wo41o8d.fsf@gitster.siamese.dyndns.org \
--to=gitster@pobox.com \
--cc=git@vger.kernel.org \
--cc=skillzero@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).