大多数时候,在做一些工作时,最终会得到应该保存到不同提交中的更改。
我正在寻找如何以好的方式做到这一点的最佳实践。
当然,基本的答案是使用git add -p
.
该基本答案的问题在于它无法在提交之前测试存储库的给定状态。通常,这意味着忘记添加一些导入,或者忘记一些暂存代码和一些未暂存部分之间的依赖关系。因此,给定的提交不会通过构建。
因此,我正在寻找一种方法来创建多个提交,并能够为每个提交运行测试。
到目前为止,我尝试过的工作流程如下:
工作流程 1:提交、存储然后测试
只要有超过 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 添加相关修改
-
git commit --amend --no-edit
-
git stash save -k -u
-
-
git stash pop
我在这个工作流中看到的主要问题是,在没有测试的情况下提交一些东西没有多大意义,因为知道它可能很快就会被修改。
工作流程 2:存储、测试然后提交
只要有超过 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 添加相关修改
-
git stash save -k -u
-
-
git commit
-
git stash pop
我发现该工作流程的主要问题是 git stash pop
经常因冲突而失败。这导致不得不重做 git add -p
在所有冲突文件上,这可能非常耗时。当尝试仅添加新文件的一部分时,会发生这种情况。
问题
是否有其他更好的做法可以在测试每个提交时保存到多个提交中?
最佳答案
忘记 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
其中“f A”表示“A 的修正”。然后我打电话
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
来验证最终版本是否保持不变。
作为最后一步,我将“pick”更改为“f”(修复),这样我最终只有三个提交。
对于中间步骤的运行测试,您还可以使用 rebase。只需将“pick”替换为“e”(编辑),以便 git 在每次提交后停止(使用 git rebase --continue
继续下一次提交)。
在做这样的提交清理时,我通常最后运行测试,因为它们通常会通过,如果它们没有通过,修复通常很明显。
rebase 时,注意不要更改推送到共享存储库的提交。
关于git - 将工作保存到多个提交中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48600400/