gpt4 book ai didi

git - merge 两个 git 仓库以获得线性历史

转载 作者:IT王子 更新时间:2023-10-29 01:03:21 28 4
gpt4 key购买 nike

我有两个 git 存储库,它们之间有很多未跟踪的更改:

   ftp -->            C-- (untracked changes) --D
/ \
git A--B--C <-- old/master \
\
\
new/master --> D--E--F

我如何将旧存储库 merge 到新存储库中以获得像这样的线性历史

A--B--C--D--E--F

编辑:

灵感来自 How can I combine Git repositories into a linear history?

我已经完成了:

git clone url://new new
cd new/
git remote add old url://old
git fetch old
git reset --hard origin/master
git filter-branch --parent-filter 'sed "s_^\$_-p old/master_"' HEAD
git push origin master

唯一的问题是来自 new/master 的每个提交都加倍了(我认为是由于父级的更改)所以我现在(M 是 merge 提交)

         D---E---F--         
\
A--B--C--D'--E'--F'--M

如何轻松删除不必要的提交(D - F,也许还有 M)?

最佳答案

修复 git filter-branch 的结果

如果您有一个如下所示的存储库:

         D---E---F--
\
A--B--C--D'--E'--F'--M <-master

并且您希望结果如下所示:

A--B--C--D'--E'--F' <-master

然后你可以简单地强制master指向F' :

git checkout master
git reset --hard <sha1-of-F'>

这将导致提交 D , E , F , 和 M变得不可访问,有效地删除它们(它们将在一段时间后被垃圾收集)。

从头开始

假设您有两个如下所示的存储库:

  • 旧:A--B--C <-master
  • 新:D--E--F <-master

你想要的结果是:

  • merge :A--B--C--D'--E'--F' <- master

然后您可以执行以下步骤:

  1. 初始化combined存储库:

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

    此时你的combined存储库看起来像:

    A--B--C <-old/master

    D--E--F <-new/master

    请注意,这两个分支没有以任何方式连接。

  2. 设置您的 master分支指向C :

    git reset --hard old/master

    现在你的仓库看起来像这样:

          old/master
    |
    v
    A--B--C <-master

    D--E--F <-new/master
  3. 找到 D 的 sha1 :

    d=$(git rev-list --reverse new/master | head -n 1)
  4. 导入 D通过阅读提交的内容进入你的工作目录和索引

    git read-tree -u --reset $d
  5. 提交 D 的内容使用与原始 D 相同的提交消息、作者、日期等提交:

    git commit -C $d

    现在你的仓库看起来像这样:

          old/master
    |
    v
    A--B--C--D' <-master

    D--E--F <-new/master
  6. 挑选其余的提交:

    git cherry-pick $d..new/master

    现在你的仓库看起来像这样:

          old/master
    |
    v
    A--B--C--D'--E'--F' <-master

    D--E--F <-new/master
  7. 清理:

    git remote rm old
    git remote rm new

    现在你的仓库看起来像这样:

    A--B--C--D'--E'--F' <-master

关于git - merge 两个 git 仓库以获得线性历史,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16972721/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com