Squash 将一个问题提交到一个问题中

Squash commits for an issue into a single one

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

我正在尝试使用 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

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

If I understand it correctly I can simply use the default editor and change pick to 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 标志以在合并期间简化此工作流程。

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

I would like to do this is because I would like my pull request to be clean and only have a single commit.

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


编辑: 在您提到的评论中,提交了 8bcc4d46b187110924c16ISSUE-018) 已经存在于目标分支中。在那种情况下,您可能希望将它们从此分支中删除,例如通过在你的交互式 rebase 中做这样的事情:

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