【问题标题】:add history to git repository or merge git repositories将历史记录添加到 git 存储库或合并 git 存储库
【发布时间】:2013-08-16 09:25:04
【问题描述】:

每个人都通过“合并 git 存储库”来理解不同的东西,所以这是我的情况。我们有一个 TFS 存储库,并且我们在某个时间点检查了源代码并进行了初始 git 提交。然后我们在 git 中进行了正常的开发(分支、合并等)。问题是在新存储库中,我们在 git 存储库中没有历史记录,我们想修复它。因此,我已将整个 TFS 存储库转换为 git 存储库,现在我需要将转换后的 TFS 存储库与当前的 git 存储库合并。

从上面的描述可以明显看出,存储库从 git 的角度来看是独立的,但从逻辑的角度来看,它们有一个共同的提交(成为当前 git 存储库的初始提交的提交)。

如何在不丢失其中任何一个历史记录的情况下合并这些存储库?我可以将转换后的 TFS 存储库作为基础,然后从当前存储库的 master 中挑选更改,但这不会导入在当前存储库中创建的所有分支。

【问题讨论】:

    标签: git merge


    【解决方案1】:

    编辑:我之前的回答并没有带来任何好处。 git rebase 并不是为了这样做。 然而,类似的事情已经在 stackoverflow 上发生了:Merging two git repositories to obtain linear history

    你可以试试这个过程:

    git init combined
    cd combined
    git remote add old url:/to/old
    git remote add new url:/to/new
    git remote update
    

    您将拥有一个新的存储库,其中包含两个存储库的引用。那么

    git reset --hard old/master
    

    这将使 master 分支指向旧 repo 的 master 分支。 您现在可以从新 repo 的主分支中挑选所有提交

    git cherry-pick <sha-1 of first commit on new repo>..new/master
    

    我们刚刚开始:master 分支还可以,但是新仓库中的其他分支呢? 好吧,你不再需要你的旧仓库了,所以

    git remote rm old
    

    然后,假设您的新存储库中有一个名为“branch1”的分支。

    git checkout branch1
    git rebase master
    

    这应该会更改 branch1 的历史记录,使其从 master(合并的 master,包含来自您导入的 repo 的历史记录)开始,并且 rebase 应该不会发生冲突。 检查history是否与gitk一致,然后可以强制push with

    git push -f new master
    git push -f new branch1
    

    在强制推送之前,您必须确保历史记录正常,因为这会更改上游历史记录(保留新旧存储库的备份以在需要时恢复)

    【讨论】:

    • “开放分支”是什么意思?后续的变基不会导致来自所有这些不同分支的所有提交都堆积在一个分支上(oldmaster;假设没有冲突)?
    • 不,分支 newrepo/master 将被重新设置为从 oldmaster 开始,然后是 newrepo/branch1 等。这假设在旧 repo 中只有一个分支; “开放分支”是指您希望在 git 存储库中重新定位的与 master 不同的所有分支。最终结果应该是 oldmaster 的内容已被添加到新 git repo 中的每个分支中。最终,在每次变基之前,您需要切换到要变基的分支。 (git checkout newrepo/branch1; git rebase oldmaster)
    • newrepo 中的所有分支都来自一个最初导入到 git 的提交,所以我假设我只有一个“打开的分支”,即使后来从这个起点创建了许多其他分支,正确的?但是我的 oldrepo 包含一些过去稳定版本的分支,这如何改变这种情况?
    • 我尝试了 rebase,但它在 oldrepo 的第一次提交时失败了 - 这表明这里有严重错误(可能是我不了解 rebase 的工作原理)。
    • 编辑了我的答案。抱歉,我对 rebase 的事情有些怀疑,可能要工作它需要有一些共同的提交。现在试试,我认为它应该可以工作。
    【解决方案2】:

    我就是这样做的,不确定这是不是正确的做法,但至少对我有用:

    git clone url:/to/new
    cd repo
    git remote add old url:/to/old
    git remote update
    git rebase --committer-date-is-author-date old/master
    

    就是这样。现在,如果还有其他分支,也许您还需要在 master 上重新设置它们的基础,这可能不是那么简单。

    新 repo 的 git 历史变平了,但对我来说,在查看 git log -p --graph 时没问题

    主要问题是我成为了新仓库所有提交的提交者。为避免这种情况,您可以查看使用git filter-branch --parent-filter 而不是git rebase 的类似问题的答案: https://stackoverflow.com/a/44078243/4374441

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-28
      • 2011-08-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多