【问题标题】:format-patch works reasonably well, looking for a better wayformat-patch 工作得相当好,正在寻找更好的方法
【发布时间】:2009-04-21 17:30:18
【问题描述】:

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

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

【问题讨论】:

  • 我认为你的意思可能是 git rebase --onto pub h 因为这相当于 pub 的负责人,而不是 i。

标签: git rebase format-patch


【解决方案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号出口 完毕

【讨论】:

  • 我喜欢这个。我有点用手摘樱桃。这就像下一个合乎逻辑的步骤。
  • 在此之后我基于一个可爱的小 git 命令。效果很好,谢谢。
【解决方案2】:

您是否定期维护您的 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

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

【讨论】:

    【解决方案3】:

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

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

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

    git rebase --onto <PH> <DevPH>
    

    这告诉 rebase 在当前分支上获取自 &lt;DevPH&gt; 以来每个提交引入的补丁,并将这些提交应用到 &lt;PH&gt;。我认为这就是您所需要的。

    编辑:

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

    git rebase --onto pub h
    

    【讨论】:

    • 这就是我认为可行的方法,但事实并非如此。我创建了一个名为 blarg 的新分支,reset --hard 几次提交并尝试了 git rebase -v --onto blarg 80d79e3,其中 80d79e3 是 dev 分支上的正确提交。它只是说:首先,倒带头在上面重播你的工作......快进 blarg 到 blarg。使用 -v,它表明它正在尝试将 blarg 的 HEAD 重新定位到 blarg。
    • 如果它是快进,那么你只是重新回到你已经在的分支上。您需要指定来自另一个分支的提交作为 --onto 的参数。我确信你可以用 rebase 做你想做的事,但是如果不看你的树,就很难指出你需要在哪里指定哪些提交。您能否在您的问题中提供有关常见提交和新分支负责人以及它们之间的关系的更多详细信息?
    【解决方案4】:

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

    【讨论】:

    • 两个问题...... git clean -dfx 杀死你忽略的文件,两个,文件确实需要跟踪,只是不在公共分支上。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-20
    • 2017-08-11
    • 2011-06-27
    • 2015-11-24
    • 1970-01-01
    相关资源
    最近更新 更多