Git重置和强制推送

时间:2014-12-04 10:15:36

标签: git push pull

状态:学习git。

我在两个系统中执行以下操作

系统1

git reset --hard "SHA Key"  
git push origin master # fails  
git push -f origin master # succeeds  

系统2

git pull origin master

我收到此消息"已经是最新的。"

系统1中更新/重置的任何原因都没有反映在系统2中?

2 个答案:

答案 0 :(得分:5)

原因是你可能会重绕大师。你离开了这个:

A --- B --- C --- D

对此:

A --- B --- C

系统2的本地主分支仍然看起来像第一张图片,而且 从Git的角度来看,它包含了所有起源大师的历史 因为您的本地分支已经包含提交A,B和C.

我发现解释这个的最好方法是有三个视图 GIT中:

1)您当地的分支机构。这些是您通常检查和操作的。 2)远程分支。这些是远程存储库上的实际分支。 3)远程分支的本地快照。这些都是你找到的    refs/remotes。它是可用的分支的副本    上次拉动它们时远程存储库。

当你这样做时:

git reset --hard "SHA Key"

您受影响1),本地主分支。

此:

git push -f origin master

更新了2)和3)。我的意思是远程存储库已更新 (refs/heads/master被分配了新的提交)。还有,在当地, refs/remotes/origin/master会与您的推送相匹配。

在系统2上,这个:

git pull origin master

表示获取远程主服务器的任何更新并将其应用于您的本地 科。作为该操作的结果,3)也被更新。 refs/remotes/origin/master 现在将指向远程服务器对主分支的相同提交。 但是,从Git的角度来看,你已经拥有了System的所有提交 2的本地主分支。你碰巧有另一个,D,那个 来自A,B和C的历史。换句话说,现在的样子是 系统2有一个额外的提交D. Git将不会回滚您的分支和原因 你失去了这项工作 - 它不明白你想让它消失 到处。它只在看台集合下(如数学类型)。你有 修改,所以你是最新的。

顺便说一句,这就是为什么你到处都会看到关于不强行推动的警告 您与他人分享的分支机构。复卷大师需要团队协调, 在一个足够大的群体中,这根本不可行。有人不会意识到什么 发生了,提交将会回来。或者,其他人会介入, 导致他们的推动失败,他们拉,导致有点傻看 历史,但提交仍将返回。

如果D导致问题,并且您已经与世界分享了,那么 git revert D是更好的选择。它没有遭受这些问题,但是 它确实意味着你现在有了历史的回归。这也意味着 D仍然在主人的集合中,恰好也是-D那个 撤消它。这有其他一些含义,但它可能太多了 放在这里与你的问题没有直接关系。

此外,如果系统1指向系统2,反之亦然,那么 我很惊讶Git并没有因为没有更新远程分支而对你大喊大叫 工作树。 git push不会更新另一台计算机上的工作树,并且 让你知道这一点并不害羞。如果它失败了,那么很可能是一个 错误。

答案 1 :(得分:0)

您将分支的HEAD重置为较旧的提交,然后将其作为该(主)分支的HEAD推送。

另一个存储库已经有了较旧的提交,因此当你执行git pull时,这就是为什么它已经说明已经是最新的 - 它已经有了提交。