我有一个看起来像这样的git回购:
A - B - C - D - E - F
^ ^
| |
Staging master
我想将Staging分支指针移动到E,但我不希望提交B和D在分支中。我想将B和D放入他们自己的分支。
Staging
|
V
A ---- C ----- E - F <- master
\ /
B ----- D -----
^
|
new branch
我不知道如何将提交移出主分支链并将它们移动到自己的分支,然后再将它们重新合并到master中。
这甚至可能吗?
答案 0 :(得分:4)
我会使用interactive rebasing(git rebase -i
)进行这类转换。
创建new-branch
git checkout -b new-branch D
git rebase -i A^
移动staging
:
git checkout staging
git reset --hard E
git rebase -i A^
更新master
:
git checkout master
git reset --hard staging
git merge new-branch
互动式变基
您可以使用git rebase -i A^
(从HEAD
到A
获取所有内容)启动交互式变基。您的编辑器将打开并呈现从最旧到最新订购的提交(请注意,这与git log
的顺序相反,有时会令人困惑)。您可以通过重新排列相应的行来重新排列提交。您还可以删除行,删除关联的提交。 (在你的情况下,删除就足够了。)
注意:如果您已将历史记录发布给同事,则重新定位会更改您不应该执行的历史记录。
答案 1 :(得分:1)
根据A:
创建两个新分支git branch staging-new A
git branch new-branch A
然后使用cherry-picking来为每个分支选择你想要的提交:
git checkout staging-new
git cherry-pick C E
和new-branch类似。
然后你可以删除旧的分支Staging。大师保持不变。
注意:
答案 2 :(得分:0)
您希望使用git cherry-pick
有选择地将提交从一个分支移动到另一个分支。
本文可能会对您有所帮助:http://technosophos.com/content/git-cherry-picking-move-small-code-patches-across-branches