如何使用不同的提交消息删除多个完全相同的提交?

时间:2015-09-28 12:01:10

标签: git

enter image description here

我在我的存储库中有这些提交。这三个完全相同,只是提交消息不同。这些提交不是最新的提交。如何删除上面两个提交?

我独自工作,没有人在我旁边使用这个回购。

2 个答案:

答案 0 :(得分:2)

鉴于上述信息,我无法确定这一点,但您可能不需要删除任何内容。

如果要删除某些内容,则实际上并不是那些提交。

首先,让我们在这里注意一些关于git的有趣内容:git从不删除任何内容。

“什么,永远不会?”

“不,永远!”

“什么,永远不会?”

"Well, hardly ever!"

这里的秘密是git 最终会在其自动"garbage collection"期间清除“未引用的对象”(包括提交)。所以这真的是一个“git中'引用'含义是什么意思?”的问题。

简短的回答是引用是外部标签 - 通常是分支名称或标签,但还有更多 - 指向“提交”。要获得更好的答案,您可以开始here,或者在“像git一样思考”网站的顶层。

现在,您发布的图形片段有三个起点,都具有相同的单行提交主题。所有这三个起点似乎(基于图片片段)指向共同的先前提交。

这是在遵循“开发线”时开始的三种不同方式。这对于绘图程序来说非常典型,所以我认为绘制这个图的程序找到了对这三个起点提交的三个不同引用。这里的内容是这些引用是什么。

其中一个肯定是你的HEAD /当前分支。 (Git的HEAD是一个特殊的引用,保存在文件.git/HEAD中,通常包含当前分支的名称。这就是git知道你所在的分支:git checkout master写的分支名masterHEAD文件中。)

其他两个参考文献是什么,我不知道。如果你可以让你的图形显示器告诉你哪里它找到了那些提交,那就告诉你。但是,它们可能来自当前分支的“reflog”,特别是如果您已经完成了一些git commit --amendgit rebase操作。因为git没有(并且字面上可以没有)更改提交,所以似乎git commit --amendgit rebase等命令会更改提交,实际上只是make提交的新的,稍微不同的副本。旧的提交仍然落后,仅通过保留引用的“reflog”条目来记住,以便提交不会被垃圾收集(尚未)。 (这些reflog条目通常对命令行git是不可见的,因此它们不会像这样显示以使您感到困惑。最终,旧的reflog条目到期并被清除,之后在垃圾收集期间也会清除保留的提交。 )

在任何情况下,最终都是删除的问题,而不是提交本身,而是引用。在这样的情况下,参考指向像两个额外副本一样“独立”的提交,没有太大的区别可以做 - 但在更复杂的情况下,引用可能指向“提示”提交,即更长链提交的一部分,你想要保留一些(但不是全部)链,然后它确实很重要(并且变得更复杂,因为 - 这是一个设计功能 - git 仍然无法更改存储库中的任何内容。)

答案 1 :(得分:1)

  

我建议压缩提交,你可以通过交互式rebase来实现   接口

Squash my last X commits together using Git

例如,如果您有2次提交,则可以使用交互式rebase将它们压缩并合并为一次。见下面的命令:

$ git rebase -i HEAD~n

例如,您想要压缩2个提交:

$ git rebase -i HEAD~3

现在,you see an interactive rebase interface,您可以在第一次提交时写下 reword / pick 并压缩其余部分。请参阅此视频以便更好地理解。

Squashing commits