Git 一直在 merge

标签 git merge git-branch rebase

我团队中的一位程序员在使用特定 Git 存储库时遇到了一个非常奇怪的问题。

他是唯一对存储库进行更改的用户,然而,每次他推送时,Git 都会生成 merge 提交消息,而不是实际的提交消息!

很难解释所以一张图片更适合: enter image description here

在某个时候,它开始做“playMakerTest”的事情,而且它再也没有从中恢复过来。他现在做出和 push 的每一次提交最终都是一次 merge 。即使在干净地 checkout 之后,rebase 最新的提交,将所有内容移回 master 并删除所有其他分支。

有人知道为什么会这样吗?我真的快要创建一个新的存储库了...

最佳答案

我不知道你是否要删除这个问题(如上面评论中所建议的),但现在我要注意一件事:

git push 无法创建 merge 1

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

例如,在您的情况下,您(或者更准确地说是您团队中的程序员)可能会调用服务器 git 实例并说“请更改分支 branch 以指向提交 1234567。 ..”。为了让服务器执行此操作,服务器必须提交 1234567... 这样您的 git 就可以将该对象与任何其他需要的对象打包,然后发送这些对象结束,先。

服务器端的 git 在此过程中做任何 merge ,它只是先接受任何需要的对象,然后接受像“set refs/heads/branch”这样的请求> 到 1234567...”。这些请求通过权限检查(pre-receiveupdate Hook )运行,通常会执行诸如拒绝非快进更新之类的操作,或者在使用诸如gitolite,检查远程用户是否有创建、删除或更新特定分支的权限。2 如果权限检查允许,服务器端 git 进程简单地设置请求的引用(通常是分支-名称,有时是标签;还有注释引用等)。

然后,这些 merge 中的每一个都来自用户(而非服务器)端,在 git push 步骤之前。如上面的评论所述,这是由于用户反复修改现有但已推送的提交,这会将提交复制到新 ID。推送新 ID 不会是快进操作,默认情况下会被拒绝;为了实现它,用户可能正在执行额外的 merge 。


1好吧,不管怎样,不是靠它自己。使用上面提到的钩子(Hook),可以设置一个服务器,这样当它接收到一个推送时,它会保存任何新的提交,拒绝推送本身,然后运行额外的单独的 git 命令来使用保存的但创建 merge -拒绝提交。这是一种相当扭曲的操作模式,不是人们通常会或应该做的事情。 (另外,这里不完全是推送创建 merge ,而是推送触发其他脚本,其他脚本创建 merge 。)

关于Git 一直在 merge ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31276991/

相关文章:

git - github是否在历史记录中保留已删除的远程分支?如果是这样,这些可以恢复吗?

git - 如何查找分支是本地跟踪分支还是用户创建的本地分支?

git - 从坏树对象中恢复?

php - 无法在我的 Laravel 项目中使用分支存储库 - "Could not find a matching version of package"

git - 如何知道 git 提交中删除了哪些文件?

git - git merge --no-ff 和 git merge --squash 有什么区别

sql - SQL Server 2005 的首选合并方法是什么?

r - 是否有更快的方法来合并数据帧并循环组合?

git - Difftool 打不开,命令行挂起

git - 为什么 Git 在一次 merge 上执行自动提交,而不是在另一次 merge 上执行自动提交?