我正在研究开源项目中的合并。
我最近问如何在 Git 存储库中找到所有具有多个父级的提交?,并得到了很好的答案。
现在我需要缩小查询范围,只找到有冲突的提交。
对于冲突,我的意思是同一个文件在两个贡献提交中被修改。
此外,如果我能找到一个 git 或 bash(grep、awk?)命令,它只给我那些由两个贡献者修改了同一行的提交,那将非常有用。
这个想法是找到无法自动解决的提交。
那么,如何在 git 存储库中找到所有有冲突的合并?
我正在研究开源项目中的合并。
我最近问如何在 Git 存储库中找到所有具有多个父级的提交?,并得到了很好的答案。
现在我需要缩小查询范围,只找到有冲突的提交。
对于冲突,我的意思是同一个文件在两个贡献提交中被修改。
此外,如果我能找到一个 git 或 bash(grep、awk?)命令,它只给我那些由两个贡献者修改了同一行的提交,那将非常有用。
这个想法是找到无法自动解决的提交。
那么,如何在 git 存储库中找到所有有冲突的合并?
一旦创建了合并提交,不幸的是,如何执行合并的信息就会丢失。这很重要,因为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