【问题标题】:Git push diverges the remote and local branchGit push 将远程分支和本地分支分开
【发布时间】:2016-04-12 18:43:09
【问题描述】:

我有一个名为 source_report_overview_Approach3 的本地分支,并且在 github 上有一个远程分支,即 origin/source_report_overview_Approach3。

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

  2. 现在我向我的本地分支再次提交 (git commit) 并带有消息“测试提交”。这将我的本地分支向前移动,同时将远程保持在同一位置,如下所示:

  3. 现在我将此提交推送到远程 (git push origin source_report_details_Approach3)。据我了解,git 应该将remotes/origin/source_report_details_Approach3 移动到稍后的提交,即test commit,并且我的本地和远程分支应该是同步的,并且应该指向相同的test commit,但不知何故它做了如下所示的事情:

  4. 现在如果我做git status,它会给我以下信息: 我相信这不应该发生。不应该将remotes/origin/source_report_details_Approach3 更新为自动指向source_report_details_Approach3

  5. 我再次提交 (git commit),方法是在提交 test commit 和消息 test commit 2 中所做的相同文件中的相同位置进行更改。它使历史如下:

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

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

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

  9. 另外,我是唯一在分支机构工作的人。仍然因为这个问题,我几乎每次必须推送任何东西时都必须解决合并冲突。

【问题讨论】:

  • 图片丢失。
  • 听起来很不寻常。但是鉴于您是唯一在分支机构工作的人,如果您确定您的本地分支机构是完美的,那么是什么阻止您进行git push origin source_report_details_Approach3 -f
  • @venkatKA 图片在那里。尝试提神醒脑。我可以看到问题中的图片。
  • @venkatKA 当然可以。但问题是为什么会发生这种情况。它不应该。对吗?
  • 你的服务器有钩子吗?

标签: git version-control githooks git-push git-pull


【解决方案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 hook 只会修改消息。
  • 你是对的 :) 但我不知道如何只看到提交消息中的差异。我稍微调整了我的答案......有一个解决方法
【解决方案2】:

因此,在一些帮助下,我能够找出问题的根本原因。

我写了一个 pre-push 钩子,它做了如下的事情:

  1. 从历史中查找最后一条提交消息。
  2. 如果该消息中包含特定文本,则 git commit --amend -m "new message" 然后推送提交。

  3. 从逻辑上讲,#2 应该将修改后的提交推送到远程。但是这里的逻辑是违反的。

  4. 发生的情况是,push 命令实际上在调用钩子之前会计算出要推送的内容。所以在我的情况下,远程的是未修改的提交,而我的本地修改的提交是最新的。这显然使我的本地与远程有所不同,因此我发生了这种奇怪的事情。

值得一读的链接,帮助我发现 push 在调用钩子之前确定要推送的内容:don't commit in pre push hook

也证明gitk HEAD @{u} 确实很有帮助。

【讨论】:

    【解决方案3】:

    尝试git show-ref source_report_details_Approach3 并检查可用的引用以及相关的提交 ID。我怀疑您可能遇到与in this question 提到的类似的问题

    【讨论】:

      猜你喜欢
      • 2012-01-05
      • 1970-01-01
      • 2015-10-19
      • 1970-01-01
      • 2016-10-25
      • 2018-09-12
      • 2015-04-20
      • 2019-02-16
      相关资源
      最近更新 更多