想象一下你在git仓库中有两个文件,比如说A.txt
和B.txt
。git将两个文件合并成一个历史保存的文件
是否有可能将两个文件连接成第三个文件A+B.txt
,删除原始的A.txt
和B.txt
并提交它们,所以历史记录仍然保留?
也就是说,如果我询问git log --follow A+B.txt
,我会知道内容来源于A.txt
和B.txt
文件?
我试图将文件分成两个不同的分支,然后将它们合并为一个新文件(同时删除旧文件),但无济于事。
想象一下你在git仓库中有两个文件,比如说A.txt
和B.txt
。git将两个文件合并成一个历史保存的文件
是否有可能将两个文件连接成第三个文件A+B.txt
,删除原始的A.txt
和B.txt
并提交它们,所以历史记录仍然保留?
也就是说,如果我询问git log --follow A+B.txt
,我会知道内容来源于A.txt
和B.txt
文件?
我试图将文件分成两个不同的分支,然后将它们合并为一个新文件(同时删除旧文件),但无济于事。
简短的回答是“否”(甚至可能是Mu)。
历史在Git中,是提交集合。没有“文件历史”这样的事情:你有一个提交,或者你没有,并且该提交有一个或多个父母,或者它没有。这意味着“档案历史”不存在 - 但是,存在git log --follow
。这是自相矛盾的:如果文件历史不存在,git log --follow
如何产生文件历史记录?
答案是git log --follow
作弊。它没有真正找到文件历史记录。它通过历史记录查看,通过更改正在查找的文件的(单个)名称来构建子历史记录。它一次一个查看每个提交,并针对其父对象提交该提交的(加速的,有限的)git diff --find-renames
。 如果diff说,在父文件X.txt
更名为A.txt
的孩子,你正在运行git log --follow A.txt
,在git log
代码现在开始寻找X.txt
。
由于没有代码可以一次开始查找多个文件,因此无法获得此特定作弊以适应您希望的情况,即从查找某个特定文件到查找多个文件文件。 (其实这里有两个问题,一个是由于内部实现相当有限, git log --follow
一次只能查看一个文件,另一个是重命名检测不包括“联合检测”:有一种“分割检测”的形式,其中Git将执行复制查找功能,启用--find-copies
和--find-copies-harder
。后者是非常计算密集型的,并且两者都在错误的方向工作,虽然它可以做正确的简单地通过反转的diff命令的事情。)
作为这意味着,--follow
不会在合并的diff模样,至少在默认情况下。另见`git log --follow --graph` skips commits。
又名 “俗气黑客”
你可以尝试重新命名'A.txt'到'A + B.txt',加上从'B.txt'更改并删除'B.txt' ,然后提交。 – Derek
当你使A + B.txt变成A.txt和B.txt的连接时,为什么不把它放在提交信息中。 – 2017-10-06 18:26:38