Merge/diff tool that can show authors (supports blame or annotate) in files under version control

后端 未结 3 1109

When merging files it will be helpful (as for me) to show an author of each line. Is there any diff or merge tool supporting that?

相关标签:
3条回答
  • 2021-01-17 19:42

    So what you really want is a tool that can easily identify your changes relative to other's changes in a merge conflict, rather actually identify the author of each line (which would be a mean to achieve that), right?

    If I understood you correctly, I have some relatively good news: It can be done with git + kdiff3. For merging you can just use git mergetool (which you can configure to use kdiff3). But it is not supported natively if you get a merge conflict when doing interactive rebase, so for that some manual scripting is required.

    Instead of making up my own simple merge conflict example, I will use http://www.gitguys.com/topics/merging-with-a-conflict-conflicts-and-resolutions/ as an basis. Follow that page to git merge test. From after the merge command I diverge a bit from that example by running different commands (but basically doing the same job). I'll do all the manuall steps first.

    So we have a merge conflict and git has inserted content from both contributing sources into the file in this <<<<<<<...>>>>>>> format, which I really do not like at all and never consider even looking at it. Instead I use my favourite merge tool, kdiff3.

    First we need to find which versions that are involved.

    $ git ls-files -u
    100644 b0ed415d15862ac5582b51e4de65528e86934cd2 1       README
    100644 56300e3ac4e4521c3500618a301bb2ab2d6a52f5 2       README
    100644 9585db7d9c2d9ca05075f67a878f2554886d7b1a 3       README
    $
    

    Basted that information we can perform a three way merge:

    $ git cat-file blob b0ed415d15862ac5582b51e4de65528e86934cd2 > v1
    $ git cat-file blob 56300e3ac4e4521c3500618a301bb2ab2d6a52f5 > v2
    $ git cat-file blob 9585db7d9c2d9ca05075f67a878f2554886d7b1a > v3
    $ kdiff3 -o merge_result v1 v2 v3 &
    [2] 18394
    $
    

    Which gives the following view where you can select from which ancestor you want to merge from.

    kdiff3 screenshot

    Afterwords (if you are satisfied with the merge result) you need to

    $ rm v1 v2 v3
    $ mv merge_result README
    $ git add README
    

    All the manual steps above are done automatically with git mergetool. So why showing all that then? Well, because if you get a corresponding conflict during git rebase -i, then it has to be done that way (before running git rebase --continue).

    In this small example there is only one conflict line, so it does not show the more typical case where a lot of lines are automatically resolved, leaving you to just manually resolve the ones that was not done automatically. A more real life example might look more like the following:

    kdiff3 screenshot

    Notice that in the merge result you now clearly see the origin of the C lines that were automatically resolved. I think this is sort of what you were asking for when asking for getting the author for each line, right? That information is completely absent in the <<<<<<<...>>>>>>> text (and it is difficult/impossible to spot that you should update the printed string in the hello function).

    I cannot recommend kdiff3 highly enough. Using a graphical merge tool like that compared to some lines from both sources mixed inline in the file is like using an excavator versus a spade.

    0 讨论(0)
  • 2021-01-17 20:00

    The bundled gitk tool is not really a merge tool, but it shows conflicted lines with red and blue and "+"'s in front, and you can Rightclick->"Show origin of this line" on any of them, to go to the commit which introduced the line:

    Screenshot

    You can run your mergetool, or just a text editor with diffmarks in parallel

    0 讨论(0)
  • 2021-01-17 20:03

    No. And, I think, never will be - when we merge, we think about content, not authorship

    0 讨论(0)
提交回复
热议问题