2009-08-31 68 views
5

通常我在master分支上工作,我做了一些提交,然后推送它。如何合并另一个分支的头提交?

然后我还需要将这些提交推送到其他分支。

所以通常情况下,我会做:

$ git checkout another-branch 
$ git cherry-pick commit1 
$ git cherry-pick commit2 
... 
$ git cherry-pick commitn 
$ git push 

一些挺傻的,反正是有,我可以从主分支的头合并一些提交,所以我不必 懒得樱桃挑一的一。

回答

9

这听起来像你可能想作出比其他主分支的提交,然后分支合并到主,你的第二个分支:

git checkout working-branch 
<do some work> 
git commit 
git checkout master 
git merge working-branch 
git checkout second-branch 
git merge working-branch 

这是多少,比cherry-好得多因为它不涉及在历史记录中重复提交,因此摆脱了有关挑选提交两次(您目前必须手动避免)的任何问题......并且只是git旨在用于工作的方式。我不知道你的第二个分支是什么,但我所描述的基本上是将维护和主题分支定期合并回主以及任何其他适当的修改版本或维护分支的常见工作流程。

我强烈建议你采用地方,这是通过如我上面描述的合并做了工作流程,但回答你问的问题,如果你绝对必须掌握和樱桃挑选工作,你可能要自己写小脚本,像这样:

#!/bin/bash 
# take two arguments: 
# 1. other branch to put commits on 
# 2. number of commits to cherry-pick from master  

if ! git checkout $1; then 
    exit 
fi 
git rev-list --reverse -n $2 master | 
while read commit; do 
    if ! git cherry-pick $commit; then 
     exit 
    fi 
done 

显然有办法使脚本更健壮,例如增加了补丁无法正确应用的樱桃挑选后恢复的能力,但这只是一个开始。

当然,你可以使用git-rev-list来选择提交的方式。你甚至可以将除了第一个参数以外的所有参数传递给git-rev-list,这样你就可以做cherries-pick <branch> -n 5 mastercherries-pick <branch> release_tag..master或任何你想要的。看看它的man page

您还可以使用git-rebase正如其他地方的建议,而是因为你实际上并没有想移动的主人,你最终会做这样的事情:

git branch master-copy master 
git rebase --onto <branch> master~5 master 
git checkout <branch> 
git merge master-copy 
git branch -d master-copy 
+0

非常令人印象深刻,谢谢! – 2009-09-01 06:33:42

0

如果你只是想更新与主您的分支,这样做:

git checkout branch; git merge master 
git rebase origin 

如果你不想拉一切从主,你可以选择的diff版本(BOO)或个别功能的使用分支 - 然后您可以将功能分支合并到主分支和其他分支中。

+0

我只是想n提交来自master的头部进行合并,而不是其他提交的分支和主控之间的不同。 – 2009-08-31 07:13:00

+1

git rebase -i原点;它会在一行中为您打开一个文本编辑器,您需要删除不想要的提交行 – 2009-08-31 08:33:33

1

git cherry-pick commit1..commitn

相关问题