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

3
我在本地Git存储库中创建了一个提交,其中包含了功能性改变和重构。回想起来,最好分别为重构和功能性改变创建不同的提交:因为重构是一个重命名操作,在许多文件中引起了差异。在所有这些重命名差异之间,很难看到功能性改变。例如,这使得代码审查比必要的困难。
那么,有没有一种简单的方法来解决这个问题呢?也就是说,能否将该提交拆分为一个重构提交和一个具有功能性改变的提交?
我尝试通过手动排除差异(如Break a previous commit into multiple commits中所提出的),将提交分成两个部分,但这真的很繁琐。有没有更简单的方法?
2个回答

4

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

您可以按照以下方式执行此操作:

  1. Check the branch that you are currently on, e.g. with git branch. For the remaining steps, we'll assume that you start on branch master
  2. (Optional) Create a backup branch: git branch backup
  3. Restore the state before the commit to be split. This is done by checking out the parent commit of the commit to be split: git checkout HEAD^
  4. Do the refactoring again and commit it with git add --all && git commit
  5. Create the commit that contains the remaining changes by "subtracting" the refactoring commit from the mixed commit:

    git reset --hard master
    git reset --soft HEAD@{1}
    git commit -c HEAD@{1}
    git branch -f master
    git checkout master
    
  6. (Optional) Verify that the two new commits in fact contain the same modifications: git diff backup should show no diffs.

  7. (Optional) Review the two commits you created. If you don't like the result, you can squash them back together (or revert with git reset --hard backup) and start over. Otherwise, delete the backput branch: git branch -D backup

1

git-rebase文档中的拆分提交部分进行改写:

  1. 使用git rebase -i <commit>开始交互式变基,其中<commit>是要拆分的提交之前的某个提交。

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

  3. 当变基到达要拆分的提交时,请执行git reset HEAD^,将您留在一个状态中,其中合并的更改位于您的工作目录中但未提交。

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

  5. 执行git rebase --continue以在其上重新播放任何后续更改。

显然,通常的警告适用:只有在您尚未共享更改时才应这样做。

--

[*] 编辑

在这个阶段,你有一堆未暂存的删除文件和一堆未暂存的新文件,它们的名称不同,可能还有编辑过的内容。

要重新应用重构,你只需要这样做:

a. 复制新文件名为旧文件名(对于每个需要重构的文件);它们将显示为修改

b. 以通常方式添加和提交那些更改的git add

c. 再次从磁盘中删除旧文件

然后,所有重命名都存在于工作文件夹中,并且可以形成第二个提交。


根据重构的不同,第四步可能会非常困难。例如,假设一个类被重命名,然后添加了一些代码。在这种情况下,很难做到完全正确 - 而在这个答案中,这只需要开箱即用就可以解决。 - oberlies
1
我想这取决于(通常情况下)重新命名或重构更难再次完成。总是很好看到人们回答自己的问题,为社区做出贡献,所以感谢您 :-) - Matthew Strawbridge

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接