我的团队中的一名程序员在特定的Git仓库上遇到了一个非常奇怪的问题。他是唯一对该仓库进行更改的用户,但每次他推送时,Git都会生成合并提交消息而不是实际的提交消息!很难解释,因此图片更适合说明:在某个时候,它开始做'playMakerTest'的事情,从那时起就再也没有恢复过来。即使在干净检出、重置到最新提交、将所有内容移回主分支并摆脱所有其他分支之后,他现在所做的每个提交和推送都会成为一个合并。有人知道为什么会发生这种情况吗?我真的快要创建一个新的仓库了...
git push
不能创建合并。1git push
时,你让你的git调用其他git(例如通过ssh), 然后两个git存储库进行一些对话,以讨论哪些对象是你的而他们没有,以及你希望他们将他们的参考设置为指向的对象。branch
更改为指向提交1234567...
”。为了让服务器执行此操作,服务器必须拥有提交1234567...
, 因此你的git可以打包该对象和任何其他所需的对象,然后首先将它们发送过去.refs/heads/branch
设置为1234567...
”。这些请求经过权限检查(pre-receive
和update
钩子),通常会拒绝非快进式更新,或者使用更高级的系统如gitolite时,检查远程用户是否有权限创建、删除或更新特定分支。2如果权限检查允许,服务器端的git进程就简单地设置请求的引用(通常是分支名称,有时是标签;还有注释引用等)。git push
步骤之前。正如上面的评论中所指出的这是由于用户反复修改已经推送的提交,这会将提交复制到一个新的ID中。推送该新ID将不是快进式操作,并且默认情况下将被拒绝;为了使其发生,用户可能正在进行额外的合并操作。
1实际上,不是直接通过推送实现合并的。然而,使用上述提到的钩子可以设置服务器,使其在收到推送时保存新提交,拒绝推送本身,然后运行额外的独立git命令来使用已保存但被拒绝的提交创建合并。 这是一种相当扭曲的操作模式,不是人们通常会或应该做的事情。(此外,在这里创建合并的不是推送本身,而是推送触发其他脚本,其他脚本创建合并。)