git:为什么我可以签出我删除的提交?

2023-12-15

我有一个包含三个提交的分支:

mybranch: a -> b -> c

我将其推送到远程仓库。然后我决定我不想保留提交b and c,所以按照描述删除它们here:

git reset --hard HEAD~1
git reset --hard HEAD~1
git push origin mybranch -f

后来我查了一下git log并确认只有提交a是可见的。然而:

  • 我仍然可以查看提交b and c。这是为什么?
  • 当我使用 SourceTree 查找我的 git 存储库时,我仍然可以在我的分支中看到这些提交(尽管当前提交a被正确表示为我当前正在进行的提交)。我使用 git bash 检查我是否处于正确的提交状态,并且我的 HEAD 未处于分离状态。

我使用的程序有什么问题?为什么它保留了提交b and c?我怎样才能完全删除它们?


实际上,在 git 中删除提交是相当困难的,从设计上来说。人们的许多命令think删除提交(例如变基或重置),实际上只是使这些提交“无法访问” - 导致各种命令和工具的默认输出将它们排除在外。

删除提交的理由值得付出代价的情况相对较少。有时提交包含敏感信息(不过,在这种情况下,最好总是考虑信息受到损害,无论您是否努力将其从存储库中删除)。也许某个提交包含任何其他提交中都不存在的过大的二进制文件,从而使存储库膨胀。如果它只是归结为想要“隐藏”一个“错误”以使存储库看起来很完美,我不会在上面浪费时间。

但如果您确实想删除该提交,那么您需要了解以下内容:

首先,您必须删除提交的所有知识。你的reset命令使其从您 ddi 的分支“无法访问”(通过父指针)resets。如果还有其他分支可以到达提交,则需要将它们reset or rebased远离提交(或删除)。如果已删除的提交上有标签,则需要移动或删除它们。在某些特殊情况下,其他参考文献可能指向提交,但我假设它们不适用。 (这将是诸如替换或来自的备份参考之类的事情filter-branch...基本上,如果您可以在以下位置找到任一提交的 SHA.git/packed-refs文件或以下任何文件中refs,那么需要采取一些措施来解决这个问题。)

一旦所有引用被删除,提交就会“悬空”;但仍然可以通过 reflog 访问它。您可以尝试使 reflogs 过期

git reflog expire --expire=all --all

我在这方面从来没有什么运气(这可能只是意味着我从来不记得正确的论点);我总是最终做类似的事情

rm -r .git/logs

无论如何,缺点就是你会输all您的转发信息。您可以更有选择地选择要过期的重新记录。 (你可能需要HEAD以及可以(或曾经)可以访问提交的任何分支。)您甚至可以使用delete代替expire寻找个别的重新记录条目。同样,这完全取决于您想为此付出多少努力。

因此,一旦没有引用和引用日志可以到达提交,gc可用于从本地存储库中物理删除提交。

git gc --aggressive --prune=now

但现在仍然存在一个问题:如果提交被推送过,那么远程仍然有它们;现在推送不会将它们从远程删除。 (推送更新远程引用,并根据需要,adds填充历史的对象;但它不会从远程删除对象。)

如果远程只是文件共享(或您控制的 Web 服务器,或其他)上的存储库:您可以登录服务器并以与清理本地服务器相同的方式清理它。 (如果您已经推送了引用,那么该部分已经完成;但是您可能必须清理引用日志,并且必须运行gc.)

如果远程是托管的(github、gitlab、TFS、bitbucket...),那么这取决于对哪些内容的访问gc是楼主提供的。在 TFS 中(至少是我用过的版本),你就在树上;最好的情况是您可以删除并重新创建存储库。其他主机服务器可能提供触发的能力gc,或者甚至可以运行gc某些事件后自动进行;您必须查阅托管服务/软件的文档。

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

git:为什么我可以签出我删除的提交? 的相关文章

  • 自动生成/删除詹金斯工作

    我正在寻找一种自动创建一组詹金斯作业的方法 通常在创建新的 git 分支之后 我已经为maven尝试过这个插件 http evgeny goldin com wiki Maven jenkins plugin http evgeny gol
  • 如何将 GIT 调用的输出获取到批处理脚本中的变量中?

    我有一个 git 命令来获取当前存储库的最新 SHA 如下所示 git log pretty format H n 1 我有一个 Windows 批处理脚本 我想按如下方式使用它 SET CURRENT SHA 但我不知道如何将从 git
  • 从自己的 gitlab 服务器安装节点模块

    我想从我们的 gitlab 服务器安装节点模块 这是存储库的链接 http ABCD GITLAB myGroup myNodeModule git http ABCD GITLAB myGroup myNodeModule git 根据n
  • 我可以忽略全局 .gitignore 吗?

    我的全局 gitignore 一般都很棒 但对于这个一次性项目 我不希望应用全局规则 如何删除这个怪异存储库的全局 gitignore 规则 在您的存储库中运行此命令 git config local core excludesfile f
  • $id:文件名、创建日期/时间 Exp $

    我经常在 C C 源代码中遇到以下语句 Id lzio c v 1 24 2003 03 20 16 00 56 roberto Exp Id file name version timestamp creator Exp 您知道哪些软件会
  • 更改先前提交的作者姓名:快进推送被拒绝

    我最近在 GitHub 上打开了一个存储库 我是 Git 新手 与新人一样 我使用默认名称和电子邮件进行提交 按照最佳菜鸟传统 我发现五次提交为时已晚 现在乐趣开始了 因为我开始搜索有关如何更改这些提交的作者和提交者名称的信息 美好的 我基
  • Git:以新名称签出旧版本的目录

    如何以新名称查看目录的先前版本 我一直都有一个目录foo在我的仓库中 我想创建一个目录foo old在我当前的工作树中 其内容是HEAD 2 foo 我同时需要两个版本 以确保它们给出相同的结果 测试这需要相当多的代码 并且需要同时提供两个
  • 如何恢复已删除的远程分支

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

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

    有没有办法使用钩子脚本在 Smartgit 中自动插入提交消息 重击 如果用户提交了他的更改 我想预加载提交消息字段 我没有看到任何SmartGit配置 http www syntevo com smartgit documentation
  • 合并后 Git 分支和提交历史记录

    我正在开发一个项目 单独 对于我开发的每个功能 我都会创建一个新分支 处理该功能 然后将其合并到 master 中 所以通常我不会同时在两个不同的分支上工作 也不会在一个分支上工作时接触master 当我合并一个分支时 我看到 使用gitx
  • 创建多个 git 分支的联合分支

    我希望能够在现有分支之上分层其他分支 并独立修改这些分支 这很有用 例如 允许将各个子项目的二进制文件统一到同一个项目中bin目录 一般来说 给定的文件仅存在于一层中 理想情况下 我想我会使用 unionfs 来完成此任务 但它必须以某种方
  • 如果您使用 CocoaPods,您的 .gitignore 中会包含什么内容?

    我从事 iOS 开发已经几个月了 刚刚了解到有前途的可可豆荚 http cocoapods org 用于依赖管理的库 我在个人项目上尝试过 添加了依赖项Kiwi https github com allending Kiwi到我的 Podf
  • 如何在源代码管理中存储 Visual Studio 的调试配置

    Visual Studio 的调试配置存储在 user文件是用户特定的并且传统上被源代码管理忽略 我对工作目录参数感兴趣 我需要它在程序员的机器上保持一致 并且它具有以下价值 outDir而不是默认的 ProjectDir 我怎样才能解决这
  • 为什么从网上下载Git 2.0,总是得到1.9.4的安装包?

    为什么从网上下载Git 2 0 总是得到1 9 4的安装包 为什么你不能在互联网上的任何地方找到一个不仅标记为 2 0 而且你下载的安装存档也标记为这样的 Git 安装程序包 例如 这个2 1 3 站点 http git scm com d
  • Git:忽略版本控制文件

    gitignore 文件对于忽略一些我们不想控制的文件非常有用 不幸的是 当文件已处于版本控制之下时 它无法使用 例如 我的 gitignore 已添加到 git 中 文件可能与我的同事想要的不同 例如我想忽略 Vim 文件 每当我对此文件
  • 如何使用 git 找到一个分支中但不在另一个分支中的所有提交?

    我有两个分行master and live Master是发展 分支并包含尚未准备好进入的提交live 如果在master需要进入的分支live树枝然后他们被樱桃采摘master to live 有时会做出承诺live分支然后是 樱桃摘入m
  • 在比较 Delphi 表单文件的版本时,如何使 Beyond Compare 忽略某些差异

    我使用Beyond Compare 版本3 1 10 来比较不同版本的Delphi Form Files 但我不想看到有关ExplicitTop ExplicitLeft ExplicitHeight 和ExplicitWidth 的差异
  • 我如何才能看到 Github 风格的东西,例如 git -repo 的打孔卡和时间线?

    我正在寻找一个可以可视化 git repo 工作的软件 我喜欢 Github 的一些功能和 Bitbucket 的一些功能 所以我不想使用它们 因为它们并不完美 我正在寻找创建类似视觉特征的方法 下面你可以找到一些部分 但仍然缺少很多谜题
  • 设置 git 别名,但调用它会给出“找不到命令”

    我想在 git 中设置一个别名来计算存储库中的总行数 因此我进入 Git Bash 并输入以下内容 git config global alias linecount ls files z xargs 0 wc l 我输入命令后 没有出现错

随机推荐

  • Heroku Node.js 应用程序“进程已退出,状态为 1”和错误 h10

    我将我的应用程序部署到 Heroku 上 没有任何问题 我能够跑heroku local web在 localhost 5000 上并且它有效 当我访问 web dyno 地址时 它说应用程序错误 我检查了该网站的日志 上面写着 2017
  • 使用 CGPoint 追踪长按手势的确切位置

    通过使用 CGPoint 位置 它始终保存 uiscrollview 中的最后一个图像 当我点击其他图像进行保存时 我该怎么做才能保存我点击的确切图像 UIScrollView imageScrollView UIScrollView al
  • Cypress 运行命令而无需重新运行测试

    只是想知道 假设我有一个已完成运行的冗长的柏树测试 有没有办法尝试新的 cypress 命令 比如 cy get tg tag should have css background color rgb 0 128 0 非常感谢 如果您的意思
  • IOS7:Pop ViewController 强制 UIImageView 掉落

    将我的项目升级到iOS7后 当我执行 后退 按钮并且 UINavigationController 返回到上一页时 屏幕顶部的 ImageView 会向下移动 我使用 IB 进行布局 这些是我的模拟指标 我有自动布局 关于问题可能是什么的任
  • Zend Framework 2:获取有序的 SQL 调用

    我一直在尝试获取一个字段的 ASC DESC 调用顺序 假设是 craeted 但我似乎不知道如何在 ZF2 中执行此操作 我哪里出错了 namespace Todo Model class TodoTable extends Abstra
  • MySQL:将多个文件加载到表中

    我一直在尝试将多个文件加载到表中 以便它们适合同一行 我可以单独插入它们 但问题出在NULL值 并且我计划加入此表 如果发生这种情况 我会得到太多NULL价值观 无用的数据 LOAD DATA LOCAL INFILE malefirst
  • SSL: CERTIFICATE_VERIFY_FAILED] 证书验证失败

    我正在使用 python 2 7 10 request urllib2 Request url data urllib urlencode params f urllib2 urlopen request 导致以下异常 urlopen er
  • 计算文件夹内的文件夹数量

    你能帮我看看如何计算文件夹内的文件夹数量吗 弹出FolderBrowserDialog 后如何计算子文件夹并选择由3 个文件夹组成的主文件夹 我在用着 FolderBrowserDialog fbdialog new FolderBrows
  • 使用 JNI 将 java 与 C 定时器库接口

    我正在尝试使这个简单的示例发挥作用 import java io public class Timer public static void main String args setTimer new Runnable public voi
  • 在树莓派中安装QtVirtualkeyboard?

    我尝试在 Raspberry pi 中实现 Qt Virtualkeyboard 使用PyQt5 显示虚拟键盘但我没有找到它的前缀路径 bin plugin等文件夹 实际上整个Qt文件夹不存在 In 我之前的解决方案我使用了官方提供的 Qt
  • 使用 PHP 作为守护进程是否明智?

    我希望创建一个后台进程 有人告诉我这些进程通常是用 C 或类似的东西编写的 我最近发现 PHP 可以用来创建守护进程 如果我应该以这种方式使用 PHP 我希望得到一些建议 这是我对守护进程的要求 不断检查一行是否已被 添加到 MySQL 数
  • R - 传单限制 - 传单地图支持多少个标记?

    Data 我有一个包含 35 000 个纬度 经度位置的数据框 这些地点已绘制在交互式传单地图上 情况 我想通过 Markdown 文档在线发布地图 问题 当我将地图导出为 html 页面或以 markdown 格式时 地图为 Laggy
  • Apache FOP 可以用于将任意 HTML 转换为 PDF 吗?

    我尝试使用 Apache FOP 将 HTML 转换为 PDF HTML gt XHTML gt XSL FO gt PDF 我使用 Antenna House 中的 xhtml2fo xsl 进行 xhtml gt XSL FO 转换 它
  • 检测Delphi FMX ListBox何时滚动到底部?

    我需要检测用户何时向下滚动到 ListBox 的底部 以便我可以获取接下来的 25 个项目以在 listBox 中显示 有什么提示吗 好的 让我们分解一下 首先我们去滚动到项目在 FMX ListBox 单元中 procedure TCus
  • Win32:API 调用以列出服务器上的可用网络共享?

    假设我可以访问 IP 1 2 3 4 的 SMB 服务器 我如何确定可用共享的列表 当我输入 UNC 路径 1 2 3 4 时 Windows 资源管理器可以执行此操作 但命令提示符 dir 1 2 3 4 失败 我尝试了通常的 FindF
  • Javascript JSON.stringify 无法正确处理原型?

    我一直在初始化我的可重用类 如下所示 构造函数通常是复制构造函数 function Foo Foo prototype a 1 Foo prototype b 2 Foo prototype c var obj new Foo obj c
  • 如何检测 php 中被阻止的地址

    所以这是我的问题 我们正在尝试在我们的网站上设置 facebook like 和 twitter 推文按钮 但当 facebook 和 twitter 在计算机上被阻止时 它会导致浏览器变得无响应 所以我想做的是检测 Facebook 或
  • 适用于 Android、iOS 和 Flash 的 WebSocket 库 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 有人可以提供一个在 Android iOS iPhone iPad 和 Flash 不是 Flex 中实现 WebSocket 的示例吗 我找到了一
  • 用于使用已知模式解析字符串中的值的 sscanf 的 Java 等效项是什么?

    所以我有 C 背景 最初是 C 语言 尽管我已经有近 5 年没有使用过该语言了 我正在尝试从 Java 中的字符串中解析一些值 在 C 中我会使用 sscanf 在Java中 人们告诉我 使用Scanner或StringTokenizer
  • git:为什么我可以签出我删除的提交?

    我有一个包含三个提交的分支 mybranch a gt b gt c 我将其推送到远程仓库 然后我决定我不想保留提交b and c 所以按照描述删除它们here git reset hard HEAD 1 git reset hard HE