Git推送使远程分支和本地分支发生分歧

3

我有一个本地分支,名为source_report_overview_Approach3,github上有它的远程对应分支origin/source_report_overview_Approach3。

  1. 在一个点上,两个指针指向同一个提交,如下图所示。

    enter image description here

  2. 现在我使用消息“test commit”对本地分支进行另一次提交(git commit)。这将使我的本地分支向前移动一次提交,同时保持远程分支不变,如下所示:enter image description here

  3. 现在我将此提交推送到远程(git push origin source_report_details_Approach3)。据我所知,git应该将remotes/origin/source_report_details_Approach3移动到后面的提交,即test commit,然后我的本地和远程分支应该同步,并且应该指向相同的test commit。但是它以某种方式做了如下所示的事情: enter image description here

  4. 现在如果我执行git status,它会给我以下消息: enter image description here 我认为这不应该发生。remotes/origin/source_report_details_Approach3不应该自动更新以指向source_report_details_Approach3吗?

  5. 我在同一文件的同一位置进行了另一次提交(git commit),消息为test commit 2。它使历史记录如下: enter image description here

  6. 现在我尝试推送此提交(test commit 2),然后我会收到以下错误: enter image description here enter image description here

  7. 我该如何解决这个问题。根据我对git的了解,这很奇怪。

  8. 如果我尝试使用git pull origin source_report_details_Approach3拉取分支,则会出现合并冲突。这是因为test commit和test commit 2都在同一文件的同一位置进行更改。Git尝试将远程的test commit合并到我的本地分支中。由于我的本地文件有test commit 2,所以会出现冲突。

  9. 此外,我是唯一在该分支上工作的人。尽管如此,由于问题的原因,我几乎每次推送任何内容都要解决合并冲突。


图片丢失了。 - venkatKA
你的操作看起来是合法的;如果这些是你唯一执行的命令... 这可能是行结尾的问题... 两台机器都是Linux还是Windows,或者一台是Linux另一台是Windows? - Chris Maes
1
你的服务器上有任何挂钩吗? - Chris Maes
要查看第3步后的差异,您可以使用以下命令;这可能会指示问题:git diff origin/source_report_details_Approach3 - Chris Maes
@ChrisMaes,老兄,我相信你已经指出了问题的根源。我有一个预推钩子。我查看了它的代码,并发现它实际上执行了git commit --amend -m "some message"。然后我在SO上读到了git commit --amend确实会对历史记录做一些事情。我正在寻找解决方案,并会尽快更新。谢谢。 - Gaurav Kumar
显示剩余5条评论
3个回答

1

看起来问题是由于服务器端的钩子引起的。如果这些钩子改变了提交,则远程提交和本地提交之间肯定会有差异。您可以像这样检查本地提交和远程提交之间的差异:

git diff origin/source_report_details_Approach3

注意:此功能仅显示已更改文件之间的差异,而不是提交消息之间的差异。我不知道查看提交消息差异的简便方法,但您可以使用以下方式自行查看:

git show --stat source_report_details_Approach3 > local
git show --stat origin/source_report_details_Approach3 > remote
diff local remote
rm local remote

一些解释:

  • git show:显示包括消息在内的完整提交
  • --stat:选项只显示文件中更改的行数;使输出更简洁
  • 我创建了两个临时文件。这是一种解决方法,但我还没有找到更好的方法(暂时)

git diff origin/source_report_details_Approach3。这只显示本地和远程分支之间代码的差异。在我的情况下,pre-push钩子仅修改消息。 - Gaurav Kumar
你说得对 :) 但我不知道如何仅查看提交消息中的差异。我稍微调整了我的答案...使用一个解决方法。 - Chris Maes

1
所以在得到一些帮助后,我能够找出问题的根本原因。
我写了一个 pre-push 钩子,其作用如下:
  1. 从历史记录中查找最后一次提交的消息。
  2. 如果该消息中有特定的文本,则 git commit --amend -m "new message" 然后推送提交。

  3. 逻辑上,#2 应该将修改后的提交推送到远程。但是这里的逻辑被打破了。

  4. 发生的情况是,push 命令在调用钩子之前实际上会确定要推送什么。所以在我的情况下,推送到远程的是未修改的提交,而我的本地最新提交是修改后的提交。这显然使我的本地与远程分离,因此出现了这种奇怪的情况。

链接值得阅读并帮助我找到了这个问题:不要在 pre-push 钩子中提交 另外,gitk HEAD @{u} 非常有帮助。

0
尝试运行 git show-ref source_report_details_Approach3 命令,并检查可用的引用以及相关联的提交 ID。我怀疑你可能遇到了与这个问题中提到的类似的问题。

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