我可以在版本控制中将两个文件合并为一个文件吗?

Can I merge two files into one in a version control?

假设我有两个包含两个 class 的文件,AB。在某些时候,class B 似乎只在 class A 内部使用,从代码设计的角度来看,这是完全合理的,将 B 放入 A 并声明为私有。

现在,如果我必须做这样的任务,我会简单地将源代码从一个文件复制到另一个文件,然后删除现在空的文件。缺点是版本控制历史并没有完全丢失,但不能再明显地被发现。

例如,对于任何指责 B 的源代码的人来说,看起来我是从头开始创建 class 的,而这个人需要去看看实际提交到了解真正发生的事情,然后检查已删除文件的历史记录。相比之下,如果我只是移动文件,版本控制显示源代码有一堆更改,然后被移动,然后还有其他更改。

有没有办法合并两个文件(在 SVN 或 Git 中)以保留历史记录?

当然,当我尝试 Google 它时,我得到了很多关于合并分支的结果,但我找不到如何让 Google 明白我在谈论一个不同的合并。

假设 B 在项目中出现的第一个修订版是 X:

git rebase -i X~
# change the first revision to say edit (or e) in the text editor, save and exit
# git will go straight to the first revision where X shows up
# open A, copy B code in a way that makes it compile and so on
git add A
git rm B
git rebase --continue

# from now on, this is what you do every time a conflict comes up
git checkout REBASE_HEAD -- . # put everything exactly like it was in the revision we are rebasing
# open A... there should be no B code
# open B
# copy B code into A and make it compile
git add A
git rm B
git rebase --continue

直到完成...到那时,您应该了解 B 从一开始就在 A 中生长的完整历史。