Message ID | pull.1080.git.git.1630376800.gitgitgadget@gmail.com (mailing list archive) |
---|---|
Headers | show |
Series | Add a new --remerge-diff capability to show & log | expand |
On 31/08/21 09.26, Elijah Newren via GitGitGadget wrote: > Here are some patches to add a --remerge-diff capability to show & log, > which works by comparing merge commits to an automatic remerge (note that > the automatic remerge tree can contain files with conflict markers). > > Here are some example commits you can try this out on (with git show > --remerge-diff $COMMIT): > > * git.git conflicted merge: 07601b5b36 > * git.git non-conflicted change: bf04590ecd > * linux.git conflicted merge: eab3540562fb > * linux.git non-conflicted change: 223cea6a4f05 > <snip>... > In regards to the performance point above, the timing for running the > following command: > > time git log --min-parents=2 --max-parents=2 $DIFF_FLAG | wc -l > > > in linux.git (with v5.4 checked out, since my copy of linux is very out of > date) is as follows: > > DIFF_FLAG=--cc: 71m 31.536s > DIFF_FLAG=--remerge-diff: 31m 3.170s > > > Note that there are 62476 merges in this history. Also, output size is: > > DIFF_FLAG=--cc: 2169111 lines > DIFF_FLAG=--remerge-diff: 2458020 lines > Which repo did you mean by linux.git? Kernel developers often work against Linus' mainline tree [1], while end-users (including myself) prefer stable tree (which is mainline + stable release branches and tags) [2]. [1]: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git [2]: https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
On Tue, Aug 31, 2021 at 4:05 AM Bagas Sanjaya <bagasdotme@gmail.com> wrote: > > On 31/08/21 09.26, Elijah Newren via GitGitGadget wrote: > > Here are some patches to add a --remerge-diff capability to show & log, > > which works by comparing merge commits to an automatic remerge (note that > > the automatic remerge tree can contain files with conflict markers). > > > > Here are some example commits you can try this out on (with git show > > --remerge-diff $COMMIT): > > > > * git.git conflicted merge: 07601b5b36 > > * git.git non-conflicted change: bf04590ecd > > * linux.git conflicted merge: eab3540562fb > > * linux.git non-conflicted change: 223cea6a4f05 > > > <snip>... > > In regards to the performance point above, the timing for running the > > following command: > > > > time git log --min-parents=2 --max-parents=2 $DIFF_FLAG | wc -l > > > > > > in linux.git (with v5.4 checked out, since my copy of linux is very out of > > date) is as follows: > > > > DIFF_FLAG=--cc: 71m 31.536s > > DIFF_FLAG=--remerge-diff: 31m 3.170s > > > > > > Note that there are 62476 merges in this history. Also, output size is: > > > > DIFF_FLAG=--cc: 2169111 lines > > DIFF_FLAG=--remerge-diff: 2458020 lines > > > > Which repo did you mean by linux.git? Kernel developers often work > against Linus' mainline tree [1], while end-users (including myself) > prefer stable tree (which is mainline + stable release branches and > tags) [2]. > > [1]: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git > [2]: https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git $ git remote -v origin git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git (fetch) origin git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git (push) $ git log -1 origin/master commit 11a48a5a18c63fd7621bb050228cebf13566e4d8 (tag: v5.6-rc2, origin/master, origin/HEAD, master) Author: Linus Torvalds <torvalds@linux-foundation.org> Date: Sun Feb 16 13:16:59 2020 -0800 Linux 5.6-rc2 $ git log -1 HEAD commit 219d54332a09e8d8741c1e1982f5eae56099de85 (HEAD, tag: v5.4) Author: Linus Torvalds <torvalds@linux-foundation.org> Date: Sun Nov 24 16:32:01 2019 -0800 Linux 5.4
"Elijah Newren via GitGitGadget" <gitgitgadget@gmail.com> writes: > Here are some patches to add a --remerge-diff capability to show & log, > which works by comparing merge commits to an automatic remerge (note that > the automatic remerge tree can contain files with conflict markers). Excited ;-) > * This new option does not (currently) work for octopus merges, since > merge-ort is specific to two-parent merges[1]. Unless you do so manually, the native "octopus" backend does not let you create non-trivial merges anyway, so punting on them should not be a big loss. Falling back to --cc might be a usable alternative. > * This option will not work on a read-only or full filesystem[2]. OK. I am not sure if it is worth doing the "temporary objects" trick, though---would it risk repository corruption if somebody is creating a new blob that happens to be identical to the one that is involved in the remerge operation at the same time, or there is no visibility of the temporary area to these "somebody" outside so there is no risk?
On Tue, Aug 31, 2021 at 1:03 PM Junio C Hamano <gitster@pobox.com> wrote: > > "Elijah Newren via GitGitGadget" <gitgitgadget@gmail.com> writes: > > > Here are some patches to add a --remerge-diff capability to show & log, > > which works by comparing merge commits to an automatic remerge (note that > > the automatic remerge tree can contain files with conflict markers). > > Excited ;-) > > > * This new option does not (currently) work for octopus merges, since > > merge-ort is specific to two-parent merges[1]. > > Unless you do so manually, the native "octopus" backend does not let > you create non-trivial merges anyway, so punting on them should not > be a big loss. Falling back to --cc might be a usable alternative. > > > * This option will not work on a read-only or full filesystem[2]. > > OK. I am not sure if it is worth doing the "temporary objects" > trick, though---would it risk repository corruption if somebody is > creating a new blob that happens to be identical to the one that is > involved in the remerge operation at the same time, or there is no > visibility of the temporary area to these "somebody" outside so > there is no risk? The temporary area is only used by the process running --remerge-diff, so there's no risk of corruption. If you have two `git log --remerge-diff ...` processes running at the same time, they each have their own temporary areas.
"Elijah Newren via GitGitGadget" <gitgitgadget@gmail.com> writes:
> Here are some patches to add a --remerge-diff capability to show & log,
One sad omission from the maintainer usecase is that we do not seem
to know "git diff --remerge-diff" yet during a conflicted merge.
"git diff [-- <path>]" before recording the resolution for the path
with "git add <path>" shows combined patch to give a final sanity
check before committing it to the rerere database. I am wondering
if viewing it in the --remrege-diff format instead would help this
step even more.
On Wed, Sep 1, 2021 at 2:08 PM Junio C Hamano <gitster@pobox.com> wrote: > > "Elijah Newren via GitGitGadget" <gitgitgadget@gmail.com> writes: > > > Here are some patches to add a --remerge-diff capability to show & log, > > One sad omission from the maintainer usecase is that we do not seem > to know "git diff --remerge-diff" yet during a conflicted merge. > > "git diff [-- <path>]" before recording the resolution for the path > with "git add <path>" shows combined patch to give a final sanity > check before committing it to the rerere database. I am wondering > if viewing it in the --remrege-diff format instead would help this > step even more. We do have `git diff AUTO_MERGE`, though. It's not quite the same as it doesn't include all the "CONFLICT" messages shown in the terminal like --remerge-diff does with log/show, but otherwise it's the same. Perhaps we could even alias `git diff --remerge-diff` to `git diff AUTO_MERGE`? See commit 5291828df838 (merge-ort: write $GIT_DIR/AUTO_MERGE whenever we hit a conflict, 2021-03-20) for more details.
Elijah Newren <newren@gmail.com> writes: > We do have `git diff AUTO_MERGE`, though. It's not quite the same as > it doesn't include all the "CONFLICT" messages shown in the terminal > like --remerge-diff does with log/show, but otherwise it's the same. Ah, forgot about that one, so we are good. > Perhaps we could even alias `git diff --remerge-diff` to `git diff > AUTO_MERGE`? I do not think it is a good idea to hide AUTO_MERGE behind an option. It is a feature that deserves more user awareness by itself. Thanks.