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 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html