format-patch工作得相当好,寻找更好的方法

时间:2009-04-21 17:30:18

标签: git rebase format-patch

我有两个不同的分支,以至于变基似乎不起作用 - 或者我不知道该怎么做。

我有一个“公共”分支,删除了一堆文件(使用filter-branch)。尽管大多数提交在增量方面都匹配,但提交ID都是不同的。我已经尝试了很多方法来将更改从我的开发分支拉到我的公共分支......我发现很难相信它可以做我想做的事 - 但我怀疑我只是不知道如何做到这一点。在任何情况下,这都很好,但似乎错了。

git checkout dev
git format-patch --stdout last_sync_tag > catchup.mbox
git checkout public
git am catchup.mbox
git --skip # talks about a missing file
git --skip # talks about a missing file
git --skip # talks about a missing file

任何提示或建议,可能不包括过滤分支出你不想在公共分支上的文件(但是,你如何摆脱它们?),欢迎。

我的树或多或少看起来像这样:

dev: a-b-c-d-e-f-g-h-i-j-k
pub: t-u-v-w-x

t≅a,u≅c,v≅d,w≅e,x≅g。 i,j,k是我想要移动的新补丁。

checkout pub
rebase --onto pub i  # I really expected this to work

4 个答案:

答案 0 :(得分:1)

Git的cherry-pick命令可能很有用。我没有在你的情况下使用它,但我认为它应该工作。唯一的痛苦是它不是设计用于一系列提交,所以如果你想编写脚本/自动化它,你必须使用像git rev-list这样的东西。

同样,我没有试过这个,但像这样的bash脚本可能会给你一个很好的起点

git checkout public
for rev in $(git rev-list --reverse last_sync_tag..dev) ; do
   git cherry-pick $rev && git tag -f last_sync_tag $rev || exit 1
done

答案 1 :(得分:1)

因为你已经使用了“filter-branch”,你将不得不帮助git找到执行rebase的正确提交。

我将在这里猜测,但可能你有一个'几乎'常见的提交,它有两个版本,你的公共分支的头部和你的dev分支上的这个提交对应的地方(未经过滤)。调用公共头部提交<PH>和与之对应的开发者提交(在过滤之前)<DevPH>

检出dev分支,你想做这样的事情:

git rebase --onto <PH> <DevPH>

这告诉rebase在当前分支上采用自<DevPH>以来每次提交引入的补丁,并将这些提交应用于<PH>。我认为这就是你所需要的。

编辑:

您对问题的更新显示h等同于dev分支上的公共流的头部,并且您希望将此处从dev分支上的所有内容移植到公共分支上。如果是,则命令为

git rebase --onto pub h

答案 2 :(得分:1)

您是否定期维护dev分支上未公开的文件?或者他们只是闲逛?

如果您不倾向于对它们进行更改,并且您可以稍微重写历史记录,那么您可以做的是根据您的公共分支将它们创建为单个提交;并将其合并回公众,但使用“-s ours”来阻止他们实际进入。(previous answer about git merge -s ours

类似的东西:

git checkout -b dev public
git am create-dev-only-files.patch
git checkout public
git merge -s ours dev
git checkout dev
# write more dev patches...
git checkout public
git merge dev
# and this should merge in the patches without bringing in the
#  dev-only files

因此,如果您随后对您的开发分支进行了后续更改并将其合并为公开,那么如果您不更改那些不公开的文件,则其他所有内容都将适用。但是,如果要在公共场所更改的文件集更改,这可能会很棘手。例如,您可以尝试通过在开始对公共分支进行任何提交之前添加预提交挂钩来取消停止特定文件来阻止它。

答案 3 :(得分:0)

好吧,如果我不想要一个文件登陆.gitignore。可能是配置不是真正的代码所以它根本不需要跟踪。