git - 将工作保存到多个提交中

标签 git

大多数时候,在做一些工作时,最终会得到应该保存到不同提交中的更改。

我正在寻找如何以好的方式做到这一点的最佳实践。

当然,基本的答案是使用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/

相关文章:

windows - 如何从上游分支 merge ?

git - 添加回已删除的文件并且不跟踪它

node.js - 从 Node.js 应用程序管理 git 存储库

git - 将分支从 Team Foundation Service pull 到 Visual Studio 2012

git - 通用后提交 Git 钩子(Hook)

javascript - 删除按钮不起作用

git - 使用 JGit 仅获取单个标签

git - 如何使用 git 存储库使文件夹保持最新?

git - 使用 README 初始化存储库如何帮助您立即将存储库克隆到您的计算机?

git - 将代码保存在gitlab和github中有危险吗