Git push分散远程和本地分支

时间:2016-01-08 06:46:46

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

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

  1. 此时,两者都指向相同的提交,如下图所示。

    enter image description here

  2. 现在我再次向我的本地分支提交(git commit)并发送消息" test 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中使用消息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 and test commit 2都在同一文件中的相同位置进行更改。 Git尝试将test commit从远程合并到我的本地分支。由于我的本地文件有test commit 2,因此会产生冲突。

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

3 个答案:

答案 0 :(得分: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:选项,仅显示文件中更改的行数;使输出更短
  • 我创建了两个临时文件。这是一种解决方法,但我找不到更好的方法(尚)

答案 1 :(得分:1)

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

我写了一个预推钩,它做了如下的事情:

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

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

  4. 会发生什么,push命令实际上会在调用钩子之前找出要推送的内容。所以在我的情况下,转到远程的是未经修改的提交,而我的本地修改后的提交是最新的。这显然使我的当地人与偏远地区分道扬and,因此我发生了这种奇怪的事情。

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

    同样gitk HEAD @{u}证明非常有帮助。

答案 2 :(得分:0)

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