0

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

我有一个“公共”分支,其中删除了一堆文件(使用过滤器分支)。尽管大多数提交在增量方面匹配,但提交 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

4 回答 4

1

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

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

git 结帐公共
用于 $(git rev-list --reverse last_sync_tag..dev) 中的转速;做
   git cherry-pick $rev && git tag -f last_sync_tag $rev || 1号出口
完毕
于 2009-04-21T18:06:03.810 回答
1

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

我会在这里猜测,但大概你有一个“几乎”常见的提交,它有两个版本,你的公共分支的头和你的开发分支上这个提交对应的位置(未过滤)。调用对应的公共头部提交<PH>和开发提交(过滤前)<DevPH>

签出 dev 分支后,您想要执行以下操作:

git rebase --onto <PH> <DevPH>

这告诉 rebase 获取自当前分支以来每个提交引入的补丁,<DevPH>并将这些提交应用到<PH>. 我认为这就是你所需要的。

编辑:

您对问题的更新表明 h 相当于 dev 分支上公共流的负责人,并且您希望将 dev 分支上从这里开始的所有内容移植到公共分支上。如果是这样,命令是

git rebase --onto pub h
于 2009-04-21T21:11:20.653 回答
1

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

如果您不倾向于对它们进行更改,并且您可以稍微重写历史记录,那么您可以安排将它们创建为基于您的公共分支的单个提交;并将其合并回公共,但使用“-s ours”以阻止它们实际进入。(关于 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

因此,如果您随后在您的开发分支上进行了更改并将它们合并到公共中,如果您不更改那些未公开的文件,那么其他所有内容都将简单地应用。但是,如果您想在公共更改上禁止的文件集,这可能会很棘手。例如,您可以尝试通过在公共分支上开始任何提交之前添加预提交挂钩来取消暂存特定文件来防止它发生。

于 2009-04-21T22:56:44.097 回答
0

好吧,如果我不希望文件落在 .gitignore 中。可能它是配置而不是真正的代码,所以它根本不需要跟踪。

于 2009-04-21T18:34:58.437 回答