如何配置git以将另一个开发人员所做的更改识别为冲突

时间:2013-11-22 17:32:14

标签: git version-control repository git-merge git-rebase

我试图找出是否可以设置git来标记由两个或更多开发人员更改为冲突的任何文件 - 无论该文件中的相同行是否被修改。这是一个例子:

两位开发人员首先在本地计算机上克隆远程仓库。开发人员1对文件A进行了更改。因为他是第一个更改文件的开发人员,所以没有冲突,然后他将更改提交到他的本地仓库,然后将更改推送到远程仓库。当开发人员1正在工作时,开发人员2也在处理同一个文件,但是在一个完全不同的区域,因此没有重叠的代码行。开发人员2然后将他的更改提交到他的本地仓库然后进行拉动。此时,git似乎自动合并了这些行。

有时这是好的。但是,还有一些时候,这肯定不合适,并且在将文件推送到远程仓库之前需要检查和更新该文件。这很重要,经常发生,我们真的希望在将它们推送到存储库之前将其应用于所有文件。所以,问题是 - git merge是否可以配置为在文件被上次拉动后被其他开发人员更改时将文件识别为冲突?我查看了git merge命令here。尽管它提供了合并策略,但我没有看到任何可以提供此功能的东西。实现此功能也不难。所有需要做的是确定文件A的开发人员的本地仓库版本(从最后一次拉动)是否与远程仓库中文件A的当前版本匹配。如果没有,则将其标记为冲突。有什么方法可以做到这一点,或者我们可以用来识别已经改变过的文件以及在推送回购之前需要审查的任何其他想法?

1 个答案:

答案 0 :(得分:1)

我会说:不要在git merge内尝试这样做。相反,使用外部脚本执行此操作。 (当然,开发人员使用脚本可能会遇到一些问题:-))

然后,您可以按照建议的方式使该脚本正常工作:比较“repo中的文件作为基础,vs / repo中的文件,以及之前 - (merge / rebase)”:

# if on branch foo that maps to origin/foo
git tag compare-foo <commit-id>
git fetch origin
git diff <optional-args> compare-foo origin/foo
# or use git diff-tree and do your own post-processing
# add more stuff to compare the merge-base to the
# developer's version of branch foo to identify files
# that were modified by "both"
# when all satisified: git tag -d compare-foo

要选择提交ID,您可以使用git merge-base,例如:

cid=$(git merge-base foo origin/foo)

或者您必须假设origin/foo是正确的点,即开发人员通过直接origin/foo运行此过程而不是更新git fetch。 (或者,请看下面的花哨。)

您可能希望通过要求开发人员“签署”某种“我做了比较并且一切正常”声明来理解这个过程。详细信息将取决于您和开发人员,这将驱动该机制(例如,您可能希望在refs/tags名称空间之外创建引用和/或使用具有不同名称空间的git notes比通常的笔记)。一旦签署,这可以作为后续比较的起点,如果其他开发人员在成功推送提交方面“击败它们”。

注意:这不是实际测试的替代品(但是,测试不能替代人们对其他人的改变的替代)。