如何保持干净的git历史记录

时间:2016-11-30 14:44:57

标签: git github

作为我工作的一部分,我用来在我们的环境dev / test / prod之间进行部署

我们使用众所周知的分支流来管理我们的代码,因此我们有以下分支:

dev - >其中所有分支在实现功能时合并为单个提交

测试 - >我们在哪里使用平台

来测试我们的代码

master - >该分支实际上仅用于创建标签,然后将在我们的生产服务器中使用

最近我想找到一种方法来保持代码历史尽可能干净,但我正在努力想要如何轻松地做到这一点。

我创建了一个repository并重现了一个流程,这样你就可以理解为什么我在挣扎

所以,在 initial commit 之后,我创建了2个分支 dev test ,切换到 dev 进行以下提交并进行3次提交:

  

9e76b6d - koop4:增加了令人生活更轻松的功能

     

44976b1 - koop4:增加了令人生活更快的令人敬畏的功能

     

64ea9d3 - koop4:增加了让生活更光明的令人敬畏的功能

我制作了一个pull request来将这些功能带入测试,然后用单一提交压缩它们。我还想粘贴git命令的结果作为注释

git log --pretty=format:"%h - %an: %s"  test..dev

这引导我们这样做 test History

有时会发生更多功能通过此循环,直到所有内容都准备好生产。让我们避免冗余,让我们转向另一个pull request

注意:在prod中,我们使用标记名称

作为提交消息

我们做到了!我们现在在所有环境中拥有超级干净的历史!太好了!

master history

那么,这个问题是什么? 现在让我们通过在dev中添加新的提交来重复这个循环:

  

ca215e8 - koop4:这会让你穿上裤子

     

9e76b6d - koop4:添加了一个令我们惊慌失措的可怕功能

让我们创建pull request并......等待......什么???为什么它仍然缺少这些提交:

enter image description here

好的,我理解这个概念,但是在这一点上,我认为你意识到我的努力。为了保持我的历史清洁,我必须自己选择我需要的提交: enter image description here

甚至为我们的主人pull request重复这个过程。

最后有了一些管道,我可以为所有环境找到一个伟大的历史,但是当事情开始增长时,我很难理解我必须在提交注释中提交哪些提交以保持其清洁。

是否有人建议保持干净的历史而不必挣扎那么多?

1 个答案:

答案 0 :(得分:2)

问题的一半是您使用GitHub Web GUI界面。 :-)(我半开玩笑说这是问题的一半, 1 但事实上,它隐藏了一个重要的细节。)

问题的另一半是你正在使用所谓的" squash merge",这是不是合并。有关详细信息,请参阅this answer

当你使用壁球"合并"时,效果是你必须放弃现在被压扁的提交。那些旧的提交 - 可能是很多,就像你的例子中的三个一样 - 已被取代一个新的提交。 (您可以而且应该将该提交提取到您自己的Git' origin/test中,因为您是通过GitHub GUI界面而不是通过您自己的{在自己的存储库中制作它的更明智的方法{1}}分支,然后直接推送新的提交。)

如何使用GitHub GUI

执行此操作

放弃这些提交的一种简单方法是完全放弃您自己的test分支,例如,只删除它。你的Git不知道这是一件安全的事情,所以你必须强制删除它。您还必须在其他分支上,因为您无法删除当前分支。然后,您可以使用相同的名称test创建一个新分支,但指向更新的test作为其上游。现在,您在本地origin/test中有单个替换提交(以及所有早期提交),而不是三个提交(以及所有早期提交)。

该特定方法至少需要两个,通常是三个Git命令:test(下车git checkout dev),test(危险地强制删除git branch -D test })和test(重新创建git checkout -b test)。您只能使用一个危险的Git命令:test(再次,在运行git reset --hard origin/test后更新git fetch。)

如何在没有的情况下安全使用GitHub GUI

以上所有内容都令人讨厌和不必要的。只需避免使用GUI。如果origin/test分支以您想要的方式工作,请执行您自己的交互式rebase,并将所有三个提交压缩为一个

test

编辑三个$ git rebase -i 命令,使第一个命令pick,后两个命令为pick,编写文件,然后退出编辑器。然后在新的编辑器会话中,将提交消息编辑到" nice" (单一提交)版本。请注意,不需要保留原始三个提交的原始哈希ID - 它们将来永远不会有用 - 甚至也不需要来自这些提交的任何文本消息:您可以构造一个全新的,改进的提交消息。

您现在将拥有自己的squash分支(以及其他任何地方),压缩提交。您现在可以test将其推送到GitHub存储库。

由于推送的替换提交已关闭,您还必须执行一些操作以消除未完成的请求。由于我没有那么多使用GitHub,我不确定那是什么。它可能就像包括"关闭#XX"在提交消息中,或者您当然可以通过其Web GUI手动完成。

1 这是否是问题的1/4?