重新启动单个Git提交

时间:2013-01-31 21:41:23

标签: git rebase

有没有办法将单个提交从分支重新绑定到另一个分支?

我有这个分支结构:

-- -- -- -- -- (Master)
            \
              -- -- -- -- -- XX (Feature-branch)

我想要做的就是将Feature-branch的最后一次提交重新设置为master并回滚Feature-branch一次提交。

-- -- -- -- -- XX (Master)
            \
              -- -- -- -- -- (Feature-branch)

我该怎么做?

5 个答案:

答案 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)

这是另一种选择:

  1. 确保您具有带有功能分支副本的遥控器
  2. 删除本地要素分支
  3. 创建和签出一个新分支,其名称与您刚从master删除的旧功能分支同名。
  4. 从所需功能分支的远程副本中选择一次提交。

命令如下:

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。