重新建立单个 Git 提交的基础

是否有办法将单个提交从一个分支重新基于另一个分支?

我有这样的分支结构:

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

我所要做的就是将 Feature-branch的最后一次提交重新建立在 master 和 rollback Feature-branch的一次提交上。

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

我该怎么做?

114392 次浏览
git rebase --onto master branch~1 branch

这意味着“在主分支的顶端重新设置 last-before-Branch 和分支(即 XX commit)之间的提交范围”

在此操作之后,提交 XX时移动了 branch提示,因此您希望使用

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

表示“将分支提示重置为提交之前的状态”

所以选择一个更简单的方法。

你可以挑选 XX 来掌握。

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

并使用 git 重置从特性分支中删除最后一次提交。

git checkout Feature-branch
git reset --hard HEAD^

@ 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

通常,您希望自动完成该命令的分支名称,因此添加它来源于这个函数(添加到。巴希尔。简介) :

_git_rebaseshot ()
{
__gitcomp_nl "$(__git_refs)"
}

Git 自动补全将搜索它

你可以这样使用这个命令:

# 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
|

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

无论如何,这个命令将与您提供的 sha/ref 一起工作:

$ git rebaseshot <Feature branch> master
$ git rebaseshot <commit of XX> master

其实很简单。解决方案是执行一个交互式的 rebase,并“删除”所有您不希望包含在 rebase 中的提交。

其中 target_branch是要重新基于的分支

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