threads / discuss / 48782

git rerere and diff3

Subject: git rerere and diff3

## tl;dr

3 messages between Jun 26, 2018 and Jun 26, 2018.

replies: 2people: 2as markdown or json

Nicolas Dechesne· Jun 26, 2018, 13:25 UTC · lore
hi there,

i have noticed that merge.conflictstyle has an impact on the rerere resolution. looking briefly at the source code, it seems that git tries to discard the common ancestor diff3 bits, but what I am seeing is that if i do the following then it fails:

1. from a clean rr-cache state, with merge.conflictsytle=diff3, git
merge <branch with conflict>, resolve the conflicts, then commit
2. undo the previous merge, remove merge.conflictstyle=diff3 (disable
diff3) and merge the *same* branch, then rerere won't fix the
conflicts

Is that the expected behavior? I am not familiar with git code, but browsing rerere.c makes me think that it should have worked..

Of course, if I merge the same branch without modifying merge.conflictstyle, then the merge conflicts are properly resolved by rerere.

thanks!
Junio C Hamano· Jun 26, 2018, 19:05 UTC · re: Nicolas Dechesne · lore

Re: git rerere and diff3

Nicolas Dechesne <nicolas.dechesne@linaro.org> writes:
Show 10 quoted lines
> i have noticed that merge.conflictstyle has an impact on the rerere
> resolution. looking briefly at the source code, it seems that git
> tries to discard the common ancestor diff3 bits, but what I am seeing
> is that if i do the following then it fails:
>
> 1. from a clean rr-cache state, with merge.conflictsytle=diff3, git
> merge <branch with conflict>, resolve the conflicts, then commit
> 2. undo the previous merge, remove merge.conflictstyle=diff3 (disable
> diff3) and merge the *same* branch, then rerere won't fix the
> conflicts

It is possible that the conflict left when making the same merge are actually different when using these two conflict styles. IOW, if the merge produces

	<<<
	side A
	|||
	common
	===
	side B
	>>>
when diff3 style is chosen, but if the same merge results in
	<<<
	side A'
	===
	side B'
	>>>

where side A' is not identical to side A (or B' and B are not identical), then we will fail to find the previously recorded resolution.

Nicolas Dechesne· Jun 26, 2018, 19:37 UTC · re: Junio C Hamano · lore

Re: git rerere and diff3

On Tue, Jun 26, 2018 at 9:05 PM Junio C Hamano <gitster@pobox.com> wrote:
Show 37 quoted lines
>
> Nicolas Dechesne <nicolas.dechesne@linaro.org> writes:
>
> > i have noticed that merge.conflictstyle has an impact on the rerere
> > resolution. looking briefly at the source code, it seems that git
> > tries to discard the common ancestor diff3 bits, but what I am seeing
> > is that if i do the following then it fails:
> >
> > 1. from a clean rr-cache state, with merge.conflictsytle=diff3, git
> > merge <branch with conflict>, resolve the conflicts, then commit
> > 2. undo the previous merge, remove merge.conflictstyle=diff3 (disable
> > diff3) and merge the *same* branch, then rerere won't fix the
> > conflicts
>
> It is possible that the conflict left when making the same merge are
> actually different when using these two conflict styles.  IOW, if
> the merge produces
>
>         <<<
>         side A
>         |||
>         common
>         ===
>         side B
>         >>>
>
> when diff3 style is chosen, but if the same merge results in
>
>         <<<
>         side A'
>         ===
>         side B'
>         >>>
>
> where side A' is not identical to side A (or B' and B are not
> identical), then we will fail to find the previously recorded
> resolution.
well, you're rigth.. that's what's happening...

=== with conflictstyle=merge diff --cc arch/arm64/configs/defconfig index 3cfa8ca26738,d53a1b00ad82..000000000000

--- a/arch/arm64/configs/defconfig
+++ b/arch/arm64/configs/defconfig
@@@ -356,7 -334,7 +357,11 @@@ CONFIG_GPIO_PCA953X=
  CONFIG_GPIO_PCA953X_IRQ=y
  CONFIG_GPIO_MAX77620=y
  CONFIG_POWER_AVS=y
++<<<<<<< HEAD
 +CONFIG_ROCKCHIP_IODOMAIN=y
++=======
+ CONFIG_QCOM_CPR=y
++>>>>>>> tracking-qcomlt-8016-dvfs
  CONFIG_POWER_RESET_MSM=y
  CONFIG_POWER_RESET_XGENE=y
  CONFIG_POWER_RESET_SYSCON=y

=== with conflictstyle=diff3
diff --cc arch/arm64/configs/defconfig
index 3cfa8ca26738,d53a1b00ad82..000000000000
--- a/arch/arm64/configs/defconfig
+++ b/arch/arm64/configs/defconfig
@@@ -355,8 -333,8 +356,14 @@@ CONFIG_GPIO_XGENE_SB=
  CONFIG_GPIO_PCA953X=y
  CONFIG_GPIO_PCA953X_IRQ=y
  CONFIG_GPIO_MAX77620=y
++<<<<<<< HEAD
 +CONFIG_POWER_AVS=y
 +CONFIG_ROCKCHIP_IODOMAIN=y
++||||||| merged common ancestors
++=======
+ CONFIG_POWER_AVS=y
+ CONFIG_QCOM_CPR=y
++>>>>>>> tracking-qcomlt-8016-dvfs
  CONFIG_POWER_RESET_MSM=y
  CONFIG_POWER_RESET_XGENE=y
  CONFIG_POWER_RESET_SYSCON=y

that explains it.. it was simpler than what I thought..

thanks!

← back to recent threads