从拆分存储库恢复 git 历史记录
Restore git history from split repositories
当我们的项目开始时,我们不熟悉 git,并且在某个时候决定重新启动存储库。这意味着我们将所有文件导入新存储库,丢失所有历史记录。
今天我想知道是否有办法重新组合这两个存储库。
基本上 "old-repo" 中文件的历史应该添加到 "new-repo" 中该文件的历史。
有人知道如何开始吗?
您可以很容易地做到这一点,方法是从旧存储库中获取提交,然后使用 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
接下来,在旧存储库中找到与新存储库的根提交相匹配的提交。您可能会发现 git log
对此有帮助。您可以通过 运行 git diff <commit in old repo> <commit in new repo>
验证提交的内容是否匹配,并检查以确保该命令没有输出。如果该命令有输出,要么继续寻找,直到在旧存储库中找到不产生该输出的提交,或者创建一个(通过检查旧存储库中的类似提交,对工作进行必要的更改目录,并提交)。
找到此提交后,在新存储库中找到根提交的直接 child 提交。这应该是新仓库中的第一个提交,它引入了旧仓库中没有的 new 更改。您将在以下命令中使用此提交以及之前在旧存储库中找到的提交。
运行:
git checkout master
git rebase --onto <commit from old repo> <commit from new repo> --preserve-merges
这应该会重播从新存储库到旧存储库的提交。假设前面 git diff
的输出如我所建议的那样是空白的,您应该不会遇到合并冲突。命令完成后,master
分支应包含旧存储库中的历史记录。
由于此过程涉及更改存储库的历史记录,因此下次将 master 分支推送到远程存储库时,您需要使用 --force
选项。
如果除了 master 之外还有任何其他分支,则需要按照与上述类似的步骤将它们移至新存储库:
git checkout branchname
git rebase --onto <base on new master branch> <first commit in branch> --preserve-merges
标签可能不应该被移动,因为它们是不可变的。如果您真的想将标签移动到新历史记录,请参阅 How can I move a tag on a git branch to a different commit?。
当我们的项目开始时,我们不熟悉 git,并且在某个时候决定重新启动存储库。这意味着我们将所有文件导入新存储库,丢失所有历史记录。
今天我想知道是否有办法重新组合这两个存储库。 基本上 "old-repo" 中文件的历史应该添加到 "new-repo" 中该文件的历史。
有人知道如何开始吗?
您可以很容易地做到这一点,方法是从旧存储库中获取提交,然后使用 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
接下来,在旧存储库中找到与新存储库的根提交相匹配的提交。您可能会发现 git log
对此有帮助。您可以通过 运行 git diff <commit in old repo> <commit in new repo>
验证提交的内容是否匹配,并检查以确保该命令没有输出。如果该命令有输出,要么继续寻找,直到在旧存储库中找到不产生该输出的提交,或者创建一个(通过检查旧存储库中的类似提交,对工作进行必要的更改目录,并提交)。
找到此提交后,在新存储库中找到根提交的直接 child 提交。这应该是新仓库中的第一个提交,它引入了旧仓库中没有的 new 更改。您将在以下命令中使用此提交以及之前在旧存储库中找到的提交。
运行:
git checkout master
git rebase --onto <commit from old repo> <commit from new repo> --preserve-merges
这应该会重播从新存储库到旧存储库的提交。假设前面 git diff
的输出如我所建议的那样是空白的,您应该不会遇到合并冲突。命令完成后,master
分支应包含旧存储库中的历史记录。
由于此过程涉及更改存储库的历史记录,因此下次将 master 分支推送到远程存储库时,您需要使用 --force
选项。
如果除了 master 之外还有任何其他分支,则需要按照与上述类似的步骤将它们移至新存储库:
git checkout branchname
git rebase --onto <base on new master branch> <first commit in branch> --preserve-merges
标签可能不应该被移动,因为它们是不可变的。如果您真的想将标签移动到新历史记录,请参阅 How can I move a tag on a git branch to a different commit?。