大多数情况下,在做一些工作时,最终会有更改应保存到不同的提交中。
我正在寻找如何以良好的方式做到这一点的最佳实践。
当然,基本答案是使用git add -p
。
该基本答案的问题在于,它无法在提交之前测试存储库的给定状态。通常,这意味着忘记添加一些导入,或忘记某些分阶段代码和一些非分段部分之间的依赖关系。因此,给定的提交不会传递构建。
因此,我正在寻找一种方法来创建多个提交,并能够为每个提交运行测试。
到目前为止,我尝试过的工作流程如下:
只要有超过1次提交与当前更改,请重复:
git add -N <new files> # To mark all new files as potentially stageable
git add -p # To add only first commit's changes
git commit
git stash save -k -u
git stash pop
git commit --amend --no-edit
git stash save -k -u
git stash pop
我在这个工作流程中看到的主要问题是,在没有经过测试的情况下提交某些东西并没有多大意义,因为它知道很快就会被修改。
只要有超过1次提交与当前更改,请重复:
git add -N <new files> # To mark all new files as potentially stageable
git add -p # To add only first commit's changes
git stash save -k -u # To remove everything that was not added
git stash pop
git stash save -k -u
git commit
git stash pop
我在该工作流程中发现的主要问题是git stash pop
经常因冲突而失败。这导致必须在所有冲突文件上重做git add -p
,这可能非常耗时。当尝试仅添加新文件的一部分时,会发生这种情况。
在测试每个提交时是否还有其他更好的做法可以保存到多个提交中?
答案 0 :(得分:1)
忘记stash
,使用互动rebase
。根据需要提交所有内容,稍后清理混乱。
我建议使用git gui
来创建提交,但这只是一个小问题。过了一会儿,我得到了像
Implement feature A
Refactor mess B
f A 1
f A 2
f B 3
Improve formatting
f A 4
f B 5
其中&#34; f A&#34;意味着&#34;修复A&#34;。然后我打电话给
git rebase -i
或者
git rebase -i HEAD~8
获取提交列表并重新排序,如
Improve formatting
Implement feature A
f A 1
f A 2
f A 4
Refactor mess B
f B 3
f B 5
我在很多小步骤中重新排序,以防它失败。我使用git diff ORIG_HEAD
来验证最终版本是否保持不变。
作为最后一步,我改变了#34;选择&#34;到&#34; f&#34; (fixup)所以我最终只有三次提交。
要在中间步骤上运行测试,您还可以使用rebase。只需更换&#34; pick&#34;用&#34; e&#34; (编辑),以便git在每次提交后停止(使用git rebase --continue
继续下一次提交)。
在进行这样的提交清理时,我通常会按照通常的方式运行测试,如果不通过,修复通常很明显。
在重新定位时,请注意不要更改推送到共享存储库的提交。
答案 1 :(得分:0)
最佳答案是CI(持续集成)服务器。你可以根据需要推送尽可能多的提交,CI服务器拉动分支,checkout逐个提交并在每次提交时运行测试。