Doing push --force
总是有点冒险,这里有一个例子,说明它如何产生一些问题,例如远程丢失修订版本。
假设,有一个人Bob已更新远程master
分支来自B
to C
。还有另外一个人Mike还没有获取此更新并且HEAD
of his master
还是B
. Then Mike
do push --force
然后突然回滚远程master
to B
again:
mike@laptop $> git push --force origin
Counting objects: 19, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (12/12), done.
Writing objects: 100% (12/12), 2.27 KiB, done.
Total 12 (delta 8), reused 0 (delta 0)
remote: => Syncing... [OK]
To [email protected] /cdn-cgi/l/email-protection:path/to/project.git
C..B master -> master (forced update)
换句话说,之前Mike这样做了,远程大师就像A---B---C
他把它改为A---B
.
如你看到的,C
这里的修订仅是远程的 - 它存在于 git-server 和Bob的笔记本电脑,因为他把它推到了遥控器master
。这意味着没有这样的本地引用C
on the Mike的笔记本电脑。
问题1: 怎么能Mike设置远程master
回到C
?
Mike试图解决这个问题push --force
再次喜欢类似问题的回答 https://stackoverflow.com/q/1270514,但它不起作用,因为没有糟糕的本地引用:
mike@laptop $> git push --force origin C:master
error: src refspec C does not match any.
error: failed to push some refs to '[email protected] /cdn-cgi/l/email-protection:path/to/project.git'
问题2: 怎么能Mike fetch C
来自 git 服务器的修订?如果他做不到——为什么 git 会这样设计?在某些罕见情况下是否涉及安全?它到底能防止什么问题?
Usually fetch
仅检索分支和标签,但是C
不属于任何分支(这意味着没有任何远程分支C
是父提交或HEAD
of).
PS:我们假设Mike无法通过 ssh 访问 git 服务器,这意味着无法从服务器端调用 git。
PPS: Mike不想要Bob要了解那次事故,请回答“让Bob再次推动此提交”不是这个问题的目的。