在g

时间:2016-02-25 07:46:25

标签: git diff git-diff merge-conflict-resolution

我想在git分支中搜索我和所有其他文件之间共同修改的文件,作为早期冲突检测的方法。有没有一种方法让git允许我这样做,我忽略(或通过shell脚本)?

我现在想到的方法是,作为一个提交后的钩子:

  1. 在我的分支机构上执行git diff --name-only master,以确定我将在其他分支机构中搜索的所有文件(以生成冲突分支列表)
  2. 通过远程存储库上的git diff --name-only origin/<remote branch> origin/master搜索/获取我在每个人的其他远程分支中获得的每个文件(在上一步中)
  3. 根据搜索/ grep的结果,返回包含一个或多个冲突文件的分支列表。

2 个答案:

答案 0 :(得分:4)

大多数可用方法都列在“How can I preview a merge in git?

您提到的第二步是最快的一步(与实际执行合并--no-ff--no-commit相比)

git diff --name-status origin/abranch

(默认情况下与HEAD相比)

您可以add a status filter,因为您搜索已修改的文件(带有修改的分支之间的公共文件)

不需要第一步:第二步将直接列出与HEAD相比的常见修改文件。

git diff --name-status --diff-filter=M origin/abranch

答案 1 :(得分:3)

potentially-conflicting-changes-between () { 
        local base=`git merge-base $1 $2`
        { git diff --name-only $base $1
          git diff --name-only $base $2
        } | sort | uniq -d
}

将显示合并的所有文件将检查冲突,然后它只是运行refs的问题,最简单的可能是

for other in `git branch -r`; do
        printf '--- \n%s %s\n' master $other
        potentially-conflicting-changes-between master $other
done

您也可以直接执行低级合并准备以消除相同更改的误报,这可以节省很多时间,但会列出所有潜在冲突的索引详细信息,并检查合并是否实际可以在您当前的工作树中运行而不会踩踏关于未提交的工作

potentially-conflicting-changes-between ()
{
    ( export GIT_INDEX_FILE=`git rev-parse --git-dir`/scratch-index;
    git read-tree --empty;
    git read-tree -m $(git merge-base $1 $2) $1 $2;
    git ls-files -u )
}