【问题标题】:Squash commits for an issue into a single one将一个问题的 Squash 提交合并为一个问题
【发布时间】:2019-03-27 14:00:35
【问题描述】:

如果在第一个问题之间还有另一个问题的提交,那么将一堆提交合并为一个问题的最简单方法是什么?

我尝试使用rebase:

git checkout ISSUE-006
git rebase -i HEAD~13

这给了我:

pick 5796b58 ISSUE-006: Fix case 1
pick 4d836b2 ISSUE-006: Fix case 2
pick cae225b ISSUE-006: Bump version
pick 0006f82 ISSUE-006: Fix case 3
pick 98263c2 ISSUE-006: Bump version
pick 8bcc4d4 ISSUE-018 Blahblahblah
pick 6b18711 ISSUE-018 minor changes
pick 0924c16 ISSUE-018 Blahblahblah
pick 0e720f9 ISSUE-006: Bump version
pick bc66908 ISSUE-006: Remove comments
pick 49930b9 ISSUE-006: Proper encoding
pick 8f1196e ISSUE-006: Add tests
pick 2bcbfef ISSUE-006: Bump version

我希望将属于 ISSUE-006 的每个提交压缩成一个提交。如果我理解正确,我可以简单地使用默认编辑器并将pick 更改为squash

我还尝试将merge--squash 一起使用,但没有成功:

git checkout ISSUE-006
git branch -m ISSUE-TMP
git checkout master
git branch -b ISSUE-006
git merge --squash ISSUE-TMP
git branch -d ISSUE-TMP

我不确定它是否相关,但我想这样做的原因是因为我希望我的拉取请求是干净的并且只有一个提交。

【问题讨论】:

    标签: git merge rebase squash


    【解决方案1】:

    如果我理解正确,我可以简单地使用默认编辑器并将pick 更改为squash

    不完全是,因为在ISSUE-006 的提交之间有ISSUE-018 的提交。提交会被压缩到前一个提交,因此您还必须在编辑器中重新排序提交,将ISSUE-018 的所有提交移到末尾或可能移到开头。

    此外,ISSUE-006 的第一次提交应该是 picked,而不是 squashed。

    例如:

    pick 5796b58 ISSUE-006: Fix case 1
    squash 4d836b2 ISSUE-006: Fix case 2
    squash cae225b ISSUE-006: Bump version
    squash 0006f82 ISSUE-006: Fix case 3
    squash 98263c2 ISSUE-006: Bump version
    squash 0e720f9 ISSUE-006: Bump version
    squash bc66908 ISSUE-006: Remove comments
    squash 49930b9 ISSUE-006: Proper encoding
    squash 8f1196e ISSUE-006: Add tests
    squash 2bcbfef ISSUE-006: Bump version
    pick 8bcc4d4 ISSUE-018 Blahblahblah
    pick 6b18711 ISSUE-018 minor changes
    pick 0924c16 ISSUE-018 Blahblahblah
    

    请注意,像这样简单地重新排序提交可能会产生冲突,其中一些可能很难解决。将来,如果您为每个问题创建一个新分支,您也许可以省去头疼的问题。

    当然,合并或变基这些分支也会产生冲突。但是,如果您只是压缩分支的提交而不进行任何重新排序,那么您不应该得到任何东西。 git merge 还包括一个 --squash 标志以在合并期间简化此工作流程。

    将提交保存在单独的分支中的另一个好处是它简化了合并/拉取请求提交。拉取请求和合并都在分支之间运行:您不能使用当前分支创建不包含对这两个问题的更改的 PR。

    我想这样做是因为我希望我的拉取请求是干净的并且只有一个提交。

    清洁度是主观的,在许多情况下,多个细粒度的提交比一次大提交更清晰、更容易审查。更好的指导方针是遵循您正在参与的项目的指导方针,以便您的贡献与项目的其余部分保持一致。


    编辑:您在评论中提到提交8bcc4d46b187110924c16ISSUE-018 的提交)已经存在于目标分支中。在这种情况下,您可能希望从该分支中​​删除它们,例如通过在您的交互式变基中执行类似的操作:

    pick 5796b58 ISSUE-006: Fix case 1
    squash 4d836b2 ISSUE-006: Fix case 2
    squash cae225b ISSUE-006: Bump version
    squash 0006f82 ISSUE-006: Fix case 3
    squash 98263c2 ISSUE-006: Bump version
    squash 0e720f9 ISSUE-006: Bump version
    squash bc66908 ISSUE-006: Remove comments
    squash 49930b9 ISSUE-006: Proper encoding
    squash 8f1196e ISSUE-006: Add tests
    squash 2bcbfef ISSUE-006: Bump version
    

    【讨论】:

    • 我确实为每个问题都有一个单独的分支,但是由于在我最初创建自己的分支后,一些问题已合并到 master 分支,所以我遇到了这个问题,因为我总是将自己的分支与上游的 master 合并.
    • @Cyclonecode,你的意思是这里的提交8bcc4d46b187110924c16ISSUE-018 的提交)已经在你的 PR 目标分支中了吗?
    • 是的,他们确实是
    • 在这种情况下,您可能希望在交互式 rebase 中完全删除这些行。我会更新我的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-07
    • 2010-12-06
    • 2014-06-14
    • 2021-08-12
    • 2023-01-12
    • 2016-12-30
    • 1970-01-01
    相关资源
    最近更新 更多