在推送后检索孤立的提交对象 --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 的相关文章

  • 如何将普通的 Git 存储库转换为裸存储库?

    如何将 普通 Git 存储库转换为裸存储库 主要区别似乎是 在普通的 Git 存储库中 你有一个 git存储库内的文件夹 包含构成工作副本的所有相关数据和所有其他文件 在裸露的 Git 存储库中 没有工作副本和文件夹 我们称之为repo g
  • 如何使用 vim 作为“git show”编辑器?

    全部如所述如何使用 vim 作为 git log 编辑器 https stackoverflow com questions 16666009 how do i use vim as git log editor不适用于 git show
  • 获取最新远程提交的 SHA1 [重复]

    这个问题在这里已经有答案了 可能的重复 git bash 如何检查是否有新的提交可用 https stackoverflow com questions 6006759 git bash how to check if theres a n
  • 按时间顺序将多个文件夹提交到 git 中

    我有数百个网站备份 每个文件夹一个 我想将它们放入 git 存储库中 每个备份作为一个版本 这些变化主要涉及图像文件和每天 2 个数据库备份 大小约为 25 GB 并且不断增加 有没有办法告诉 git 获取其中一个文件夹并将其提交到存储库中
  • Git post-receive - 如何检查推送的分支是否与主分支合并

    在我们的团队中 我们通常将所有任务推送到单独的分支中 然后发布经理审查这些分支并将它们合并到 主 分支中 有时团队成员忘记将他们的分支与主分支合并 在推送之前 所以我想做的是 在用户推送后输出一条消息 请与主分支合并 我想我需要检查一些内容
  • 您的分支比“origin/master”领先 3 个提交

    我在运行时收到以下信息git status Your branch is ahead of origin master by 3 commits 我读过其他一些帖子 解决这个问题的方法是运行git pull rebase但是 rebase
  • 为什么“git描述-dirty”在描述干净结帐时添加“-dirty”后缀?

    我刚刚发现 dirty选项git describe看起来它应该做一些非常有用的事情 即在输出中附加一个后缀git describe当工作树脏时 但是在我的一些存储库上似乎并非如此 git status On branch 8 30 noth
  • SSL 适用于浏览器、wget 和curl,但不适用于 git

    我有一个网站 用于托管 redmine 和几个 git 存储库 这非常适合 http 但我无法使用 https 进行克隆 即 git clone http mysite com git test git 工作正常 但是 git clone
  • 将 Visual Studio 在线 Git 存储库集成到 Android Studio 1.0.2

    我正在使用 Visual Studio Online 进行开发过程 我想将我的 Android Studio 1 0 2 代码集成到其中 但是 据我所知 Android Studio 没有 TFS 插件 这就是为什么我想使用 Git 进行源
  • 更改先前提交的作者姓名:快进推送被拒绝

    我最近在 GitHub 上打开了一个存储库 我是 Git 新手 与新人一样 我使用默认名称和电子邮件进行提交 按照最佳菜鸟传统 我发现五次提交为时已晚 现在乐趣开始了 因为我开始搜索有关如何更改这些提交的作者和提交者名称的信息 美好的 我基
  • 如何使用 git --word-diff 显示空格差异?

    为了说明问题 参见diff https github com nim lang Nim commit 47c7fd037ed28b7de3d120b003d059d30e18f128 diff split diff 8af935b2312d
  • 如何让 git 显示作者日期指定日期范围内的提交?

    显然this https stackoverflow com a 11189286 281545 git log all after
  • 如何恢复已删除的远程分支

    我们的远程主分支被删除 我有主存储库的本地副本 但它已经过时了 我可以通过将最后一个已知的提交哈希值插入 URL 来查看 github 中的分支 但未能成功恢复它 我尝试了几个步骤来恢复它 git reset hard 16deddc05c
  • Git 中的数据完整性?

    我现在已经多次听到提到 Git 提供数据完整性 但是 这是什么意思 据我所知 git 中的所有对象都是使用 SHA 1 校验和来访问的 并且该校验和是根据文件的内容计算的 这意味着如果文件发生更改 您将得到不同的校验和 但这如何提供数据完整
  • 检查 Git 中是否需要 pull

    如何检查远程存储库是否已更改并且需要拉取 现在我使用这个简单的脚本 git pull dry run grep q v Already up to date changed 1 但它比较重 有没有更好的办法 理想的解决方案是检查所有远程分支
  • Smartgit:自动插入提交消息

    有没有办法使用钩子脚本在 Smartgit 中自动插入提交消息 重击 如果用户提交了他的更改 我想预加载提交消息字段 我没有看到任何SmartGit配置 http www syntevo com smartgit documentation
  • VS Code 在交互式变基期间不会等待我 [重复]

    这个问题在这里已经有答案了 如果我使用交互式变基git rebase i使用为 Git 配置的默认编辑器 一切都运行良好 如果我在我的全局中添加以下内容 gitconfig core editor C Program Files x86 M
  • Android repo 脚本创建的 .repo/projects/ 中的裸 git 存储库的用途是什么?

    The 安卓源码 http android git kernel org 由以下人员管理repo http source android com source version control html 使用 repo 同步时 一个名为 re
  • 删除 Xcode 项目的源代码控制

    我在 Xcode 项目上使用源代码控制已经有一段时间了 但现在我不想使用源代码控制 如何从 Xcode 中的项目中删除源代码控制 有三种方法 方法 1 将禁用所有项目的源代码管理 方法 2 将删除所有项目的单个存储库的链接 方法 3 将删除
  • 结帐时出现 Git 错误:“致命:引用不是树”

    当我决定弄清楚为什么我正在从事的项目如此重要时 这一切就开始了 我运行了以下脚本 git rev list objects all git cat file batch check objecttype objectname objects

随机推荐