从分离的仓库中恢复git历史记录

3
当我们的项目开始时,我们对git不是很熟悉,后来决定重新启动存储库。这意味着我们将所有文件导入新存储库,失去了所有历史记录。
今天我想知道是否有一种方法可以重新合并这两个存储库。 基本上,“旧存储库”中文件的历史记录应该添加到“新存储库”中该文件的历史记录中。
有人知道如何开始吗?
1个回答

8
你可以通过从旧仓库获取提交记录,然后使用 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>并检查确保该命令没有输出,以验证提交的内容是否匹配。如果该命令有输出,则需要继续查找,直到找到在旧仓库中不会产生该输出的提交,或者创建一个(通过在旧仓库中签出类似的提交,对工作目录进行必要的更改并提交)。
找到了这个提交后,在新仓库根提交的子提交中找到最近的子提交。这应该是新仓库中第一个引入旧仓库中没有的新更改的提交。您将使用此提交以及之前在旧仓库中找到的提交,在以下命令中运行:
```bash git cherry-pick <commit in new repo>..<commit in old repo> ```
git checkout master
git rebase --onto <commit from old repo> <commit from new repo> --preserve-merges

这将把新存储库中的提交回放到旧存储库中。假设之前的git diff输出为空,正如我所建议的那样,您不应遇到合并冲突。命令完成后,master分支应包含旧存储库的历史记录。

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

如果除了主分支之外还有其他分支,则需要按照与上面类似的过程将它们转移到新存储库中:

git checkout branchname
git rebase --onto <base on new master branch> <first commit in branch> --preserve-merges

标签应该不会被移动,因为它们是不可变的。如果您真的想将标签移动到新的历史记录,请参见如何将git分支上的标签移动到不同的提交?


嘿,谢谢你的精彩回答! - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接