0

好的,我有以下情况。我有一个名为develop的分支。
从开发中,我创建了一个名为AIOEC-393的分支。
它包含以下提交:

nicoladj77 重新安装 wordpress 938f469

nicoladj77 AIOEC-122:为 ai1ec_events 添加提要 2254569

nicoladj77 AIOEC-122:删除已解析的 css 文件 d10e29e

nicoladj77 AIOEC-122:向函数 38054dd 添加了注释

nicoladj77 AIOEC-393:开始移动文件 6f92360

nicoladj77 AIOEC-393 移动类并取出 require_once 调用 b7ab691

nicoladj77 AIOEC-393:开始移动基础容器 87e8b91

nicoladj77 AIOEC-393:按照建议移动了类并重构了一段时间我… … 1093032

我需要创建另一个基于develop的分支,并且只包含AIOEC-393的最后四个提交(当然是以 AIOEC-393 开头的提交)。我怎样才能做到这一点?

4

3 回答 3

2

git cherry-pick可以做到这一点。只需将要合并到当前分支的提交 ID 作为命令的参数提供。这将“挑选”提交,即使提交属于不同的分支。

或者,也应该起作用的是:

  1. 克隆/签出分支
  2. 回退一些提交(reset --hard commit_ID)
  3. Cherry-pick 你想要的提交

这避免了做一个变基。

于 2012-09-05T11:41:17.520 回答
1

如果提交是您分支上的第一次提交,您可以简单地签出最后一次提交并在其位置创建一个新分支:

git checkout -b new_branch <id of "AIOEC-393: Starting to move files 6f92360">

如果在新分支中您想要的提交之前还有其他提交(您不想要),请创建一个新分支并将其变基:

git checkout -b new_branch <last commit you want>
git rebase --onto develop <commit before your commits> new_branch

或者,创建一个分支develop并挑选您想要的提交:

git checkout -b new_branch develop
git cherry-pick <commit before your commits>..<last commit you want>
于 2012-09-05T11:52:35.053 回答
1

我建议您使用rebase onto. 假设我们有以下回购:

user@HOST c:/_TEMP/FOO (AIOEC-393) $ git lga
* 8c2d5c5 - (HEAD, AIOEC-393) commit5 (Yanflea 2 minutes  ago)
* 3c20e52 - commit4 (Yanflea 2 minutes  ago)
* c5383af - commit3 (Yanflea 2 minutes  ago)
* fb11e98 - commit2 (Yanflea 2 minutes  ago)
* e019261 - (develop) commit1 (Yanflea 2 minutes  ago)
* 0cfe064 - (master) Initial commit (Yanflea 2 minutes ago)

并且您希望获得AIOEC-393commit2之外的分支的所有提交。

让我们移动到一个“临时”分支(这样AIOEC-393就不会被修改):

$ git checkout -b develop-target

然后使用commit2作为pivot的rebase onto命令:

$ git rebase --onto develop fb11e98 develop-target

让我们看看日志:

user@HOST c:/_TEMP/FOO (develop-target) $ git lga
* 7bcb162 - (HEAD, develop-target) commit5 (Yanflea 2 minutes ago)
* 3c89459 - commit4 (Yanflea  2 minutes ago)
* e6ed5f7 - commit3 (Yanflea  2 minutes ago)
* e019261 - (develop) commit1 (Yanflea  2 minutes ago)
* 0cfe064 - (master) Initial commit (Yanflea  2 minutes ago)

现在我们只需要快进 from developto develop-target(然后 remove develop-target):

$ git checkout develop
$ git rebase develop-target
$ git branch -d develop-target

日志:

user@HOST c:/_TEMP/FOO (develop) $ git lga
* 7bcb162 - (HEAD, develop) commit5 (Yanflea 2 minutes ago)
* 3c89459 - commit4 (Yanflea 2 minutes ago)
* e6ed5f7 - commit3 (Yanflea 2 minutes ago)
* e019261 - commit1 (Yanflea 2 minutes ago)
* 0cfe064 - (master) Initial commit (Yanflea 2 minutes ago)
于 2012-09-05T12:58:01.683 回答