2017-06-02 95 views
2

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

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

我试图通过差异的手动分类来分裂提交 - 正如Break a previous commit into multiple commits的答案中提出的那样 - 但这确实很乏味。没有更简单的方法吗?

回答

2

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

您可以通过以下方式做到这一点:

  1. 检查你当前的分支,e.g.git branch。对于剩下的步骤,我们假定您从分支开始master
  2. (可选)创建备份分支:git branch backup
  3. 恢复提交之前的状态以进行拆分。这是通过检查出父所做的承诺的承诺被分割:git checkout HEAD^
  4. 再次进行重构,并与git add --all && git commit
  5. 提交它创建提交包含由“减去”剩余的变更重构从呈交混合承诺:

    git reset --hard master 
    git reset --soft [email protected]{1} 
    git commit -c [email protected]{1} 
    git branch -f master 
    git checkout master 
    
  6. (可选)验证,事实上,两个新提交含有相同的修改:git diff backup不应有差异列表。

  7. (可选)查看您创建的两个提交。如果你不喜欢结果,你可以把它们压回去(或者用git reset --hard backup恢复)并重新开始。否则,删除backput分支:git branch -D backup
0

意译splitting commits section of the git-rebase documentation

  1. git rebase -i <commit>启动交互式重订一些你要拆分的一个前提交。

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

  3. 当底座达到要分割的提交时,执行git reset HEAD^将组合更改保留在工作目录中但未提交的状态。

  4. 做两次提交:一个与你的重构和一个与你的改名[*]

  5. git rebase --continue重播之上以后的任何变化。

很明显,通常的注意事项只适用于如果您尚未分享您的更改。

-

[*]编辑

在这个阶段,你有不分阶段缺失的负荷和用不同的名字,可能编辑的内容不分阶段的新文件的负载。

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

一个。复制新文件名旧文件名(对于每个重构文件);它们将作为修改出现

b。 git以通常的方式添加并提交这些更改

c。从磁盘上再次删除旧文件

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

+0

根据重构,步骤4可能非常困难。例如。图像,一个类被重命名,然后一些代码被添加到它。在这种情况下,你很难做到这一点 - 而在[这个答案](https://stackoverflow.com/a/44325383/1523648)中,这只是开箱即用。 – oberlies

+1

我想这取决于(在一般情况下)哪个更难再做一次,重命名或重构。总是很高兴看到人们回答自己的问题,为社区的利益,所以谢谢你:-) –