如何拆分包含重构的Git提交?

时间:2017-06-02 09:26:55

标签: git refactoring git-commit

我在我的本地Git存储库中创建了一个包含功能更改和重构的提交。回想起来,如果我为重构创建了一个单独的提交会更好:重构是重命名,因此在许多文件中引起了差异。在所有这些重命名差异之间,很难看到功能的变化。这例如使代码审查变得比它需要的更难。

那么,有一种简单的方法可以解决这个问题吗?即是否可以将提交拆分为重构提交和具有功能更改的提交?

我尝试通过对差异的手动分类来拆分提交 - 正如Break a previous commit into multiple commits的答案中所提出的那样 - 但这真的很乏味。是不是有更简单的方法?

2 个答案:

答案 0 :(得分:2)

是的,有一种简单的方法 - 假设您可以轻松地重复重构。方法是创建仅包含重构的提交,然后从混合提交中“减去”它。

您可以通过以下方式执行此操作:

  1. 使用git branch检查您当前所在的分支机构e.g.。对于其余步骤,我们假设您从分支master
  2. 开始
  3. (可选)创建备份分支:git branch backup
  4. 在提交拆分之前恢复状态。这是通过签出要拆分的提交的父提交来完成的:git checkout HEAD^
  5. 再次进行重构并使用git add --all && git commit
  6. 进行重构
  7. 通过从混合提交中“减去”重构提交来创建包含剩余更改的提交:

    git reset --hard master
    git reset --soft HEAD@{1}
    git commit -c HEAD@{1}
    git branch -f master
    git checkout master
    
  8. (可选)验证两个新提交实际上是否包含相同的修改:git diff backup应该不显示差异。

  9. (可选)查看您创建的两个提交。如果您不喜欢结果,可以将它们压缩在一起(或使用git reset --hard backup恢复)并重新开始。否则,删除反向分支:git branch -D backup

答案 1 :(得分:1)

解释splitting commits section of the git-rebase documentation

  1. 使用git rebase -i <commit>启动交互式rebase,以便在您要拆分的提交之前进行一些提交。

  2. 将要分割的提交标记为edit

  3. 当rebase到达您要拆分的提交时,执行git reset HEAD^会使您处于合并更改位于工作目录但未提交的状态。

  4. 进行两次提交:一次是重构,一次是重命名。[*]

  5. git rebase --continue重播以后的所有更改。

  6. 显然,如果你还没有分享你的更改,那么通常的注意事项仅适用于此。

    -

    [*]编辑

    在此阶段,您将有大量未分阶段的删除操作以及大量具有不同名称和可能已编辑内容的非暂存新文件。

    要重新应用重构,您可以这样做:

    一个。复制new-file-name old-file-name(对于每个重构文件);它们将作为修改出现

    湾git以通常的方式添加和提交这些更改

    ℃。再次从磁盘中删除旧文件

    然后所有的重命名都出现在工作文件夹中,并且可以按原样形成第二次提交。