Re: git-rerere observations and feature suggestions
From: Peter Zijlstra <hidden>
Date: 2016-06-15 22:44:48
On Mon, 2008-06-23 at 11:49 +0200, Ingo Molnar wrote:
another git-rerere observation: occasionally it happens that i
accidentally commit a merge marker into the source code.
That's obviously stupid, and it normally gets found by testing quickly,
but still it would be a really useful avoid-shoot-self-in-foot feature
if git-commit could warn about such stupidities of mine.
( and if i could configure git-commit to outright reject a commit like
that - i never want to commit lines with <<<<<< or >>>>> markers)
Another merge conflict observation is that Git is much worse at figuring
out the right merge resolution than our previous Quilt based workflow
was. I eventually found it to be mainly due to the following detail:
sometimes it's more useful to first apply the merged branch and then
attempt to merge HEAD, as a patch.
I've got a script for that which also combines it with the "rej" tool,
and in about 70%-80% of the cases where Git is unable to resolve a merge
automatically it figures things out. ('rej' is obviously a more relaxed
merge utility, but it's fairly robust in my experience, with a very low
false positive rate.)
The ad-hoc "tip-mergetool" script we are using is attached below. It's
really just for demonstration purposes - it doesnt work when there's a
rename related conflict, etc.
Peter Zijstra also wrote a git-mergetool extension for the 'rej' tool
btw., he might want to post that patch. I've attached Chris Mason's rej
tool too.This is what I run with. I added the cp to the 3-way merge tools because I think its stupid to see the messed up merge markers instead of the original file. The rej target basically takes the local version and takes the diff between base and remote and applies that as a patch, upon failure it invokes rej to fix up the mess.
--- /usr/bin/git-mergetool 2008-04-08 19:01:37.000000000 +0200
+++ git-mergetool 2008-06-02 19:00:55.000000000 +0200@@ -214,12 +214,14 @@ merge_file () { ;; meld|vimdiff) touch "$BACKUP" + cp -- "$BASE" "$path" "$merge_tool_path" -- "$LOCAL" "$path" "$REMOTE" check_unchanged save_backup ;; gvimdiff) touch "$BACKUP" + cp -- "$BASE" "$path" "$merge_tool_path" -f -- "$LOCAL" "$path" "$REMOTE" check_unchanged save_backup
@@ -271,6 +273,13 @@ merge_file () { status=$? save_backup ;; + rej) + touch "$BACKUP" + cp -- "$LOCAL" "$path" + diff -up "$BASE" "$REMOTE" | patch "$path" || rej "$path" + check_unchanged + save_backup + ;; esac if test "$status" -ne 0; then echo "merge of $path failed" 1>&2
@@ -311,7 +320,7 @@ done valid_tool() { case "$1" in - kdiff3 | tkdiff | xxdiff | meld | opendiff | emerge | vimdiff | gvimdiff | ecmerge) + kdiff3 | tkdiff | xxdiff | meld | opendiff | emerge | vimdiff | gvimdiff | ecmerge | rej) ;; # happy *) return 1