在git中显示两个提交的非合并差异

时间:2010-12-28 20:15:22

标签: git diff

我有两个提交,其中一个是另一个的祖先。 (它们恰好是分支的起点和终点。我认为不重要,但如果有的话,我会把它包括在内。)

我希望看到两个提交之间的差异,但排除在两次提交之间进行的合并提交(即所有具有多个父级的提交)期间所做的更改。 (基本上,我想要对分支进行任何“真正的”提交,不包括合并。)

这可能吗?如果是这样,你如何做到这一点?

如果有必要,假设在合并提交期间没有解决冲突...但是可以优雅地处理它们的解决方案的奖励积分。

4 个答案:

答案 0 :(得分:8)

你的问题有些含糊不清,但我想你想要这个。

git log --no-merges -p branch-start..branch-end

答案 1 :(得分:3)

如果您的合并全部来自同一个分支(例如master)或全部包含在另一个分支中,则可以使用solution中的this question

假设你有一棵如下所示的树:

         x---y-+-z-+-branch
        /     /   /
---a---b---c-+-d-+-e---master

您要比较的两个提交是 b branch 。然后直接比较两个提交,运行

git diff master...branch

将显示在分支(x,y,z)上完成的所有更改,但不包括masterc,d,e(合并)上的所有内容。请注意,这也忽略了对master中尚未进行的任何更改。

来自文档:

  

git diff [--options] commit ... commit [ - ] [...]

     

此表单用于查看包含和最多第二次提交的分支上的更改,从两者的共同祖先开始   提交。 “git diff A ... B”相当于“git diff $(git-merge-base   A B)B“。

答案 2 :(得分:2)

我不知道--no-merges -o选项,但这里有另一个解决方案(我想合并已经从master完成):

git checkout -b temp
git rebase --onto master branch-start branch-end
git diff master

答案 3 :(得分:0)

这是我将检出的分支与master进行比较的方式,不包括合并提交期间所做的更改。我更喜欢使用Meld的目录模式。

function saveCheckBoxes(){
        checkBoxStorage = window.localStorage;
        var chkbxsObj  = $("input:checkbox"); 
        const chkbxsArrObj = Object.keys(chkbxsObj).map(i => chkbxsObj[i]); //array che contiene tutti gli oggetti checkbox
        var arrayChecked = []; //array che conterrà gli id dei checkbox segnati
        var chkbxsArr = []; //array che conterrà gli id rappresentanti tutti i checkbox


        for(var i=0;i<chkbxsArrObj.length; i++){
            if(chkbxsArrObj[i].checked == true){
                arrayChecked.push(chkbxsArrObj[i].id);
//              chkbxsArr.splice(i,1);
            }else{
                chkbxsArr.push(chkbxsArrObj[i].id);
            }
        }
        checkBoxStorage.setItem("chkbxsArrObj",JSON.stringify(chkbxsArrObj)); 

       //I get soething like: chbxsArrObj: Array(13) [input#id, input#id, input#id, input#id, ...]

        checkBoxStorage.setItem("chkbxsArr",chkbxsArr);
        checkBoxStorage.setItem("arrayChecked",arrayChecked);
        }