【问题标题】:How to keep a clean git history如何保持干净的 git 历史记录
【发布时间】:2017-04-14 22:43:13
【问题描述】:

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

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

dev -> 当一个特性被实现时,所有分支都被合并为一个提交

test -> 我们使用平台测试代码的地方

ma​​ster -> 这个分支实际上只用于创建标签,然后将在我们的生产服务器中使用

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

我创建了一个repository 并复制了一个流程,以便您了解我为什么挣扎

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

9e76b6d - koop4:添加了令人敬畏的功能,让生活更轻松

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

64ea9d3 - koop4:添加了让生活更美好的令人敬畏的功能

我创建了一个pull request 以将这些功能带入 test 并通过一次提交来压缩合并它们。我也喜欢将 git 命令的结果粘贴为注释

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

这导致我们

有时会发生更多功能会经历这个周期,直到一切都准备好投入生产。让我们避免重复,让我们转向另一个pull request

注意:在 prod 中,我们使用标签名称作为提交消息

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

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

ca215e8 - koop4: 这会让你尿裤子

9e76b6d - koop4:添加了一个让我们吓坏了的可怕功能

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

好的好的,我理解这个概念,但是在这一点上我想你意识到了我的挣扎。为了保持我的历史干净,我必须自己选择我需要的提交:

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

最后,通过一些管道,我可以获得所有环境的伟大历史,但是当事情开始发展时,我很难理解我必须在提交注释中放入哪些提交以保持其干净。

有没有人建议保持一个干净的历史而不必那么努力?

【问题讨论】:

    标签: git github


    【解决方案1】:

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

    问题的另一半是您使用了所谓的“壁球合并”,它不是合并。详情请见this answer

    当你使用 squash “合并”时,效果是 你必须放弃现在被压缩的提交。那些旧的提交——可能有很多,就像您的示例中的三个案例 - 已被单个 new 提交取代。 (您可以并且应该将该提交获取到您自己的 Git 的 origin/test,因为您是通过 GitHub GUI 界面而不是在您自己的存储库中制作它的更明智的方法,在您自己的 test 分支上,然后直接推送新的提交。)

    如何使用 GitHub GUI 执行此操作

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

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

    如何在使用 GitHub GUI 的情况下安全地做到这一点

    以上所有内容都很烦人而且是不必要的。只需避免使用 GUI。当test 分支以您想要的方式工作时,执行您自己的交互式变基,并将所有三个提交压缩为一个

    $ git rebase -i
    

    编辑三个pick 命令,使第一个是pick,最后两个是squash,写入文件,然后退出编辑器。然后在新的编辑器会话中,将提交消息编辑为“nice”(单一提交)版本。请注意,无需保留原始三个提交的原始哈希 ID(它们将来永远不会有用)甚至这些提交的任何文本消息:您可以构建一个全新的、改进的提交消息。

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

    您还必须做一些事情来终止您未完成的拉取请求,因为它被推送的替换提交关闭。由于我不太使用 GitHub,所以我不确定那是什么。它可能就像在提交消息中包含“关闭#XX”一样简单,或者您当然可以通过他们的 Web GUI 手动完成。


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

    【讨论】:

    • 我从未使用过 github GUI。答案很简单:通过 shell 使用交互式 rebase 而不是 github squash and merge?如果你能确认我会尝试重现上面的流程并查看结果。
    • 我想我理解的问题仅仅是拉取请求是如何工作的。避免 PR 更容易。
    • 啊,在那种情况下,我看错了原帖。你在做你自己的挤压。你只需要确保当你 squash时,你会考虑到它。最简单的方法是使用git rebase -i 进行压缩,而不是使用git merge --squash:rebase 命令将为您完成计算。
    • 不,我正在通过 github 做这些壁球,我以为你的意思是 Git UI 界面。我误解了。我开始使用它是因为我听说在 github 上拥有历史记录并管理更好的开发人员/管理员工作会更好。我今晚可能会做一些测试。感谢您现在的回复。
    猜你喜欢
    • 2013-02-18
    • 1970-01-01
    • 2018-12-31
    • 1970-01-01
    • 1970-01-01
    • 2012-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多