6

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

我最近问如何在 Git 存储库中找到所有具有多个父级的提交?,并得到了很好的答案。

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

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

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

这个想法是找到无法自动解决的提交。

那么,如何在 git 存储库中找到所有有冲突的合并?

4

1 回答 1

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
于 2013-03-29T22:03:17.527 回答