【问题标题】:Git divide commits between branchesGit 在分支之间划分提交
【发布时间】:2015-11-18 20:24:53
【问题描述】:
目前我有我的远程开发分支,提交如下:
C1 -> C2 -> C3 -> C4 -> C5 -> C6
(Cx 作为提交 x)
我需要将这些提交划分到新的分支,所以它看起来像这样:
开发分支:C1C2C6
NewBranchTwo:C3C5
新分支三:C4
(NewBranchTwo 和NewBranchThree 不需要变成远程)
我怎样才能做到这一点?
【问题讨论】:
标签:
git
git-branch
git-revert
【解决方案1】:
git rebase 是你的朋友。
实现此目的的一种简单方法是使用git branch 生成三个相同的分支(Develop、NewBranchTwo、NewBranchThree),然后您可以使用它们进行编辑
git rebase --interactive C1
...用提交的哈希或其他参考替换 C1。在交互模式下,git 将首先弹出一个文本编辑器,在其中显示整个历史记录,并根据您在编辑器中进行的任何删除或重新排序,从上到下依次应用提交。您可以轻松删除 C3 到 C5 进行开发,并对其他分支进行相应的编辑。
您也可以跳过交互模式并使用git reset 和git rebase --onto 将C6 移动到C2 上并命名为Develop,同样将C3 移动到上游头部,将C5 移动到上游头部(等等)。在不知道 C1 的实际哈希值或父级的情况下,我将把实际命令留给 git rebase documentation。
(您将git-revert 放在标签中,但如果您尝试划分提交,git revert 将无济于事:它记录新提交,在不删除现有提交的情况下撤消它们。如果您希望历史记录保持原样,而不是 C1 C2 C3 C4 C5 C6 rev-C5 rev-C4 rev-C3,则需要重新设置历史记录或以其他方式编辑历史记录。)
您可能已经知道,任何时候您调整已经发生的提交时,您都会更改它们的哈希值,这可能会让已经分支的任何人都感到困难。希望你还没有推送你的远程开发分支!
【解决方案2】:
我最终做了什么:
开发:C1 C2 C3 C4 C5 C6 rev-C6 rev-C5 rev-C4 rev-C3 rev-C2 rev-C1
从开发中我创建了 NewBranchTwo 和 NewBranchThree - 所以这三个都恢复了所有提交。
然后在每个分支上:
开发分支:rev-rev-C1rev-rev-C2rev-rev-C6
NewBranchTwo:rev-rev-C3rev-rev-C5
新分支三:rev-rev-C4
所以基本上我恢复了所有提交,创建了两个新分支,然后在每个分支上我恢复了我需要的恢复提交。