从拆分存储库恢复git历史记录

Ber*_*als 1 git merge git-rewrite-history

当我们的项目开始时,我们不熟悉git,并且在某些时候决定重新启动存储库.这意味着我们将所有文件导入新存储库,丢失了所有历史记录.

今天我想知道是否有办法重新组合这两个存储库.基本上,"old-repo"中文件的历史记录应该添加到"new-repo"中该文件的历史记录中.

有谁知道如何开始这个?

Aje*_*i32 6

您可以通过从旧存储库中提取提交然后使用在旧存储git rebase库之上重放新存储库的历史记录来轻松地执行此操作.

首先,从旧存储库中获取提交.

git remote add old_repo <url-for-old-repo> # Add old repository as a remote
git fetch old_repo # Fetch commits from old repo
Run Code Online (Sandbox Code Playgroud)

接下来,在旧存储库中找到与新存储库的根提交相匹配的提交.您可能会发现git log有用的目的.您可以通过运行git diff <commit in old repo> <commit in new repo>和检查来验证提交的内容是否匹配,以确保该命令没有输出.如果有来自该命令的输出,要么继续查找,直到在旧存储库中找到不生成该输出的提交,或者创建一个(通过检查旧存储库中的类似提交,对工作进行必要的更改)目录,并提交).

找到此提交后,在新存储库中找到root提交的直接提交.这应该是新repo中的第一个提交,它引入了旧存储库中没有的更改.您将在以下命令中使用此提交以及您之前在旧存储库中找到的提交.

跑:

git checkout master
git rebase --onto <commit from old repo> <commit from new repo> --preserve-merges
Run Code Online (Sandbox Code Playgroud)

这应该重新提交从新存储库到旧存储库的提交.假设前面的输出git diff是我建议的空白,你应该没有遇到合并冲突.命令完成后,master分支应包含旧存储库中的历史记录.

由于此过程涉及更改存储库的历史记录,因此--force下次将主分支推送到远程存储库时,您需要使用该选项.

如果除了master之外还有其他任何分支,则需要按照上述类似的过程将它们移动到新的存储库:

git checkout branchname
git rebase --onto <base on new master branch> <first commit in branch> --preserve-merges
Run Code Online (Sandbox Code Playgroud)

标签可能不应该被移动,因为它们是不可变的.如果您确实想要将标记移动到新历史记录,请参阅如何将git分支上的标记移动到其他提交?.