从git中删除合并提交

时间:2017-08-08 13:24:35

标签: git

我想在Git存储库上进行合并提交。

如何真正从git中删除提交?

我的意思是删除一个没有提交的提交。我只是不希望它堵塞历史(并占用磁盘空间)。

请不要使用" git -i rebase"因为你不能使用rebase删除没有子提交的提交。

0 <-this is now HEAD and master
|
|  this is a different merge between the same branches, master and hotfix-1
| /
0   0 <-THIS is the commit I want to DELETE (incorrect merge)
|\ /|
| X |
|/ \|
0   0
|   |
|   |
|   |
|   0
|   |
|   |
|   |
0   0 <- this is start of branch hotfix-1
|  /
| /
|/
0
|

编辑:

请不要使用&#34; git reset - hard HEAD~1&#34;因为不会删除提交的提交

user@host /dir/subdir (master)
$ git checkout b605a0dd5e12e65081a2d8ffe7c905617b210605
Note: checking out 'b605a0dd5e12e65081a2d8ffe7c905617b210605'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:

  git checkout -b <new-branch-name>

HEAD is now at b605a0d... Merge branch 'hotfix-1'

user@host /dir/subdir ((b605a0d...))
$ git reset --hard HEAD~1 ## TRYING TO DELETE COMMIT
HEAD is now at 65e8158 Some commit message

user@host /dir/subdir ((Some tag))
$ git checkout b605a0dd5e12e65081a2d8ffe7c905617b210605
Previous HEAD position was 65e8158... Some commit message
HEAD is now at b605a0d... Merge branch 'hotfix-1'

user@host /dir/subdir ((b605a0d...)) ## COMMIT STILL THERE
$ 

2 个答案:

答案 0 :(得分:2)

如果提交没有引用它,例如分支或标签,然后提交无法访问并有效地从历史记录中删除。它最终将被垃圾收集并从存储库数据库中物理删除。

您可以通过运行git gc --prune=now来强制执行垃圾收集运行,这样就可以清除无法访问的对象。

请注意,您通常不需要执行此操作,因为无法在任何地方发送无法访问的提交,并且只会临时存在于您的存储库中。保持无法访问的提交将帮助您恢复提交,以防出现问题并且分支指针丢失。因此,除非您确实遇到内存问题,否则我个人不建议您修剪您的存储库。

答案 1 :(得分:1)

正如poke正确地告诉你的那样(尽管你不屑一顾),没有任何引用它的提交可以被垃圾收集,并且没有“更直接”的命令来删除提交而不是gc

问题当然是, 仍然可以引用该提交。那个“东西”就是参考日志。

坚持消除所有错误痕迹的虚荣心是浪费精力。问题(例如它)将随着时间的推移而自行消失(因为reflog将过期,然后gc将赶上提交),同时单个合并提交甚至不太可能占用重要性磁盘空间。

这并不意味着它是不可能的,但它需要付出代价。你可以

(A)擦除您的reflog,然后运行gc。当然,您必须确保丢弃可能指向违规提交的任何 reflog。那个至少 HEAD reflog和发生合并的分支的reflog。您可能会在此过程中丢失有用的reflog历史记录。

(B)创建一个新的克隆。假设您在推送之前修复了合并,那么合并提交不应该出现在原点上。任何新的克隆都不会包含提交。 (他们也没有任何你的reflog历史,所以这实际上相当于(A)。)