在push --force之后检索孤立的提交对象

ДМИ*_*КОВ 6 git

push --force总是有点冒险,这里有一个例子说明它如何产生一些问题,比如远程修改版本.

假设,有一些人鲍勃已经进行了远程更新master从分支BC.并且还有另一个人迈克没有获取此更新HEAD,他master的仍然是B.然后Mikepush --force并突然再次master向远程回滚B:

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 git@gitserver.com:path/to/project.git
   C..B  master -> master (forced update)
Run Code Online (Sandbox Code Playgroud)

换句话说,在Mike做到这一点之前,远程大师就像是A---B---C,他把它改成了A---B.

正如你所看到的,C这里的修订只是远程的 - 它存在于git-server和Bob的笔记本电脑上,因为他把它推到了遥控器上master.这意味着Mike的笔记本电脑C上没有这样的本地参考.

问题1:Mike如何将远程设置masterC

迈克已经尝试再次解决这个问题,push --force就像类似问题提供答案一样,但它不起作用,因为没有糟糕的本地参考:

mike@laptop $> git push --force origin C:master
error: src refspec C does not match any.
error: failed to push some refs to 'git@gitserver.com:path/to/project.git'
Run Code Online (Sandbox Code Playgroud)

问题2:Mike如何C从git服务器获取修订版?如果他不能那样做 - 为什么git这样设计?在一些罕见的情况下是否涉及安全?它究竟阻止了什么问题?

通常只fetch检索分支和标记,但C不属于任何分支(这意味着没有任何C父提交或远程分支HEAD).

PS:我们假设Mike没有对git服务器的ssh访问权限,这意味着无法从服务器端调用git.

PPS:迈克不希望鲍勃知道这个意外,所以回答"让鲍勃再次推动这个提交"并不是这个问题的意思.

ДМИ*_*КОВ 10

任何C在本地提交的人都可以使用git branch some-name C提供C名称,然后git push origin some-name:master(尝试)C追溯到原始主人.

任何没有的人根本无法C恢复C(即使它在原始的对象存储中).

麦克 不能修复该问题,除了使用包含提交回购C(可能是共享的一个,有可能鲍勃的,可能时被克隆一些其他回购C是在主站).

您无法推送本地没有的提交.当地的一半git-push必须能够走历史来确定要上传的对象,如果它没有可用的历史记录,它就无法做到.

你无法获取无法从refs访问的提交,因为字面上每个git安全层都在ref-by-ref的基础上进行安全性,而不是逐个对象的基础,并且因为没有真正的理由可以引用远程松散的物体.Git的远程处理层完全围绕复制refs构建.

但是,如果服务器启用了该功能,您可以使用git-archive获取任意提交的内容.大多数都没有,即使你的,也没有足够的信息来重建提交对象.

(c)irc:// freenode /#git,ojacobson


小智 9

如果使用的是GitHub上,你可以遵循的步骤在这个岗位上创建提交一个分支C已经成为孤儿后.

  • 答对了!很高兴为GitHub提供解决方案,即使OP没有具体提及它. (2认同)