删除某个提交记录,就像它从未存在过一样。

4
我有一个日志文件,看起来像这样:
c2ba4f3cfd3e8b29e634b41d7178ffe38f8c9f0a 版本 0.1 d825b48fe86107c3842f62c9e9bc5f290a2c2475 测试2 0a06037c3c29a0c9446707e884d9b2777336db59 测试 c7453d959fc86d2868076b3900e0fd1ed63e2709 开始
所有内容都已经推送到我的原始服务器,但我想以这样的方式合并提交,使它看起来好像我唯一做过的提交是带有注释“版本0.1”的提交。当我将其推送到服务器时,服务器必须反映提交合并。
简而言之,我希望仓库只有一个提交,其中包含我命名的提交的内容。
我尝试了整整一天的变基,但没有得到想要的结果。我该怎么做?

你不需要这样做。"所有内容都已推送到我的源服务器"。这意味着不要这样做。我想理论上每个人可能都是基于c2ba4f3cfd的代码,但如果他们从d825b48fe86分支出来或因某种原因需要该提交记录呢? - alternative
你错了,我一定会做的。另外,你在说谁呢?那个仓库唯一有权限访问的人是我 :) - user1598585
2个回答

4

必须说明的是:更改已推送到远程存储库的历史记录可能会给使用该存储库的其他人带来大量麻烦。

交互式rebase可以帮助你实现这一点。

# start an interactive rebase onto the parent (~) of 'begin'
git rebase -i c7453d9~

交互式变基会将你带入一个看起来像这样的编辑器:
pick c7453d9 begin
pick 0a06037 test
pick d825b48 test2
pick c2ba4f3 version 0.1

如果您想保留所有提交的更改,但让它们看起来像一个提交,请将其更改为以下内容:
reword c7453d9 begin
fixup 0a06037 test
fixup d825b48 test2
fixup c2ba4f3 version 0.1

reword会提示您更改提交消息(将其更改为“版本0.1”),而fixup将从提交中提取所有内容到上一个提交。最终结果将是包含所有四个提交内容的单个提交。

完成相同操作的另一种方法:

pick c7453d9 begin
fixup 0a06037 test
fixup d825b48 test2
squash c2ba4f3 version 0.1

squash 命令可以将一个 commit 的修改内容合并到前一个 commit 中,但是允许你更改提交信息(在这个例子中,改为 “version 0.1”)。

如果你想要完全放弃前三次提交的更改,只保留最后一次提交的更改,将 rebase 命令修改为如下形式:

pick c2ba4f3 version 0.1

基本上,删除前三行。最终结果将只包含“version 0.1”提交,没有任何来自之前提交的内容。

修改历史记录后,您需要使用--force强制向远程进行推送。请参考git-push文档。


通过 git rebase -i c7453d9~ 命令,我得到了 fatal: Needed a single revision, invalid upstream c7453d9~ 的错误提示。为了确认,我执行了 git status 命令,结果显示 nothing to commit (working directory clean)。请问我做错了什么吗? - user1598585
你应该检出“版本0.1”的提交,并且想要在其之前的提交上进行变基:git rebase -i <'begin'之前的提交> - ellotheth
关于fixup删除行之间的区别,你应该谈论一个提交所引入的“更改”,而不是提交的“内容”。提交的“内容”是文件系统在那个时间点的快照。如果我们删除行pick 0a06037 testpick d825b48 test2,并保留行pick c2ba4f3 begin,那么重定位后的文件系统内容将不会与提交c2ba4f3时完全相同;相反,它将看起来像d825b48c2ba4f3之间引入的更改加上c7453d9处的文件系统。修复程序 使它看起来就像c2ba4f3 - kostmo
我相信你已经理解了,但是在你的回答中术语可以得到改进。 - kostmo
@kostmo 我来澄清一下,但是有一个重要的前提:口语上,commits 已经成为了“引入变化”的概念简称(类似于 git cherry-pick)。对于历史记录的操作而言,将 commits 抽象为与父状态的差异而不是与父状态和父状态之间的差异更为有用。我认为“最近一次提交中的内容”很难被误解为“最后提交时文件系统的状态”,特别是因为第一个加粗的部分明确提到“所有提交中的所有更改”。 - ellotheth

0

您可以删除其中的提交记录。

git reset --mixed c7453d9
git checkout c2ba4f3cf -- .
git add -A
git commit -C c2ba4f3cf

我能否也删除第一个? - user1598585

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接