如何删除第一个N提交,并保持其余的提交不受影响?
换句话说。我想在第n-提交点拆分回购,从n+1开始开始提交,从第1到第n放弃提交。
我不知道如何做到这一点。只试过git rebase,但没有起作用。
下面是我对git rebase所做的工作。
例如,用于测试的回购程序是https://github.com/danistefanovic/build-your-own-x.git。
git rebase -i --root更新
与Remove / cut off Git's revision / commit history复制
但没有找到保留时间戳的方法。
发布于 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列表中的每个提交使用不同的命令的问题。如果您所做的只是压缩提交,那么就不应该有任何冲突;但是这仍然是历史重写,所以上面的注释仍然适用。
另一种选择是创建回购的浅克隆。这不是一个历史重写;它的主要优点是保留提交身份,这样没有人的回购被破坏(而且作为一个副作用,您可以在未来重新关联删除的历史,如果有必要的话)。请参阅depth和shallow-*选项git commit。https://git-scm.com/docs/git-clone
尽管如此,通过推拉,你并不能真正分享浅薄。如果远程服务器需要删除提交,则必须用一个浅的(大概是镜像的)克隆来替换该遥控器。clone2说,这将取决于拥有克隆人的彼此用户的更新。
1我实际上不喜欢rebase命令的这个术语,因为它助长了这样一种误解,即提交是由其修补程序定义的,在物理级别上是完全错误的。但是,这就是rebase使用单词的方式。
最后一点也强调了一个可能的问题:无论你选择什么方法,你都不能强迫别人放弃他们克隆的那些提交。所以如果你要删除它们,比如说,因为它们包含敏感的数据,那么猫可能已经被拿出来了。例如,您应该将任何曾经被推送到共享回购中的凭据视为已泄露的凭据。
https://stackoverflow.com/questions/50741558
复制相似问题