我有两个分支是足够不同的是重订基期似乎不起作用 - 或者我不知道该怎么做。

我有一堆删除的文件的“公共”分支(使用滤波器分支)。尽管大多数提交的三角洲方面投其所好,提交IDS都是不同的。我已经尝试了不少方法来拉从我的Dev分支改变我的公共分支......我觉得很难相信它可以做我想做的事情 - 但我怀疑我只是不知道如何做到这一点。在任何情况下,这工作得很好,但似乎是错误的。

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

任何提示或建议,其中可能包括不过滤分支出来的公共分支(虽然,你怎么又摆脱他们?)你不想要的文件,是值得欢迎的。

我的树(S)看或多或少是这样的:

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

吨≅A,U≅C,V≅d,瓦特≅E,X≅克。 I,J,K是新的补丁我想动过。

checkout pub
rebase --onto pub i  # I really expected this to work
有帮助吗?

解决方案

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

其他提示

你是否有定期维护的不是公共你的Dev分支的文件吗?或者,他们只是闲逛?

如果你不倾向于进行变更,而你与改写历史了一下OK,你可以做的是安排让他们为创建一个基于你的公共分支提交;并合并该回公众但是,用“-s我们的”阻止他们实际上得到英寸(的约GIT中合并-s我们前面的答案)

是这样的:

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

所以,如果你再在你的Dev分支随后作出的变化和它们合并成公众,如果你不改变那些不公开的文件,其他的一切都会简单地套用。但是,如果一组文件要禁止在公共变化,这可能会非常棘手。你可以尝试,以防止它通过添加一个pre-commit钩子在开始任何承诺对公众分支,比如之前unstage特定文件。

由于您使用“过滤分支”你将不得不帮助混帐找到正确的承诺进行重订到。

我要在这里猜测,但想必你有一个“几乎”共同提交它有两个版本,你的公共部门的头在你的Dev分支,这个承诺相当于(过滤UN)的地方。调用公共头提交<PH>和dev的提交,这对应于(之前的过滤)<DevPH>

与Dev分支签出,你想要做这样的事情:

git rebase --onto <PH> <DevPH>

这告诉变基采取由每个引入的贴片由于在当前分支<DevPH>提交和应用这些提交到<PH>。我认为这是你所需要的。

编辑:

您的问题更新显示,h是相当于对Dev分支的公共流的头,你想从这里开始的Dev分支移植到一切公共分支。如果是这样的命令是

git rebase --onto pub h

那么,如果我不希望在一个的.gitignore土地fileit。也许这就是配置不是真正的代码,所以它并不需要跟踪的。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top