删除git历史记录中的多重合并功能分支

删除git历史记录中的多重合并功能分支,git,merge,rebase,squash,Git,Merge,Rebase,Squash,我目前正在将SVN存储库转换为Git,在此过程中,我希望使历史尽可能线性化。问题是,我在SVN中有一些功能分支,它们在这个过程中从主分支合并而来。这种合并模式使重发成为一种痛苦,我不知道如何正确地进行重发 我的目标是用挤压提交替换特征分支的合并: 我已经研究了这个问题的答案,但建议的答案似乎都不适用于我的情况: 我应该如何压缩我的功能分支,以便在正确的时间点在master上重新设置它的基础?假设M是最上面的合并提交(介于G和H之间): git reset--soft G将使git认为G是您当

我目前正在将SVN存储库转换为Git,在此过程中,我希望使历史尽可能线性化。问题是,我在SVN中有一些功能分支,它们在这个过程中从主分支合并而来。这种合并模式使重发成为一种痛苦,我不知道如何正确地进行重发

我的目标是用挤压提交替换特征分支的合并:

我已经研究了这个问题的答案,但建议的答案似乎都不适用于我的情况:


我应该如何压缩我的功能分支,以便在正确的时间点在master上重新设置它的基础?

假设
M
是最上面的合并提交(介于
G
H
之间):


git reset--soft G
将使git认为
G
是您当前的基本提交,但它不会触及您的文件(与
签出
不同),因此您将以未完成更改的形式保留合并中的所有更改,随后的提交将仅将
G
作为其父级。然后,我们重新设置其余提交的基础,并将
清理的分支
移动到最终的tip提交。

我尝试了这个建议的解决方案,但存在两个问题:1。提交将使用今天的时间/日期,而不是merge M.2历史记录中的时间/日期。完成后,我有一个新的分支“清洁分支”,它与主分支平行。我只想要主分支。好的。。我已经知道如何更改新提交的日期/时间以匹配旧的日期/时间。i、 e.在commit命令中使用标志--date='2014-05-05T10:08:00'。只需在最后一行使用
git checkout-B master
完成即可,这将
master
移动到重新基调的提示提交。请注意,生成的
master
commit的哈希值与原始哈希值不同,但这是git固有的,无法避免:对旧提交的任何操作都会更改修改后的提交及其所有后代提交的哈希值。Ok。。我通过这样做解决了这个问题:
git checkout master
,然后
git rebase--on'git rev parse-cleaned branch'M'git rev parse master'
为什么这样做?我想说,这样做的愿望并不常见。在本例中,我导入了一个旧的SVN回购协议,并希望在将其用作Git回购协议之前对其进行一点清理。这种清理需要将相关的提交压缩在一起,修复提交消息。为了能够使用交互式重基进行挤压,我需要摆脱这些合并提交。请注意,这个Git回购还没有激活,所以我可以重写历史。
git checkout -b cleaned-branch M
git reset --soft G
git commit -m "Get rid of merge"
git rebase M `git rev-parse master` --onto cleaned-branch
git checkout -B cleaned-branch