如何在不更改其内容的情况下使 git 分支成为另一个分支的后代?

问题描述 投票:0回答:1

我有两个分支,2和4:

2c              <- top of branch 2
|
2b
|
2a              <- root branch 2

4c             <- top of branch 4
|
4b
|
4a              <- root branch 4

问题是:

分支 4 的根实际上源自分支 2 的顶部,但这是 在 git 之外完成的

我想在 git 中反映这一点,通过链接这两个分支,以便我们可以轻松识别 2c 和 4a 之间的差异,并且也可以更容易地合并具有类似更改的其他第三个分支算法。

结果应该是这样的:

4c             <- top of branch 4
|
4b
|
4a              <- root branch 4
| <================================== new connection between the two branches
2c              <- top of branch 2
|
2b
|
2a              <- root branch 2

在阅读了大量有关变基和更改提交父级的内容之后,我使用了以下方法,这似乎不是最佳方法:

    cd dev/project      # work locally, within the repo top folder: project
    git checkout 2
    git checkout -b 4L  # temporary branch to perform the link between the branches, based on the top of branch 2 
    git checkout 4
    git checkout 4a     #  retrieve the root of branch 4 in the working directory before to copy it
    cp -r . ../project-copy-4a  # save the work directory for later use
    git checkout -b 4L # return to temporary branch
    rm -rf *           # clean the working directory
    cp -r ../project-copy-4a/* ./  # incorporate the 4a content to simulate the developer     changes from status 2c
    git rm . ; git add .           # make sure to include the new files in git before commit
    git commit -m "connect branches 2 and 4"

我现在的状态是:

4La     (content equal to 4a)
|
2c              <- top of branch 2
|
2b
|
2a              <- root branch 2

为了连接分支,我现在将在分支 4L 上对分支 4 进行变基,其顶部内容等于分支 4 的根,因此不会更改任何分支 4 提交中的内容:

    git checkout 4  # move to branch 4
    git rebase 4L   # rebase it on branch 2, through branch 4L

我现在有了目标状态(其中 4x' 可能是来自 rebase 的新提交哈希,但其内容等于 4x 的内容):

4c '            <- top of branch 4
|
4b'
|
(4a')              <- root branch 4 (not sure git keeps this commit as it contains no changes)
|
4La
| <================================== new connection between the two branches
2c              <- top of branch 2
|
2b
|
2a              <- root branch 2

在纯 git 命令中实现此目的的更好程序是什么,而不诉诸像 cp -r 这样的文件系统命令,这些命令可能很繁重且有风险,例如由于文件系统树和 git 文件树之间的差异?

git merge branch rebase revision-history
1个回答
0
投票
我想你想

嫁接你的历史:

git replace --graft 4a 2c
然后

git filter-branch

git filter-repo
使您的移植物永久化。这将重写您的提交并更改其提交哈希值;没有办法避免这一点。


另一种方法是从现有树中手动创建提交对象:

git checkout 2c id=$(git commit-tree -m 'commit message' -p 2c 4a^{tree}) id=$(git commit-tree -m 'commit message' -p "$id" 4b^{tree}) … git merge --ff-only "$id"
    
© www.soinside.com 2019 - 2024. All rights reserved.