139

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

我有这个分支结构:

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

我要做的就是将最后一次提交重新定位Feature-branch到 master 并回滚Feature-branch一次提交。

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

我怎么做?

4

4 回答 4

136

您可以挑选 XX 来掌握。

git checkout master
git cherry-pick <commit ID of XX>

并使用 git reset 从功能分支中删除最后一次提交。

git checkout Feature-branch
git reset --hard HEAD^
于 2013-01-31T21:46:50.963 回答
121
git rebase --onto master branch~1 branch 

这表示“在 master 分支的尖端重新调整 last-before-branch 和分支(即 XX 提交)之间的提交范围”

branch在提交此操作提示后XX,您希望将其设置回来

git checkout branch
git reset --hard branch@{1}^

上面写着“将分支提示重置为之前状态之前的提交”

所以樱桃采摘是一个更简单的解决方案......

于 2013-01-31T21:46:00.067 回答
75

其实做起来很简单。解决方案是进行交互式变基并“删除”您不想包含在变基中的所有提交。

git rebase -i <target_branch>target_branch您要重新定位到的分支在哪里

然后你将编辑打开的文件和pick你想要的提交和drop(或d简称)你不想带来的所有提交。

于 2017-10-26T19:53:15.027 回答
0

@Charles 的回答是正确的。无论如何,我最终使用了很多次,最重要的是在项目上重新设置特定配置

  * a8f9182 (HEAD -> production) 生产配置
  | * daa18b7 (pre) 预生产配置
  |/  
  | * d365f5f (local) 本地配置
  |/  
  * 27d2835 (dev) 将拯救世界的惊人新功能
* | 56d2467 (master) 钻孔最先进的项目
|/

我为它创建了一个新命令:

$ 猫 ~/bin/git-rebaseshot
提交=$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 配置
* a8f9182(本地)本地配置
* a8f9182(调试)日志级别配置
* a8f9182(开发)新功能
|

我想这就是被子人喜欢做的事情。

不管你提供什么 sha/ref,这个命令都可以工作:

$ git rebaseshot <Feature branch> master
$ git rebaseshot <commit of XX> master
于 2015-09-25T14:50:54.597 回答