我有一个不断发展壮大的功能分支,随着功能的发展经历了很多曲折。我想将一些可单独发布的 block 分解成它们自己的分支。
提交不够干净,无法通过按提交选择来构建此类分支(即一些提交涉及多个文件,我只想选择其中的一些文件)。我擅长交互 rebase 、大块编辑等,但我想知道是否有更好的方法来做到这一点?
我最初的想法是创建一个分支,它是原始功能分支的副本,将其所有提交压缩为 1,重置为之前的提交(在我的工作树中保留完整的未提交、未暂存的功能分支),然后有选择地添加并提交我想要的部分。
$ git co -b partial-feature
$ git rebase -i HEAD~170
在编辑器中:
pick 234e78fa Begin writing feature
f 7844c437 Add more stuff
f 3523437 And even more
...
然后,
$ git reset HEAD~
$ git add first_good_change.rb
$ git commit -m 'Add a good change'
$ git add second_good_change.rb
$ git commit -m 'Add another good change'
...
有没有更聪明的方法?
最佳答案
这基本上很好,但它可以更简单一些。
My initial thought is to create a branch that's a copy of the original feature branch, squash all it's commits into 1, reset to the previous commit
这相当于软重置到分支的开始。这是一个单一的命令,而不是一个 rebase 后跟一个重置。
git checkout -b partial-feature
git reset start
start
是您希望分支开始的 SHA1。
这个决定不同于HEAD~170
,因为你不需要计算170,只需要简单地查看git log
并找到合适的SHA1。
在此之后,继续你所做的:
git add first_good_change.rb
git commit -m 'Add a good change'
git add second_good_change.rb
git commit -m 'Add another good change'
等等。在任何时候,如果你愿意,你可以继续在另一个功能分支上,一点一点地向审阅者释放变化,使他们的工作更轻松,例如:
git checkout -b partial-feature-round-2
git add more_good_change.rb
git commit -m 'Add a good change'
git add even_more_good_change.rb
git commit -m 'Add another good change'
等等。只需确保在 merge partial-feature
之前不要发布 partial-feature-round-2
以供审核。
原分支全部提交后, 该项目的内容将与原始分支相同, 只是历史看起来会有所不同。 像这样对您的历史进行切片和切 block 是完全正常的。
以这种方式将分支拆分为更小的分支并不总是可行的,
例如,当更改之间的关联过于紧密时,很难分离出仍然有效的 block 。
也就是说,当您发布 partial-feature
进行代码审查时,
它最好编译并完全工作,
如果更改过于复杂,这可能很难实现。
最后提示:在为多阶段代码审查构建部分分支时, 验证部分功能是否仍然有效并处于代码可审查状态的一种简单方法是 stash 剩余的更改,然后编译和运行测试。如果一切顺利,分支已准备好进行代码审查,您可以创建 pull 请求,然后继续下一阶段, pop 存储并添加更多提交。
关于Git:将一个大+杂乱的特性分支分解成更小的分支,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40873354/