将更改从一个分支应用到另一个分支而不影响 git 历史

Apply changes from one branch to another without affecting git history

我的问题是,是否可以在功能分支 B 中引用在分支 A 中所做的更改,没有 重复提交或分阶段更改?

然后,当您将此分支 B 合并到 A 中时,git 会识别出此引用的提交已经在 A 上并且不会执行任何操作。有这方面的命令吗?

我知道 cherry-pickrebasemerge,但这些命令无法解决该问题。

我什至不知道 git 架构是否可行,所以我感谢所有能帮助我的人。

除了一些小例外, Git 中的所有内容都是在Git 中的提交集。历史 提交;提交 历史;仅此而已。

这意味着对您的问题的直接回答——一旦有人将其重塑为适合 Git 的答案,即;在这个意义上没有任何分支,甚至没有任何 更改 因为提交是快照 - 是“否”。您所能做的就是进行另一次提交,或多次额外提交,以添加新的已保存状态。

次要的例外包括分支名称之类的东西:每个名称存储 一个 哈希 ID,我们可以从中找到所有其他提交。这形成了一个图,特别是 Directed Acyclic Graph,分支和其他名称作为进入其他独立图的入口点。这就是我们在存储库中找到提交的方式。

就存储库中的文件而言,它们存在的唯一原因是它们包含在 次提交中。每个提交都有每个文件的完整快照(尽管以一种奇怪的、Git 化的、去重复的形式存储,以便共享同一文件的提交实际上 share文件:它在 all 提交中,但一切总是通过一层间接共享来完成)。所以名称找到特定的提交,这些提交找到其他提交和包含的文件。

当您使用 git merge 时,您将获得:

  • 真正的合并:添加到图形的新提交(添加更多历史记录:它向后 link 到以前的提交是 的 links 到 两次 之前的提交),或者
  • 什么都没有:假的 快进 合并只是移动了一个分支名称;或
  • 通过 git merge --squash 的“压缩合并”:Git 与真正的合并执行相同的工作,但随后停止并让您进行新的提交。新提交不会 link 两次提交。

所以只有在假的情况下——实际上只是“移动分支名称”——你不添加任何提交;在一种特殊情况下,您可以使用它来用“是”回答您的问题。在这种情况下,您最终会选择 相同的提交 两个分支名称;该提交具有正确的快照并向后连接到所需的先前提交,因此就足够了。但否则你必须添加一个提交。