我有一个名为source_report_overview_Approach3的本地分支,并且在github上有一个远程副本作为origin / source_report_overview_Approach3。
此时,两者都指向相同的提交,如下图所示。
现在我再次向我的本地分支提交(git commit
)并发送消息" test commit"。这会使我的本地分支向前移动,同时将遥控器保持在同一位置,如下所示:
现在我将此提交推送到远程(git push origin source_report_details_Approach3
)。这是因为我理解git应该将remotes/origin/source_report_details_Approach3
移动到后面的提交即test commit
,并且我的本地和远程分支应该同步并且应该指向相同的test commit
,但不知何故它会像如下所示:
现在,如果我git status
,它会给我以下消息:
我相信这不应该发生。不应该remotes/origin/source_report_details_Approach3
更新为自动指向source_report_details_Approach3
。
我做了另一次提交(git commit
),在同一个文件中的同一位置进行了更改,就像我在提交test commit
中使用消息test commit 2
所做的那样。它的历史如下:
我该如何解决这个问题。无论我对git知道什么,这都很奇怪。
如果我尝试使用git pull origin source_report_details_Approach3
拉动分支,则会出现合并冲突。这是因为test commit and test commit 2
都在同一文件中的相同位置进行更改。 Git尝试将test commit
从远程合并到我的本地分支。由于我的本地文件有test commit 2
,因此会产生冲突。
此外,我是唯一一个在分公司工作的人。仍然是因为这个问题,我几乎每次必须推送任何东西时都必须解决合并冲突。
答案 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
一些解释:
答案 1 :(得分:1)
因此,在一些帮助下,我能够找出问题的根本原因。
我写了一个预推钩,它做了如下的事情:
如果该消息中包含特定文本,则git commit --amend -m "new message"
然后按提交。
逻辑上,#2应该将修改后的提交推送到远程。但这里的逻辑是无视的。
会发生什么,push
命令实际上会在调用钩子之前找出要推送的内容。所以在我的情况下,转到远程的是未经修改的提交,而我的本地修改后的提交是最新的。这显然使我的当地人与偏远地区分道扬and,因此我发生了这种奇怪的事情。
值得一读的链接,帮助我发现push
确定在调用钩子之前要推送什么:don't commit in pre push hook
同样gitk HEAD @{u}
证明非常有帮助。
答案 2 :(得分:0)
尝试git show-ref source_report_details_Approach3
并检查可用的引用以及关联的提交ID。我怀疑你可能遇到类似问题in this question