来自旧提交的Git分支

时间:2015-03-26 00:24:01

标签: git git-branch git-branch-sculpting

我在SO和其他文档上研究了这个。我尝试过变基,合并,采摘和分离头。

经过6个小时的尝试,现在是时候问这个问题了!

以下是我的开始:

A-B-C-D-E-F-G master

以下是我想将其更改为:

A-B      F-G  master
   \    / 
    C-D-E dev

我最接近的是:

A-B      C-D-E-F-G-H Main
   \    / 
    C-D-E dev
        \
         F-G master

我必须添加另一个分支名称和一个虚拟提交,以使分支完全正常工作。

但这比没有改变更糟糕。

请帮忙!

更新后更新

感谢您的回复。

是的,我的“我想要的”不是很清楚。希望这澄清了它:

A-B   -  F-G  master
   \    / 
    C-D-E dev

换句话说,F中的“master”是B加上分支“dev”合并到其中的结果。

仍然没有工作

感谢@frasertweedale尝试回答。

我已仔细按照您的指示操作,这是我最终的结果:

A-B   -  "merge branch 'dev'"-G  master
   \    / 
    C-D-E dev
        \ 
         F-G-"merge branch 'dev'"-F-G

我很高兴这很难:现在我花了7个小时就感觉不好!

最终结果 正如@frasertweedale所说,这正是我想要的,除了悬空提交。

所以,我只需要摆脱悬挂。

为清楚起见,我在下面重新绘制:

A-B   -  "merge branch 'dev'"-G2  master
   \    / 
    C-D-E dev
        \ 
         F1-G1-"merge branch 'dev'"-F2-G2

此命令执行清理:

git rebase -p --onto F1^ F1

结果:

A-B   -  "merge branch 'dev'"-G2  master
   \    / 
    C-D-E dev

“merge branch'dev'”包含原始F提交,当然可以通过这种方式重新评论。

1 个答案:

答案 0 :(得分:0)

假设您将AB等扩展到相应的提交哈希值,而master位于G,则第一步是分支dev } E

git branch dev E

然后将master重置为B

git reset --hard B

接下来,将dev合并到master,明确要求合并提交(否则它会执行快进,因为dev没有偏离{ {1}}):

master

git merge --no-ff dev 现在包含最多master的提交。现在,您可以 cherry-pick 原始EF提交。

G

现在你有一些非常接近你想要的东西;唯一的区别是添加了合并提交git cherry-pick F git cherry-pick G

(B+E)

如果您现在想要在合并提交A-B - (B+E)-F-G master \ / C-D-E dev 中包含F的内容,则可以执行交互式rebase 并将两个提交压缩在一起。 <{1}}(别名(B+E))选项至关重要。

--preserve-merges

这将调用内容类似于以下内容的编辑器(提交哈希和摘要会有所不同):

-p

使用git rebase --interactive --preserve-merges B 指令替换pick d4057bd c pick 9419ef8 d pick ad9e208 e pick 120a90a Merge branch 'dev' pick 61552ad f pick c947153 g 提交行开头的pick指令(在上面的示例中为F),然后保存并退出。系统将提示您从合并提交和squash的提交消息中形成新的提交消息,然后将完成rebase操作而无需进一步的交互。在rebase之后,您将完全您要求的存储库历史记录(在您更新的问题中)。

缩写SCRIPT

以下脚本创建一个具有线性历史记录的新存储库,然后使用(大部分)与上面相同的步骤自动编辑历史记录。避免使用交互式rebase,因此不需要用户干预。

squash 61552ad f