我正在进行的项目要求所有功能贡献都是单一提交,但我仍然希望在整个过程中提交我的进度,所以我通常会在制作它时压缩我的提交。
让我们说我在分支机构进行了第一次新的提交:
git commit -am "Added new feature"
从那时起,在我提交更改之前,我会这样做:
git commit -am "asdfasdasd"
git rebase -i HEAD~2
...然后用交互式rebase压缩我的提交。
我每天做10到20次,看起来像是一个看起来很简单的效果我想要得到的不成比例的大量按键。是否有更好/更快/更简单的方法来获得相同的结果?如果没有单一的魔法命令来做到这一点,那么我想我正在寻找的是最有效的方法。从历史记录中弹出最近的提交(不丢弃它包含的更改!),然后再次提交,其中包括弹出提交的更改以及工作更改。
答案 0 :(得分:2)
将单个提交中的特征工作压缩是值得怀疑的。一些修剪不必要的流失是有用的。您将丢失有关每个更改的原因的重要信息,并最终可能会出现一个难以查看的blob。版本控制的部分原因在于,五年之后,有人可以回答“为什么这条线在这里”并压缩失去该信息的问题。如果人们不喜欢审查大量的更改,他们可以使用git diff feature master
获得壁球效果,而不会丢失未来的信息。但你可能无法控制它。
要解决此问题,请在分支中使用简单的权限来处理您的功能。这是你应该做的事情,以避免搞乱主人和推动部分完成的工作对其他人。正常工作,正常投入。当您的功能完成后,只有在合并时才会挤压。
通过这种方式,您可以在工作时享受功能分支的所有好处,并且仍然可以遵循壁球政策。
答案 1 :(得分:1)
是否有更好/更快/更简单的方法来获得相同的结果?
我不确定是否有更快/更好/更简单的方式进行壁球,但我非常确定另一个解决此问题的好方法是:
--squash
标记。 首先,您必须重置上次X提交(git reset --hard HEAD~3
)然后应用git merge --squash HEAD@{1}
,因为HEAD@{1}
是分支在上一个命令之前的位置。
你可以查看V2,可能你会发现这更整洁:git reset --soft HEAD~3 && git commit
但我个人并不喜欢它。
当然,有一种情况可以编写别名,使整个过程自动化。可能你会觉得这很有用:
答案 2 :(得分:1)
使用git commit --amend -am "message goes here"
(或--amend -a
- 通常以前的提交消息是一个很好的起点 - 或者在手动添加之后甚至只是--amend
等。 --amend
获取此git提交历史记录:
...-o-X-Y <-- branch
并且实际上执行“软重置”以使标签branch
指向X
,以便新提交的父级再次X
,从而产生此提交历史记录:
Y [no label, but still in reflog as branch@{1}]
/
...-o-X-Z <-- branch
当你进行commit-and-rebase时,首先得到:
...-o-X-Y-Z <-- branch
(新提交),然后:
Y-Z [no label, but still in reflog as usual]
/
...-o-X-Z' <-- branch
其中Z'
是Y
和Z
的压缩提交。所以这些是不同的,但为了您的目的,可能同样有用。