如何找到Git存储库中存在冲突的所有合并?

时间:2013-03-29 16:55:19

标签: git version-control awk grep

我正在研究开源项目中的合并。

我最近问How can I find all the commits that have more than one parent in a Git repository?,得到了非常好的答案。

现在我需要缩小查询范围,才能找到有冲突的提交。

对于冲突,我的意思是在两个贡献提交中修改了同一个文件。

另外,如果我能找到一个git或bash(grep,awk?)命令,它只会给我两个贡献者修改同一行的提交,这将非常有用。

想法是找到无法自动解析的提交。

那么,我怎样才能找到git存储库中存在冲突的所有合并?

1 个答案:

答案 0 :(得分:4)

创建合并提交后,遗憾的是丢失了合并执行的信息。这很重要,因为git merge接受了许多影响冲突外观的选项,例如策略和每策略选项。但是,如果您的目标是覆盖合理的情况,即与默认合并选项产生冲突,则可以强制执行:重新合并提交,重新创建合并,并标记git报告的那些。

注意:此脚本会检出许多不同的提交,并在每次迭代中运行git reset --hard甚至git clean -fdx。一定要只在结帐中运行它,其中不包含git不知道的重要文件!

#!/bin/bash

old_branch=$(git symbolic-ref --short HEAD)
for commit in `git rev-list --merges HEAD`
do
  # find the parents of the merge commit
  parents=$(git log -1 --format=%P $commit)
  fst=${parents%% *}
  rest=${parents#* }
  # check out the first parent
  git checkout -q $fst
  # merge with the rest of them
  git merge --no-commit $rest >/dev/null 2>&1
  # if there are any conflicts, print the commit and abort the merge
  if git ls-files --unmerged | grep -q '^'; then
    echo $commit
    git merge --abort
  fi
  # get rid of changes so the next checkout doesnt complain
  git reset -q --hard
  git clean -fdxq
done
git checkout -q $old_branch