在Git中搜索共同文件的分支

8
我想在所有分支中搜索与我的修改文件有冲突的文件,以便尽早检测冲突。我是否忽略了 git 提供的方法(或者通过 shell 脚本)可以实现这一点?
目前我想到的方法是作为一个 post-commit 钩子: 1. 在当前分支上执行 `git diff --name-only master` 命令,以确定我将在其他分支中搜索的所有文件(生成冲突分支列表)。 2. 在远程仓库中,对每个我已获取的文件(在前面的步骤中),使用 `git diff --name-only origin/ origin/master` 命令搜索/查找所有其他人的远程分支。 3. 基于搜索/查找结果,返回包含任何冲突文件的分支列表。
2个回答

4

大多数可用的方法都列在“如何在git中预览合并?”中。

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

git diff --name-status origin/abranch

默认情况下与 HEAD 相比较

你可以添加状态过滤器,因为你搜索的是修改后的文件(在分支之间共同的文件有修改)

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

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

我因为感觉不够清晰而修订了我的问题,但是在 https://dev59.com/RW025IYBdhLWcg3wwYz4#33267627 中的命令本质上是我会在我的情景下创建的 bash 脚本的一个示例(除了我会循环遍历所有远程分支)。 - BLaZuRE
@BLaZuRE 只需在您的远程跟踪分支上循环,并对每个执行 git diff --name-status --diff-filter=M origin/abranch。这样,您将获得共同修改文件的列表(可能会发生冲突)。 - VonC

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
}

将显示合并会检查冲突的所有文件,然后只需要运行引用即可,最简单的方法可能是

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 )
}

谢谢。嗯……我想到了我最喜欢的命令,这正是所需之物。 - jthill
读取树!我应该知道(http://stackoverflow.com/search?q=user%3A1290731+%22read-tree%22) - VonC
哈哈,它的表现完美无比,只是我弄错了,并且将相同的更改提交到了两个分支,所以read-tree没有报告我预期的更改。 - jthill

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接