我使用git subtree add而没有选用squash选项,将一个树合并到我的代码库中。使用git log可以看到提交成功地添加到了代码库中。然而,如果我运行git log --follow 文件名
,历史记录会在合并处停止,不显示之前的提交记录。我尝试使用-M
代替--follow
,但也无法解决问题。如何获取合并之前特定文件或多个文件的提交记录日志?
我使用git subtree add而没有选用squash选项,将一个树合并到我的代码库中。使用git log可以看到提交成功地添加到了代码库中。然而,如果我运行git log --follow 文件名
,历史记录会在合并处停止,不显示之前的提交记录。我尝试使用-M
代替--follow
,但也无法解决问题。如何获取合并之前特定文件或多个文件的提交记录日志?
git subtree merge
或者 git subtree add
创建的提交行为是“添加”而非“移动”,这意味着来自子树的文件历史无法像其他合并或移动一样被跟踪。
要查看所需文件的历史记录,仍然可以通过直接查看合并前的子树来显示。如果您的工作区是由git subtree
创建的合并提交,则其第二个父提交(HEAD^2
)将是原始子树的最后提交。从这里可以查看原始子树的内容:
# Display the contents of the original subtree
git ls-tree HEAD^2
从这个提交开始,你可以跟踪你感兴趣的文件的变化。请注意,在子树中,你的文件路径将与你的工作区中的不同。你需要删除给 git subtree
输入的 --prefix
以便得到正确的文件路径。
git log HEAD^2 --follow -- path-in-subtree/file
实际上,git log --follow
应该 能够处理子树合并,但已知其使用方法存在问题[1-3]。
你可以继续使用子树合并策略,并耐心等待不可避免的 git log --follow
改进。这可能是一个可行的决定,因为目前在某些有用的情况下,git log --follow
可以查看部分历史记录。例如,如果你将文件从顶级仓库移动到子仓库,则它可以跟踪完整的移动过程。当你想要跟踪特定于子仓库的历史记录时,你确实需要一个单独的副本或者检出子仓库分支。
你可以像这样获取文件的日志 [1]:
git log -- '*filename' # from the toplevel
filename
结尾的文件的每个提交记录。它不会跟踪实际重命名,并且如果您有多个具有相同基本名称的文件,则可能会显示错误结果[1]。git mv
命令将子存储库文件移动到单独的文件夹中。-Xsubtree
标志对 git merge 进行正常获取和合并更新。
- 其他情况应该类似。我已经测试了向上游推送,它可以正常工作,请参见 [4] 中的评论。
git log --follow
已在 Google Summer of Code 中使用https://git.wiki.kernel.org/index.php/SoC2011Ideas#Better_git_log_--follow_support
- [4] https://saintgimp.org/2013/01/22/merging-two-git-repositories-into-one-repository-without-losing-file-history
git log --follow
仅适用于文件,而不是文件夹。在子存储库文件夹中执行git log --follow .
将不会返回子存储库提交,gitk --follow .
(git 2.10.1)也是如此。 - rfabbri