如何从分支中提取一些提交并将这些提交与git中的另一个分支合并

时间:2012-09-05 11:39:46

标签: git branch

好的,我有以下情况。我有一个名为 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:按建议移动课程并重构a   我一点儿...... 1093032

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

3 个答案:

答案 0 :(得分:2)

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

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

  1. 克隆/结帐分行
  2. 快退一些提交(reset --hard commit_ID)
  3. Cherry-选择你想要的提交
  4. 这可以避免做一次变基。

答案 1 :(得分: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>

答案 2 :(得分: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)

除了 commit2 之外,您希望从AIOEC-393分支进行所有提交。

让我们转到'temp'分支(以便AIOEC-393不被修改):

$ git checkout -b develop-target

然后使用 commit2 作为支点使用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)

现在我们只需要从develop快进到develop-target(然后删除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)