将特性分支的Git更改历史记录转移到一个新分支?

3

有其他人更好地重新表述这个问题,但是这是我想做的事情:

我一直在长期维护一个重构分支B。 我经常合并主分支并且现在分支B领先于主分支近200个提交。 现在我准备发送一个拉取请求,但我想清理一下我的提交历史记录。 基本上,我想将所有的200次提交压缩成只有3个提交:

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

为了不出错,我想在我的分支B之外的分支上进行这个历史重写,并将其作为我的拉取请求发送。

在git中,我怎样能最容易地实现这一点?

2个回答

3

假设您要合并到 master 分支:

  1. Create and checkout a new branch:

    git checkout -b going-to-squash
    
  2. Rebase onto master

    git rebase --squash master
    
  3. Reset to the master branch

    git reset master
    
  4. Now, your entire squashed branch will be in an un-committed state.

    Create your new commits now.

    I would use a gui for this step, but it's perfectly doable on the command line.


1
请参照以下答案执行第四步操作:https://dev59.com/qVsW5IYBdhLWcg3wqYp7#51972071(VSCode选择性提交范围)或 https://dev59.com/U3NA5IYBdhLWcg3wH6AW#1085191(‘git add -patch',只缓存“hunks”)。 - c69

1

使用git rebase --interactive(如《Pro Git》书中所述)不太实用,因为它只允许选择或压缩提交(而不是提交的部分)。

另一种方法可能是生成一个巨大的补丁文件(例如git format-patch origin/master),然后解析该文件并生成3个补丁文件:

  • 一个包含所有删除的补丁文件
  • 一个包含所有添加的补丁文件
  • 其余的补丁文件

然后,您可以从提交的分支B(请参见“Git分支起始提交的引用”)创建一个新分支,并应用这三个补丁文件。


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