在许多已移动文件的基础上重新存储的最佳方法?

时间:2019-02-20 16:20:53

标签: git rebase

我有两个分支A和B。

我从B分支比A分支提前约200次提交的位置开始。

同时,分支A中的许多文件已被移动,例如,Java文件从src/org/**移到了module1/src/main/java/org/**,非Java文件也移到了module1/src/main/resources/**

我有所有已移动文件夹和文件的列表。

我想将分支B设置在分支A之上。通常,我会做类似的事情:

git fetch upstream && git checkout B && git rebase upstream/A

但是,由于分支B既在src/org中添加了新文件,又修改了现有文件,因此这并不完全适用,但是其中一些已被转移(使用git mv)在分支A中。

是否有一种方法可以让git在重新设置基准时告诉所有已移动的路径,例如当您在src/org中创建一个新文件时,现在在module1/src/main/java/org中创建它吗?

或者最好的方法是使用git format-patch从分支B创建一个大补丁集,然后在将所有补丁文件应用于A的新分支之前查找并替换所有补丁文件以更新路径。 ?

或者完全有另一种方法?

2 个答案:

答案 0 :(得分:0)

如果您尝试git checkout a && git rebase b,将得到git混淆的文件,对吗?

为了最大限度地减少由于重命名同时保留两个分支而导致git混淆的时间...我想我会尝试一个双循环...实际上,对于一个好的git脚本来说甚至是一个主意...。说A是B和C之间的转移点...说A和B之间有5个修订版本,A和C之间有20个修订版本。

我不是将C置于B的顶部,而是首先基于B〜4的顶部,然后将所得分支重新置于B〜3的顶部,然后再次置于B〜2的顶部,然后是B〜1,最后它重做很多工作,但是当尝试匹配您移动的文件时,git可能会变得更加混乱。所以它应该不会太痛苦。

答案 1 :(得分:0)

最后我做了:

  1. git checkout B
  2. git format-patch -o补丁/ HEAD〜198
  3. 针对贴片的整个Sed负载
  4. git checkout A
  5. git checkout -b new-B
  6. git am -3补丁/ *

这是相对轻松的,可惜没有结合rebase / filter的更好方法。