gpt4 book ai didi

git - 如何在 git 中维护线性历史

转载 作者:太空狗 更新时间:2023-10-29 14:17:36 27 4
gpt4 key购买 nike

由于不同的原因,我需要维护一个线性的 master 分支。也就是说,该分支中的提交不能有一个以上的父级。

我们团队中有多个人,我们希望制作 feature 分支以共同努力。通常我们会在这个 feature 分支上 rebase 我们自己的个人提交,然后在功能准备就绪时将其 merge 到我们的 devel 分支中。我们还依赖于一个 foreign 项目(它使用不同的分支,但我们在这里假设它都在一个单独的 foreign 分支中,它有自己独立的来源)我们定期 merge 到我们的 devel 分支。

但是,所有这些工作最终都必须以线性的形式转发给master分支。我们可以将所有这些更改压缩到 master 中的单个提交(使用 git reset --soft devel),然后将 master merge 回 开发。但是,我们希望尽可能多地保留我们的提交:

  • 应保留每条提交消息(包括 merge 消息)
  • 必须保留提交之间的拓扑顺序
  • foreign 分支 merge 的提交必须被压缩成单个“merge ”提交(不幸的是没有父信息)
  • 分支 masterdevelfeatureforeign 必须保持完美向前兼容(因为这是共享存储库)

我最初的想法是:

  1. devel 创建一个 staging 分支
  2. staging rebase 到 master
  3. 将新的 staging merge 回 devel

但这没有成功,因为:

  • foreign 分支,从它的起源处重新建立了基础,并且没有被压扁
  • 我不得不再次处理 devel 中的所有冲突,而它们已经在 devel 本身的许多 merge 过程中处理过

所以我打算做以下事情:

我们称 divdevel 的最新提交,而不是 master(最新的分歧点)。如果 master 有未 merge 到 devel 中的新提交,则中止。也就是说,如果在 div 之后 master 中有新的提交,则必须先手动将它们 merge 到 devel 中。

对于从 divdevel 的每次提交(按拓扑顺序),执行 git reset --soft 并将更改提交到 master (具有相同的提交消息)。这意味着:

  • 不在 div 之后但在 devel 之前的提交被压缩:那些要么从 foreign merge (在这种情况下我们很高兴) 或从 master merge (在这种情况下,实际提交已经在 master 中)
  • 介于两者之间的提交被正确地一个接一个地推送到 master 中,除了 devel 的并行分支,它看起来像是每次都撤消另一侧的提交(这是丑陋的,但可能是不可避免的)

最后,我将 master merge 回 devel 并且此 merge 提交成为下一次的 div

因为我想尽量减少“撤消”/“重做”的次数,所以我会在所选的拓扑顺序中添加以下限制:devel 中只有一个父级的提交将具有等效的在 master 中作为父级提交。

总而言之,这似乎过于复杂了。有没有内置的方法让线性分支跟随非线性分支?否则,我的策略是否有效,或者我是否遗漏了真正重要的细节?

最佳答案

@jamey's comment 中所述,可能最好是删除 develop 分支,将功能分支从 master 中分离出来,并在 merge 到 master 之前进行 rebase。完成功能分支后,您可以:

git rebase master myfeature
git checkout master
git merge --ff-only myfeature

当您需要 merge 来自 foreign 分支的更改时,请执行以下操作:

git merge --squash foreign
git commit

来自 git merge 的手册页:

--squash

Produce the working tree and index state as if a real merge happened (except for the merge information), but do not actually make a commit, move the HEAD, or record $GIT_DIR/MERGE_HEAD (to cause the next git commit command to create a merge commit). This allows you to create a single commit on top of the current branch whose effect is the same as merging another branch (or more in the case of an octopus).

关于git - 如何在 git 中维护线性历史,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39856434/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com