Thread (5 messages) flat view 5 messages, 5 authors, 2021-05-12

Re: Rebase Question

From: Jeff King <hidden>
Date: 2021-05-12 00:44:22

On Tue, May 11, 2021 at 05:29:03PM -0700, Bryan Turner wrote:
On Tue, May 11, 2021 at 5:07 PM Andrew Ottaviano [off-list ref] wrote:
quoted
Hello all!

I’ve used git for a few years now and I
think it is an amazing tool! Thank you for your hard work in
developing/maintaining it! I really appreciate it!

I have a question. Let’s say that my
colleague and I branch off of master and are working. Let’s say I’m 5 commits
ahead of master and my colleague merges in ahead of me. The logical thing in my
mind is to rebase off of master. The difficulty with this is that if I have
merge conflicts that show up on my first commit, I have to resolve that stupid
thing for every subsequent commit. I could squash, but then I loose branch
history, so I don’t really want to do that. I could rebase in interactive mode,
but if I recall, I still need to resolve all the conflicts on every commit
before it squashes.
Have you investigated git rerere[1] at all? Documentation indicates it
works for rebase as well as merge, so it might be possible to train
that to resolve the conflicts.
I don't think rerere helps here. In a rebase like this, the problem is
that it _isn't_ the same conflict.

Imagine a case like this:

-- >8 --
git init repo
cd repo

# both branches start with just the line "base"
echo base >file
git add file
git commit -m base

# one side adds a new line
git checkout -b newline
echo another >>file
git commit -am 'add a line'

# and the other modifies the first line
git checkout -b other HEAD^
echo one >file
git commit -am one
echo two >file
git commit -am two

# and now we rebase on top of the newline branch
git rebase newline
-- >8 --

Applying the first commit gets this conflict (in diff3 form)

  <<<<<<< ours
  base
  another
  ||||||| base
  base
  =======
  one
  >>>>>>> theirs

After we fix that up to "one\nanother", the second conflict is:

  <<<<<<< ours
  one
  another
  ||||||| base
  one
  =======
  two
  >>>>>>> theirs

Likewise, even if you had done the original merge between branch tips,
you'd have seen yet another conflict:

  <<<<<<< ours
  two
  ||||||| base
  base
  =======
  base
  another
  >>>>>>> theirs

The actual lines changed are the same, but as the nearby context is
continually shifting, we don't consider these to be the "same" conflict.

-Peff
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help