【问题标题】:Can I merge two files into one in a version control?我可以在版本控制中将两个文件合并为一个吗?
【发布时间】:2021-02-09 04:13:55
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 不直接.....可能会考虑重写历史记录,以便不是将 B 作为单独的文件启动,而是从头开始在 A 内部启动...但是每次修改 B 时,您都会得到一个冲突,以便您将代码从 B 移动到 A.... 本身并不太难,但如果历史很长,则很乏味.... 当然,您正在重写历史。
  • 让我把食谱描述为答案
  • 这两个文件的历史是否共享历史?
  • 例如是否已推送每个文件的提交?
  • 我想知道是否在单独的分支中将每个文件重命名为 C,然后合并它们是否可以解决问题。

标签: git svn version-control


【解决方案1】:

假设 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 内部成长的历史。

【讨论】:

    猜你喜欢
    • 2012-12-14
    • 2021-02-26
    • 1970-01-01
    • 1970-01-01
    • 2017-07-09
    • 1970-01-01
    • 1970-01-01
    • 2017-06-20
    • 2014-03-17
    相关资源
    最近更新 更多