如何在Git仓库中清除无用的提交?

6

当我在调查一个错误时,有时候我并不会认真工作,特别是当我需要挖掘许多提交的分支时。

希望一旦我完成了这些操作,我会使用git merge yeah_i_got_it将工作结果合并到我的主干分支中。 在这种情况下,我的存储库可能如下所示:

    v There is a bug here
A---B---C----------------------------------------------F (master)
     \                                                /
      o---o---o--o--o (bug)                          /
               \                                    / 
                o---o--o--o (oups_this_way_better) /
                     \        v Clean a bit       /
                      o---D---E------------------o (yeah_i_got_it)    
                          ^        
                          Solved the bug here

最终我希望每天只保留一些相关的提交记录:

A--B--C--D--F (master)

关于其余部分,它只是垃圾,我不需要它。那么,如何处理这个令人不愉快的工作流程呢?
因为Git即使在删除所有垃圾分支后仍然保留一切,给每个提交分配一个重要性标志是Git的一个有用选项,以帮助我在忙碌之后清理我的存储库。在我的存储库中,我可以识别出无用的提交、可能有用的提交、肯定有用的提交,最后但并非最不重要的是我需要保留的非常重要的提交及其分支。
摆脱无用的提交通常需要我很长时间。我需要回顾我的日志,确定我想要消除的内容,并且不能犯错误。
所以我的问题是:
如何彻底从我的Git存储库中正确地消除临时提交和分支?
以下是一些随机想法:
- 我的工作流程很糟糕,我永远不应该这样工作。 - 只需向每个临时提交的注释添加前缀,如“junk”或“garbage”。 - 可能存在本地Git解决方案,可以帮助我完成工作,例如 `git rebase-and-clean yeah_i_got_it --keep D`。

3
您可以将所有“垃圾”提交压缩为一个提交。更好的方法是,您可以挑选出您想要的提交。 - Justin Wood
"...有时候我工作不够仔细..." 解决这个问题,大部分相关问题都会消失... - twalberg
3个回答

2
要达成你所提的目标,需要在C处检出主分支,然后执行git merge --squash yeah_i_got_it。这将把整个分支合并为一个提交。
另一种方法是以交互式方式重新基于提交,从yeah_i_got_it分支执行git rebase -i master。在交互式重新基于中,你可以将E标记为“fixup”。如果其提交消息以“fixup!”开头并且已设置相应的git配置选项,则标记将自动完成。
注意:你说你想要A-B-C-D-F,但我认为你实际上只需要A-B-C-D。没有必要进行“F”提交。

1

在合并到主分支之前,重置所有提交记录(因为其中大部分都是无用的)。

git reset $(git merge-base --fork-point master)

然后,以一致的方式将您的更改添加到索引中。这意味着应该添加更改,以便每个更改都可以用一行描述。这样,您就不需要许多内联注释,而是依靠提交注释。

如果需要,可以逐行添加更改

git add -p

完成后,如果主分支已移动,请将其变基到主分支,然后进行合并(我更喜欢使用非快进式合并以展示主分支的实际更改)。
git rebase master
git checkout master
git merge --no-ff @{-1}

重置并添加,太棒了! - jthill

0

The repo's current situation (full of garbage commits)

你可以将所有这些提交压缩成你需要的其中一个提交。
使用以下命令: git rebase -i <你第一个无用提交的ID> 完成rebase操作,如果有合并问题,请解决。
下图是rebase操作期间的截图:

During a rebase operation


你能详细说明一下你会如何做到这一点吗? - doelleri

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