作为我工作的一部分,我用来在我们的环境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
有时会发生更多功能通过此循环,直到所有内容都准备好生产。让我们避免冗余,让我们转向另一个pull request!
注意:在prod中,我们使用标记名称
作为提交消息我们做到了!我们现在在所有环境中拥有超级干净的历史!太好了!
那么,这个问题是什么? 现在让我们通过在dev中添加新的提交来重复这个循环:
ca215e8 - koop4:这会让你穿上裤子
9e76b6d - koop4:添加了一个令我们惊慌失措的可怕功能
让我们创建pull request并......等待......什么???为什么它仍然缺少这些提交:
好的,我理解这个概念,但是在这一点上,我认为你意识到我的努力。为了保持我的历史清洁,我必须自己选择我需要的提交:
甚至为我们的主人pull request重复这个过程。
最后有了一些管道,我可以为所有环境找到一个伟大的历史,但是当事情开始增长时,我很难理解我必须在提交注释中提交哪些提交以保持其清洁。
是否有人建议保持干净的历史而不必挣扎那么多?
答案 0 :(得分:2)
问题的一半是您使用GitHub Web GUI界面。 :-)(我半开玩笑说这是问题的一半, 1 但事实上,它隐藏了一个重要的细节。)
问题的另一半是你正在使用所谓的" squash merge",这是不是合并。有关详细信息,请参阅this answer。
当你使用壁球"合并"时,效果是你必须放弃现在被压扁的提交。那些旧的提交 - 可能是很多,就像你的例子中的三个一样 - 已被取代一个新的提交。 (您可以而且应该将该提交提取到您自己的Git' origin/test
中,因为您是通过GitHub GUI界面而不是通过您自己的{在自己的存储库中制作它的更明智的方法{1}}分支,然后直接推送新的提交。)
放弃这些提交的一种简单方法是完全放弃您自己的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
。)
以上所有内容都令人讨厌和不必要的。只需避免使用GUI。如果origin/test
分支以您想要的方式工作,请执行您自己的交互式rebase,并将所有三个提交压缩为一个
test
编辑三个$ git rebase -i
命令,使第一个命令pick
,后两个命令为pick
,编写文件,然后退出编辑器。然后在新的编辑器会话中,将提交消息编辑到" nice" (单一提交)版本。请注意,不需要保留原始三个提交的原始哈希ID - 它们将来永远不会有用 - 甚至也不需要来自这些提交的任何文本消息:您可以构造一个全新的,改进的提交消息。
您现在将拥有自己的squash
分支(以及其他任何地方),压缩提交。您现在可以test
将其推送到GitHub存储库。
由于推送的替换提交已关闭,您还必须执行一些操作以消除未完成的请求。由于我没有那么多使用GitHub,我不确定那是什么。它可能就像包括"关闭#XX"在提交消息中,或者您当然可以通过其Web GUI手动完成。
1 这是否是问题的1/4?