【问题标题】:Restore git history from split repositories从拆分存储库中恢复 git 历史记录
【发布时间】:2016-06-24 16:07:30
【问题描述】:

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

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

有人知道如何开始吗?

【问题讨论】:

    标签: git merge git-rewrite-history


    【解决方案1】:

    您可以很容易地做到这一点,方法是从旧存储库中获取提交,然后使用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 &lt;commit in old repo&gt; &lt;commit in new repo&gt; 并检查以确保该命令没有输出来验证提交的内容是否匹配。如果该命令有输出,要么继续查找,直到在旧存储库中找到不产生该输出的提交,或者进行一个(通过检查旧存储库中的类似提交,对工作进行必要的更改目录,并提交)。

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

    运行:

    git checkout master
    git rebase --onto <commit from old repo> <commit from new repo> --preserve-merges
    

    这应该将新存储库中的提交重播到旧存储库。假设早先git diff 的输出如我所建议的那样是空白的,那么您应该不会遇到合并冲突。命令完成后,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?

    【讨论】:

    • 嘿,谢谢你的好答案!
    猜你喜欢
    • 2012-03-29
    • 1970-01-01
    • 1970-01-01
    • 2019-03-17
    • 1970-01-01
    • 2011-05-29
    • 2020-05-28
    相关资源
    最近更新 更多