Git将功能分支的历史记录更改为新分支?

时间:2012-10-04 04:00:22

标签: git version-control github branch dvcs

其他人可以更好地改写这个问题,但这就是我想要做的事情:

我一直在为一个长期存在的主要重构分支B工作。我一直在和主人合并,到现在为止,分支B超过了大约200个提交。我现在准备发送一个pull请求,但我想稍微清理一下我的提交历史。基本上我想把我所有的~200次提交压缩成3次提交:

  • 提交1 =已删除的所有文件
  • 提交2 =所有新添加的文件
  • 提交3 =其他所有内容,即所有已移动/已编辑的文件

而且,就这样我不搞砸了,我想做这个历史 - 在我自己的分支B的一个单独的分支上重写,并作为我的拉取请求发送该分支。

我在git中实现这一目标的最简单方法是什么?

2 个答案:

答案 0 :(得分:2)

假设您要合并到master

  1. 创建并签出新分支:

    git checkout -b going-to-squash
    
  2. 重新加入主人

    git rebase --squash master
    
  3. 重置为主分支

    git reset master
    
  4. 现在,你的整个被压扁的分支将处于未承诺的状态。

    立即创建新提交。

    我会在这一步使用gui,但在命令行上它是完全可行的。

答案 1 :(得分:0)

git rebase --interactive(因为described in the Pro Git book)不实用,因为它允许选择或压缩提交(不是提交的一部分)

另一种方式可能是generate a giant patch(如git format-patch origin/master),然后解析该文件制作3个补丁文件:

  • 一个包含所有删除内容
  • 一个包含所有附加内容
  • 其余的

然后,您可以从发起的提交branch B创建一个分支(请参阅“Reference Git branch start commit”),并应用这三个补丁。