在推送后检索孤立的提交对象 --force

2024-05-22

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再次推动此提交”不是这个问题的目的。


任何有承诺的人C本地可以使用git branch some-name C给予C一个名字,然后git push origin some-name:master到(尝试)追加C回到原点大师。

任何没有的人C无法恢复C根本不存在(即使它位于 origin 的对象存储中)。

Mike cannot修复问题,除非使用包含提交的存储库C(可能是共享的,也可能是Bob的,可能是其他一些被克隆的存储库C是在主人)。

您无法推送本地没有的提交。本地的一半git-push必须能够遍历历史记录来找出要上传的对象,如果没有可用的历史记录,它就无法做到这一点。

您无法获取无法从 refs 访问的提交,因为实际上每个 git 安全层都是在逐个引用的基础上实现安全性,而不是逐个对象的基础上,并且因为没有真正的理由来引用远程松动物体。 Git 的远程处理层完全是围绕复制引用构建的。

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

(c) irc://freenode/#git,奥雅各布森

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在推送后检索孤立的提交对象 --force 的相关文章

  • 如何使用 LibGit2Sharp 从 Git 获取更改?

    下面的代码将 Git url 克隆到测试目录 var url http abc 555 com team project 555 git var path E temp 555 var credential new Credentials
  • 设置单独的遥控器以仅推送和拉动子文件夹

    假设我有两个存储库 repo A and repo B 其中包含一个文件夹 其中的代码与存储库 A 中的代码类似 这实际上如何发生并不重要 但是好吧 让我们假设我刚刚从 A 复制了内容 现在我想要以下内容 就像我在 repo A 中习惯的那
  • 执行 git stash 、 git checkout mybranch 、 git stash pop 的管道命令是什么?

    我想创建一个执行以下操作的脚本 1 git 存储 2 git checkout myBranch 3 git stash 弹出 有哪些 git 管道命令可以替代上述 git 瓷器命令 Edit 根据 Mark Adelsberger 和 T
  • 未签出...捆绑安装无法修复帮助!

    https github com intridea omniauth git at master is not checked out Please run bundle install Bundler GitError 那我该怎么办 捆绑
  • git reword 在变基期间显示合并冲突,但是 pick 工作正常

    我正在尝试用很少提交的另一个分支来重新建立一个分支 虽然提交包括合并提交 但我可以使用以下命令成功地对其进行变基git rebase i r m
  • 如何从 git 存储库中删除作者?

    如果我创建一个 Git 存储库并公开发布它 例如在 GitHub 等上 并且我收到存储库贡献者的请求 无论出于何种原因删除或隐藏他们的名字 有没有一种方法可以轻松做到这一点 基本上 我有这样的请求 可能想将他们的姓名和电子邮件地址替换为 匿
  • 我应该如何将更改从一个提交转移到另一个提交?

    我在同一个分支上有两个提交 一个接一个 我在第一次提交中添加了对文件 A 的更改 然后对其他文件进行了一些更改 然后进行了另一次提交 现在我希望对文件 A 的更改是在第二次提交而不是第一次提交 最优雅的方式是什么 我知道这是一个老问题 但我
  • Git 只获取一个目录

    我有一名开发人员负责一个文件夹 另一名开发人员负责另一个文件夹 我想使用特定文件夹更新产品 我正在寻找类似的命令 cd myproject git pull myfolder 并期望只有 myfolder 会被更新 是否可以 好吧 我重新表
  • 未找到 Gradle DSL 方法:“versionCode()”

    构建我的 Android 项目时遇到问题 我使用Grgit https github com ajoberstar grgit填写versionCode and versionName在 gradle 中 一切工作正常 直到我将 Andro
  • 本地分支显示在 GitHub 的“网络”视图上

    我们使用 Git 我们的工作流程由 dev 和 master 分支组成 它们位于 GitHub 和每个开发人员的本地存储库上 不会直接在 master 或 dev 上执行任何工作 而是在本地分支中执行工作 并且仅在 dev 上进行合并 然后
  • 为什么 --first-parent 不是 git show 的默认值?

    我确信这个问题将作为基于意见的问题而结束 但没有其他地方所以问它 所以这里 我正在尝试查看我的分支的历史记录 其中包括合并提交 特别是更改的内容 我在这里找到了一篇非常有用的帖子git 显示合并提交 https stackoverflow
  • git svn 克隆特定分支并合并

    我希望将我的代码库从 svn 迁移到 git 我的 svn 仓库中有太多分支 我只想克隆几个分支并将它们合并在一起并将其推送到 git 我想避免克隆所有分支 因为这需要很长时间 我该如何实现这一目标 完成后 我想定期从这些 svn 分支获取
  • 使用 reposurgeon 将 svn repo 转换为 git

    我正在尝试使用 svn repo 转换为 git再生外科医生 http www catb org esr reposurgeon 这是我所做的 有一个具有 svn 名称 gt git 名称映射的 repo map 文件 svnadmin d
  • 如何使用 github 托管外部 CSS 文件?

    我将 css 上传到 github 然后转到网站上的文件并单击 raw 选项 我尝试将其添加到网页中 但 chrome 给出以下错误 资源解释为样式表 但使用 MIME 类型 text plain 进行传输 https raw github
  • 如何对私有 jelastic 环境进行版本控制

    为了跟踪 Jelastic 托管环境的配置 我想在 git 存储库中对其进行版本控制 该存储库应该是私有的 并包含多个具有不同版本的不同分支 例如master abc123 v1 1 我的第一次尝试是创建一个私有 github 存储库 其中
  • 我如何知道哪些文件已在 git 中标记为“假设未更改”

    这个答案 https stackoverflow com a 936325 554807向您展示如何将 git 管理的文件标记为 我不希望从该文件的存储库进行更改 IE 拥有该文件的您自己的本地未跟踪版本 即使它仍然受到 git 的修订控制
  • 克隆/推送 Git Repos 时出错 443:访问错误,但未使用代理

    当使用 git 远程存储库进行这些操作克隆 推送时 我遇到了非常奇怪的问题 假设我正在尝试将更改推送到远程存储库 git push origin master 然后我会得到这个错误 致命 无法访问 Remote Repo 无法连接到 git
  • 删除 git Branch -a 列出的分支

    命令git branch a列出了一堆不在存储库上且不在本地分支上的分支 这些怎样才能删除呢 develop master remotes origin cloner 例如 remotes origin cloner曾经存在于存储库中 但它
  • Git 中的错误 - 致命:“/Users/username/Downloads/folder_name”位于存储库之外

    当我向 git 添加新项目时 出现此错误 Error fatal Users username Downloads folder name is outside repository 如何摆脱这个错误 我想 我需要给出当前的工作目录 但是
  • “无法同时更新路径和切换到分支”

    我有时会使用checkout b创建新分支的选项 同时将其签出并在一个命令中设置跟踪 在新环境中 我收到此错误 git checkout b test track origin master fatal Cannot update path

随机推荐