合并两个git存储库以获取线性历史记录

ts.*_*ts. 10 git merge

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

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

如何将旧存储库合并到新存储库中以获得线性历史记录

A--B--C--D--E--F
Run Code Online (Sandbox Code Playgroud)

编辑:

灵感来自如何将Git存储库组合成线性历史记录?

我弄完了:

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
Run Code Online (Sandbox Code Playgroud)

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

         D---E---F--         
                    \
A--B--C--D'--E'--F'--M 
Run Code Online (Sandbox Code Playgroud)

如何轻松删除不必要的提交(D-F和M)?

Ric*_*sen 5

固定结果 git filter-branch

如果您的存储库如下所示:

         D---E---F--
                    \
A--B--C--D'--E'--F'--M <-master
Run Code Online (Sandbox Code Playgroud)

并且您希望结果看起来像这样:

A--B--C--D'--E'--F' <-master
Run Code Online (Sandbox Code Playgroud)

那么您可以简单地强制master指向F'

git checkout master
git reset --hard <sha1-of-F'>
Run Code Online (Sandbox Code Playgroud)

这将导致提交DEF,和M成为无法访问,有效地删除它们(他们会经过一段时间收集的垃圾)。

从头开始

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

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

并且您希望结果为:

  • 合并: 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
    
    Run Code Online (Sandbox Code Playgroud)

    此时,您的combined存储库如下所示:

    A--B--C <-old/master
    
    D--E--F <-new/master
    
    Run Code Online (Sandbox Code Playgroud)

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

  2. master分支设置为指向C

    git reset --hard old/master
    
    Run Code Online (Sandbox Code Playgroud)

    现在您的存储库如下所示:

          old/master
          |
          v
    A--B--C <-master
    
    D--E--F <-new/master
    
    Run Code Online (Sandbox Code Playgroud)
  3. 找到以下的sha1 D

    d=$(git rev-list --reverse new/master | head -n 1)
    
    Run Code Online (Sandbox Code Playgroud)
  4. D通过读取提交内容导入到您的工作目录和索引中

    git read-tree -u --reset $d
    
    Run Code Online (Sandbox Code Playgroud)
  5. 提交的内容D使用与原始相同提交消息,作者,日期等D提交:

    git commit -C $d
    
    Run Code Online (Sandbox Code Playgroud)

    现在您的存储库如下所示:

          old/master
          |
          v
    A--B--C--D' <-master
    
    D--E--F <-new/master
    
    Run Code Online (Sandbox Code Playgroud)
  6. 挑选其余提交内容:

    git cherry-pick $d..new/master
    
    Run Code Online (Sandbox Code Playgroud)

    现在您的存储库如下所示:

          old/master
          |
          v
    A--B--C--D'--E'--F' <-master
    
    D--E--F <-new/master
    
    Run Code Online (Sandbox Code Playgroud)
  7. 清理:

    git remote rm old
    git remote rm new
    
    Run Code Online (Sandbox Code Playgroud)

    现在您的存储库如下所示:

    A--B--C--D'--E'--F' <-master
    
    Run Code Online (Sandbox Code Playgroud)


小智 1

如果ftp不是合适的分支而只是复制粘贴作业, 这 对您有用

cd git
git rm -r .
cp -r ../ftp/. .
git add
git commit
Run Code Online (Sandbox Code Playgroud)