Display the Authors and commit message for commits that cause a conflict

1.5k Views Asked by At

I have two long-running branches dev, and a far future release called future . We create fixes for the supported release by branching from the tag that exhibits the bug, fix it, and then open pull-requests to the two branches. If there is a conflict in the 'future' branch, our developers are suppose to create a new branch, resolve the conflicts, and open another PR to future.

Unfortunately, our team is large enough that plenty of these second PRs haven't been made. I need to now figure out which exact commits caused conflicts. I can do this manually by running git blame on each conflicted file, and seeing the commits on each side of the ====== line, but that doesn't actually give me enough information, and I have to manually run git blame for every conflict and every file.

Is there an easier way? Ideally, I'd want something equivalent to:

Commit X: <coworker1> I updated something.
Commit Y: <coworker2> Something fixed.
Conflicts: 
   some/file/here
   a/different/file.

for every single conflict.

Though anything that just gives me the list of conflicting commits would be useful enough to warrant the bounty.

4

There are 4 best solutions below

1
On

You could run git diff --diff-filter=U while merging to see diff output for all (and only) unmerged files. It's still with file content, but it's better than manually running a command for each file.

0
On

You may wish to consider using a review tool such as gerrit, which detects possible merge conflicts prior to submitting a change list to a branch. I realize this doesn't help you right this second, but I believe you'll have to write a tool yourself to do what you want.

2
On

You need to start using git rerere. You have to resolve the conflict once, but for almost every new rebase the old merge will do it automatically then. Sometimes you'll need to do a git rebase --skip.

https://medium.com/@porteneuve/fix-conflicts-only-once-with-git-rerere-7d116b2cec67

git config --global rerere.enabled true
git config rerere.autoupdate true
mkdir .git/rr-cache

With many coworkers add the .git/rr-cache dir to your project.

ln -s .git/rr-cache .git-rr-cache
git add .git-rr-cache
2
On

You can get pretty close very easily:

git ls-files -u | cut -f2- | uniq \
| while read conflicted; do
        echo @@@ conflicted file $conflicted touched in this merge by:
        git log HEAD...MERGE_HEAD --left-right --format='    %h %aN %s' -- "$conflicted"
done

and really, it's only the right-branch (the one being merged in) commit authors you care about -- the left-branch ones have already been merged, let whoever touched what you've already got sort it out.

Add --topo-order to the log command to list the commits for each branch together.