状态:学习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中?
答案 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时,这就是为什么它已经说明已经是最新的 - 它已经有了提交。