我正在研究开源项目中的合并。
我最近问How can I find all the commits that have more than one parent in a Git repository?,得到了非常好的答案。
现在我需要缩小查询范围,才能找到有冲突的提交。
对于冲突,我的意思是在两个贡献提交中修改了同一个文件。
另外,如果我能找到一个git或bash(grep,awk?)命令,它只会给我两个贡献者修改同一行的提交,这将非常有用。
想法是找到无法自动解析的提交。
那么,我怎样才能找到git存储库中存在冲突的所有合并?
答案 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