假设我有一个git仓库,在主分支上进行了工作,我能否事后创建一个分支。例如:
A - B - C - A1 - D - A2 - E
我想让它看起来像这样:
A - A1 - A2
\ \
B - C - D - E
具体使用场景是当我将一堆提交挑选到旧版本分支中,需要将其合并到多个更旧版本中,而我不想在所有这些版本上重复挑选提交。
本质上,这本应该作为特性或主题分支的好处,但没有像那样创建。
如果你想要在一个分支中使所有的提交都是在版本XXX之后发生的,我认为这比其他提议的方法容易得多。
$ git branch fixes # copies master to new branch
$ git reset --hard XXX # resets master to XXX
这些提交现在仅存在于“fixes”分支中。
Git的帮助页面reset
章节描述了将提交撤销并变成一个主题分支的过程。
当然可以。(使用Git几乎没有什么做不到的事情。:)
git checkout -b new-branch hash-of-A
git cherry-pick hash-of-A1
git cherry-pick hash-of-A2
这将创建一个新的分支,从提交A
开始。然后你再次回到相同的提交,创建另一个分支:
git checkout -b new-branch2 hash-of-A
git cherry-pick hash-of-B
git cherry-pick hash-of-C
git cherry-pick hash-of-D
git cherry-pick hash-of-E
git merge new-branch
现在你只需合并 new-branch
和 new-branch2
即可获得所需的结构并删除旧分支。由于哈希值将会发生变化,因此您无法透明地执行此操作。但是,您只需要分支HEAD并在两个分支上使用rebase -i命令来删除相应的更改即可。
$ git checkout -b fixes A
这也会使分支“fixes”变为当前分支。因为我们只想要取消樱桃拣选的几个提交,所以我们可以在“fixes”分支上进行樱桃拣选:
$ git cherry-pick A1
$ git cherry-pick A2
$ git rebase -i fixes master
在提交“ A”(即分支“ master”和分支“ fixes”的合并基础)后,将启动一个编辑器,并显示所有“ master”中的提交。 列表如下:
pick deadbee B
pick fa1afe1 C
pick a98d4ba A1
...
删除包含提交 'A1' 和 'A2' 的行,保存更改,关闭编辑器(或以其他方式将更改发送到交互式变基),Git 将重新应用除您已删除的提交之外的所有提交。
然后您可以完成以下操作:
$ git merge fixes
(git-rebase 把我们留在了重写后的分支 'master' 上)。
origin/master
:假设你在master
分支上,接受所有未推送的提交并将它们视为一个分支。最后你也可能想要运行git checkout fixes
命令来实际切换到你的新分支。 - Jesse Glickgit push -f origin master
被拒绝。 - Dims