首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何删除第一个N提交?

如何删除第一个N提交?
EN

Stack Overflow用户
提问于 2018-06-07 12:43:43
回答 1查看 1.3K关注 0票数 2

如何删除第一个N提交,并保持其余的提交不受影响?

换句话说。我想在第n-提交点拆分回购,从n+1开始开始提交,从第1到第n放弃提交。

我不知道如何做到这一点。只试过git rebase,但没有起作用。

下面是我对git rebase所做的工作。

例如,用于测试的回购程序是https://github.com/danistefanovic/build-your-own-x.git

  1. 运行git rebase -i --root
  2. 将前20次提交标记为已删除 D 4b6d12e初始提交d f81138e添加链接到发布表单d 3530d91 Update README.md d 506b834 Update README.md d 79f41aa更新README.md d f9f9113 Update README.md d 9c8f134添加资源类型d 133469b更新ISSUE_TEMPLATE d 3a47f54添加教程#1 d 0271577添加教程#2 d 525953b添加教程#3 d 2796fe5 Update ISSUE_TEMPLATE d 4f58667更新链接语言从Go到Node.js d 0c525a7添加教程#5 d 0484fca添加操作系统:构建一个用于ARM d 457d5bb添加教程#9 d 41ba7bb添加教程#9 d 41ba7bb的最小多任务内核添加教程#12 d cd3bd26添加教程#13 pick c5f6c94自述:添加我的关于外壳选择1f3c285的教程添加一个最小的解释器,编译器(x86/Arm)和JIT编译器.
  3. 不走运。我必须手动处理冲突。 $ git重基-i -根错误:无法应用c5f6c94.自述:添加我关于shell的教程,手动解决所有冲突,将它们标记为"git /rm ",然后运行"git继续“。您可以跳过此提交:运行"git重基--跳过“。若要中止并返回“”之前的状态,请运行“abort”。不能应用c5f6c94859d852797c26d815e438e6a697c137a9.自述:添加关于shell的教程

更新

Remove / cut off Git's revision / commit history复制

但没有找到保留时间戳的方法。

EN

回答 1

Stack Overflow用户

发布于 2018-06-07 13:09:12

首先,您是试图删除前20次提交,还是删除第一次之后的20次提交?正如您在发布的TODO列表中可能注意到的那样,commit 4b6d12e没有列出,因此即使操作有效,它也不会受到影响。这是因为您指定4b6d12e作为上游。如果您想包含它(如果它没有父级,因为您说要删除前20次提交),可以使用--root选项,这样就不必将提交指定为upstream

其次,如何定义“删除提交”?如果提交A添加file1,提交B添加file2,而我“删除”提交A,那么只剩下提交B' - B'应该包含file1和file2,还是只包含file2?

如果提交B' 应该只包含file2 -这意味着您要删除提交A及其引入的更改-那么使用d选项进行交互重基是一种方法。但是,这当然会导致您必须手动解决的冲突;在您保留的每个提交中,任何修改现在不再创建的文件(因为它最初是由您删除的提交创建的)都是冲突。git无法推断出您希望它做什么,所以您必须手动解决冲突。您的问题跟踪的方式表明,您希望这个过程是自动的,但是如果您要删除回购的创建提交以及它们的更改,那就不可能是自动的。

请注意,这是一个历史重写。如果回购是与其他人共享的,并且分支甚至已经被推送(在包含前20次提交之一的时候),那么

(a)您必须使用push -f来更新远程设备,并且

(b)在更新了遥控器后,您将使所有其他用户处于中断状态,从这个状态中,错误的修复过程将撤消您的更改;因此,您必须与所有其他可能受影响的用户进行协调,如果您希望这样做的话。

另一方面,如果B' 应该包含两个文件--在这种情况下,它应该被称为AB而不是B' --那么您想做两件事中的一件:

一种选择是squash提交而不是delete them1。这只是对rebase -i TODO列表中的每个提交使用不同的命令的问题。如果您所做的只是压缩提交,那么就不应该有任何冲突;但是这仍然是历史重写,所以上面的注释仍然适用。

另一种选择是创建回购的浅克隆。这不是一个历史重写;它的主要优点是保留提交身份,这样没有人的回购被破坏(而且作为一个副作用,您可以在未来重新关联删除的历史,如果有必要的话)。请参阅depthshallow-*选项git commithttps://git-scm.com/docs/git-clone

尽管如此,通过推拉,你并不能真正分享浅薄。如果远程服务器需要删除提交,则必须用一个浅的(大概是镜像的)克隆来替换该遥控器。clone2说,这将取决于拥有克隆人的彼此用户的更新。

1我实际上不喜欢rebase命令的这个术语,因为它助长了这样一种误解,即提交是由其修补程序定义的,在物理级别上是完全错误的。但是,这就是rebase使用单词的方式。

最后一点也强调了一个可能的问题:无论你选择什么方法,你都不能强迫别人放弃他们克隆的那些提交。所以如果你要删除它们,比如说,因为它们包含敏感的数据,那么猫可能已经被拿出来了。例如,您应该将任何曾经被推送到共享回购中的凭据视为已泄露的凭据。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50741558

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档