我以某种方式设法创建了我对未命名分支中的存储库进行的每次提交的副本,如下面GitHub的网络图所示:
我该怎么做才能清理它并删除重复的提交?我查看了this post here,但它似乎更适用于单个重复项而不是整个重复分支。
其他信息: 我是存储库的唯一所有者和用户。当我从新计算机提交时,问题首先出现,但没有正确设置我的用户名和电子邮件地址。我使用方法posted here on GitHub纠正了这个提交。执行此操作后,系统会提示我从远程存储库拉到我的本地存储库,然后再推送一些其他更改,此时它会提取一组重复提交。
答案 0 :(得分:1)
如果通过未命名的分支你的意思是悬挂提交,那么git gc --prune=all
应该做的伎俩。但在运行此命令之前,请确保您没有任何这些命令,因为此操作是不可逆转的。
然后你可以执行git push --prune
删除没有本地对手的遥控器。
答案 1 :(得分:1)
从某种意义上说,Git根本没有未命名的分支。在另一种意义上,它有无数个未命名的分支。无论哪种方式,尝试显示所有这些 1 都是没有意义的 - 而GitHub网络图则没有。这不是GitHub网络图 的原因。
This is what a GitHub network graph is.它尝试(不完全成功,在我看来:-))显示多个相关(通过GitHub-fork,我推测)存储库的并集。因此,您所看到的不一定是您自己的存储库中的任何内容,而是跨越几个不同的存储库,可能包括您自己的一些存储库,但也许字面上所有完全位于其他几个存储库中。 可能在您的存储库中,但可能不是。您现有问题中没有足够的信息来诊断
由于Git主要通过添加新提交(同时保留每个旧提交,通过Git调用引用),大多数事情只需添加更多提交,你的网络图可能更多。 ElpieKay's answer to your linked question通过复制提交工作,这将会 - 并且确实 - 添加另一行,但确保第一个复制的提交具有返回某些现有提交的链接(这是rebase的--onto
目标),然后删除Git用于查找原始提交链的名称(这是git rebase
本身的最后一步)。
换句话说,这(至少在概念上 - ElpieKay的答案是针对某个特定情况,以合并提交结束,我不是在这里绘制)需要:
o--o--o--o <-- main-branch
*--*--* <-- side-branch
首先添加底行的副本,但链接返回顶部:
o--o--o--o <-- main-branch
\
*--*--* *--*--* <-- HEAD
(我省略了side-branch
标签,部分原因是为了节省空间,部分是因为它位于复制提交的“下方”:它仍然指向原始三次提交的最后一次。)一旦复制完成,我们通过改变一个分支标签“忘记”原来的三个,给出:
o--o--o--o <-- main-branch
\
*--*--* <-- side-branch
三个原始提交被精确地遗忘因为他们不再有一个名字side-branch
,指向他们的提示(最新)提交。
可以用两种不同的Git命令来完成这种事情,这些命令有不同的目标:
git rebase
将一些提交(通常是小而简单的)提交(最好是简单的线性链)复制到一组新的提交中,同时也为每个复制的提交更改存储的快照。这基本上等同于在每个要复制的提交上执行一系列git cherry-pick
。然后,正如我们刚刚看到的那样,它会移动分支标签,使其不是指向最后一个预复制提交,而是指向最后一个复制后提交。
git filter-branch
将一组任意提交(包括您喜欢的合并)复制到一个新集合中。在此复制期间,每个提取的提交快照都将根据您选择的任意过滤进行修改。这可能包括省略一些提交,创建新提交,更改提交的父链接,和/或对快照进行任意更改。因此, 比rebase更灵活,但很多 更难以使用(并且不太适合源树的那种)修改rebase是专门设计用于。
是否有任何帮助取决于GitHub向您展示的内容。由于网络图不仅限于您的存储库,因此无法保证做任何事情< em>在您的存储库中将改善您看到的任何内容。
1 每个提交都可以被视为匿名分支,或者甚至可以被视为无限数量的匿名分支(尽管后者没用,而前者有时是)。
有一段时间显示匿名分支是有意义的,就是在查看具有“分离的HEAD”的存储库时。这是因为分离的HEAD字面意思是名称HEAD
解析为一个特定的提交,使得一个特定的提交就像一个分支提示。实际上,HEAD
是此分支的名称。但HEAD
假定移动或“重新附加”。 (Your HEAD is there to move you around.)只要你移动它,提交就会停止成为匿名分支的提示。
在上面显示的rebase步骤中,我显示HEAD
指向复制的提示提交。事实上,Git是如何使用HEAD
作为匿名分支的尖端来进行rebase的。最后一步,移动原始分支的名称,永久地将副本粘合到位(永久性,也就是说,直到再次重新定位,或完全删除名称)。