Git经常合并

4
我的团队中的一名程序员在特定的Git仓库上遇到了一个非常奇怪的问题。他是唯一对该仓库进行更改的用户,但每次他推送时,Git都会生成合并提交消息而不是实际的提交消息!很难解释,因此图片更适合说明:enter image description here在某个时候,它开始做'playMakerTest'的事情,从那时起就再也没有恢复过来。即使在干净检出、重置到最新提交、将所有内容移回主分支并摆脱所有其他分支之后,他现在所做的每个提交和推送都会成为一个合并。有人知道为什么会发生这种情况吗?我真的快要创建一个新的仓库了...

2
如果其他程序员提交了任何内容,会发生什么?(问题与“程序员”还是“代码库”有关?) - Amit
抱歉,我忘记添加了“-”符号,当我添加提交时一切都很顺利。只有在这个特定的存储库中,这个用户会出现问题——我还不想让他在其他存储库上工作,因为这可能与他的配置有关,会严重破坏历史记录的完整性。 - Lennard Fonteijn
那么你为什么“快要创建一个新的repo了”?只需要重新配置/重新安装程序员的环境。 - Amit
因为我保持所有事情都是开放的,以防万一 ;) 我问的原因是因为我完全不知道他的环境中哪个东西会导致这个配置问题。 - Lennard Fonteijn
1
我对tortoisegit一无所知,但如果它是一个嫌疑对象,首先确认它(执行命令行提交),然后将其添加为标签并更正您的问题,或者至少您知道它是不相关的。 - Amit
显示剩余10条评论
2个回答

1
I不知道你是否会删除这个问题(如上面的评论所建议),但现在我想指出一件事:

git push不能创建合并1

当你使用git push时,你让你的git调用其他git(例如通过ssh), 然后两个git存储库进行一些对话,以讨论哪些对象是你的而他们没有,以及你希望他们将他们的参考设置为指向的对象。

例如,在你的情况下,你(或更准确地说是你团队中的程序员)可能会调用服务器git实例,并说“请将分支branch更改为指向提交1234567...”。为了让服务器执行此操作,服务器必须拥有提交1234567..., 因此你的git可以打包该对象和任何其他所需的对象,然后首先将它们发送过去.
服务器端的git在此过程中不会执行任何合并操作,它只是接受所需的对象,然后接受请求,例如“将refs/heads/branch设置为1234567...”。这些请求经过权限检查(pre-receiveupdate钩子),通常会拒绝非快进式更新,或者使用更高级的系统如gitolite时,检查远程用户是否有权限创建、删除或更新特定分支。2如果权限检查允许,服务器端的git进程就简单地设置请求的引用(通常是分支名称,有时是标签;还有注释引用等)。
每个合并操作都来自用户(而不是服务器)端,在git push步骤之前。正如上面的评论中所指出的这是由于用户反复修改已经推送的提交,这会将提交复制到一个新的ID中。推送该新ID将不是快进式操作,并且默认情况下将被拒绝;为了使其发生,用户可能正在进行额外的合并操作。

1实际上,不是直接通过推送实现合并的。然而,使用上述提到的钩子可以设置服务器,使其在收到推送时保存新提交,拒绝推送本身,然后运行额外的独立git命令来使用已保存但被拒绝的提交创建合并。 这是一种相当扭曲的操作模式,不是人们通常会或应该做的事情。(此外,在这里创建合并的不是推送本身,而是推送触发其他脚本,其他脚本创建合并。)


1
经过一些测试,我确认“修改最后提交”确实是问题所在。 当一个提交已经被推送之后,修改仍然会尝试纠正最新的提交。在提交时,它会注意到刚刚修改的提交已经被推送,并会抛出合并冲突。 该程序员忽略了所有的警告,并且只是“修复”了合并冲突并推送了更改。作为一个初学者,他认为应该是“这样的”。直到其他人和我开始抱怨他的所有提交都是合并的,破坏了历史的完整性。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接