git:cleanup或delete commit来清理提交历史记录

时间:2016-09-07 05:36:14

标签: git

文档和搜索让我对如何清理提交历史感到困惑。

假设我有一个称为测试的分支,我将其用于将构建推送到travis-ci,并且我的构建失败了。然后我必须做一些小提交来尝试修复错误消息并重新推送tests分支。

这可能会导致一系列小而几乎无意义的提交,但我并不是真的想做,但我仍然被迫。我如何将这些压缩成一个提交?我认为rebase是我正在寻找的,但我对一些事情感到困惑。

如果我使用squash,我发现我遇到了大量的合并冲突,然后我必须手动解决。

我认为解决方案可能只是删除提交,但后来我不确定是否会删除一些我最终“工作”提交所需的历史记录。

说我的提交历史记录如下:

commit1: some new feature
commit2: crap, builds failing, trying fix
commit3: more build attempts
commit4: Ahh I think I got it this time
commit5: ok finally fixed, build passing

现在我基本上只想让一个提交合并回master。你会在这里做些什么不会导致合并冲突?

3 个答案:

答案 0 :(得分:4)

怎么样

git reset --soft HEAD~[n]
git commit

那应该压缩你的最后一次提交。

答案 1 :(得分:1)

  

你在这里做什么不会导致合并冲突?

不幸的是,如果你压缩提交,合并冲突可能是不可避免的。

您可以尝试执行交互式rebase,将修补程序提交合并到一个提交中。请记住,如果尚未将此分支推送到远程,则仅建议使用此解决方案。所以,如果你已经在本地提交了1-5,没有推送它们,并且你想要将它们组合起来,那么交互式rebase是一个不错的选择。

从以下开始:

<input name="file_name" id="ext-gen4414" class="x-form-file-input" type="file" size="1">

这会显示一个窗口,显示以下5个提交列表,从最早的提交1到最新提交5 git checkout tests git rebase -i HEAD~5 分支:

tests

您可以看到,默认情况下,每个提交的选项为pick 07c5abd message for commit 1 pick dl398cn message for commit 2 pick 93nmcdu message for commit 3 pick lst28e4 message for commit 4 pick 398nmol message for commit 5 。如果你现在完成了rebase,你只需保留每个提交,这实际上是一个无操作。但是既然你想要压缩某些中间提交,请编辑并将列表更改为:

pick

保存并关闭文件,然后完成rebase。

请仔细注意上面发生的事情。通过键入squash,你告诉Git将该提交合并到上面的中,这就是它之前的提交。因此,这表示将提交5向后压缩到提交4,然后将4压缩为3,依此类推,只为提交1到5提交一个提交。在提交1之前发生的其他提交保持原样。

如果你刚刚被压扁的提交没有被推送,并且提交1优先于pick 07c5abd message for commit 1 squash dl398cn message for commit 2 squash 93nmcdu message for commit 3 squash lst28e4 message for commit 4 squash 398nmol message for commit 5 ,那么你应该只能通过以下方式推送这个分支:

origin/tests

如果这不起作用,您可能必须强制推动分支:

git push origin tests

但请记住,这会重写远程历史记录,理想情况下您不应该这样做。

答案 2 :(得分:1)

Git limit 10 适用于将提交合并为一个。

正如所提到的,Squash将n替换为您希望压缩的提交数量,并在需要时git rebase -i HEAD~n更改。

理想情况下,在需要记录并创建路径时进行提交。提交历史在rebase,检查代码版本,在实例中创建分支等方面起着重要作用。记录对git的更改时,请确保更改是相关的并且需要保留。

只有在真正不需要对您正在进行的更改做出指示时才进行壁球。这会修改完成的工作报告。