有没有办法将单个提交从分支重新绑定到另一个分支?
我有这个分支结构:
-- -- -- -- -- (Master)
\
-- -- -- -- -- XX (Feature-branch)
我想要做的就是将Feature-branch
的最后一次提交重新设置为master并回滚Feature-branch
一次提交。
-- -- -- -- -- XX (Master)
\
-- -- -- -- -- (Feature-branch)
我该怎么做?
答案 0 :(得分:97)
你可以挑选XX来掌握。
git checkout master
git cherry-pick <commit ID of XX>
使用git reset从功能分支中删除最后一次提交。
git checkout Feature-branch
git reset --hard HEAD^
答案 1 :(得分:70)
git rebase --onto master branch~1 branch
这说“在主分支的尖端上”修改last-before-branch和branch(即XX commit)之间的提交范围“
此操作后,branch
提示会在提交XX
上移动,因此您需要将其设置为
git checkout branch
git reset --hard branch@{1}^
其中说“将分支提示重置为先前状态之前的提交”
所以樱桃选择是一个更简单的解决方案...
答案 2 :(得分:25)
实际上这很简单。解决方案是进行交互式变基和&#34; drop&#34;所有你想要包含在rebase中的提交。
git rebase -i <target_branch>
其中target_branch
是您想要转移到
然后,您将编辑已打开的文件并pick
您想要的提交和drop
(或简称为d
)所有您不想要的提交带来。
答案 3 :(得分:1)
@Charles的回答是正确的。无论如何,我最终使用了这么多次,最重要的是在项目上重新定义特定的配置
* a8f9182 (HEAD -> production) production configuration | * daa18b7 (pre) preproduction configuration |/ | * d365f5f (local) local configuration |/ * 27d2835 (dev) amazing new feature that will save the world * | 56d2467 (master) boring state of the art for project |/
我为它创建了一个新命令:
$ cat ~/bin/git-rebaseshot COMMIT=$1 DEST=${2:-HEAD} git rebase ${COMMIT}^ ${COMMIT} --onto $DEST
通常你想自动完成该命令的分支名称,所以添加它来源这个函数(添加到.bashrc或.profile):
_git_rebaseshot () { __gitcomp_nl "$(__git_refs)" }
git autocomplete将搜索它
您可以像这样使用此命令:
# rebase config on prepro on actual HEAD
$ git rebaseshot prepro
# rebase config on local onto dev
$ git rebaseshot local dev
# rebase production config on master
$ git rebaseshot pro master
正确划分要素时,可能性无穷无尽。
* a8f9182 (HEAD -> postgres) BBDD config * a8f9182 (local) local config * a8f9182 (debug) log level config * a8f9182 (dev) new feature |
我想这是quilt人喜欢做的事情。
无论如何,无论你提供什么sha / ref,这个命令都能正常工作:
$ git rebaseshot <Feature branch> master
$ git rebaseshot <commit of XX> master
答案 4 :(得分:0)
这是另一种选择:
命令如下:
git checkout Feature-branch
git push -u origin HEAD
git checkout master
git branch -D Feature-branch
git checkout -b Feature-branch
git cherry-pick HASH-OF-XX
这不是rebase命令,而是精神上的rebase。