gpt4 book ai didi

git - git 如何知道要保留一行的哪个版本?

转载 作者:太空狗 更新时间:2023-10-29 13:20:11 25 4
gpt4 key购买 nike

我正在进行一个项目,该项目偶尔会以稳定版本发布。当我们发布一个版本时,我们从当前的 HEAD 开始开发下一个版本。

然而,旧版本仍然受支持,放在它自己的分支上并接收各种小修复和功能。当我对受支持的旧版本应用修复时,我(几乎)总是将它们也 merge 到当前版本中。

工作流程示例

  1. 我的应用程序称为“libSSL”。
  2. 我发布了 libSSL 版本 2 并使用我发布的代码创建了一个单独的分支
  3. 我继续从 libSSL 版本 2 代码库开发 libSSL 版本 3
  4. ....时间流逝......
  5. 我修复了 libSSL 版本 2 中的一个严重安全问题
  6. 我将更改 merge 到我当前的代码中,以用于即将发布的 libSSL 版本 3

我的情况

当我在 git full res image here 中遇到这种情况时,我只是将旧支持版本的一些更改 merge 到我的最新分支中enter image description here

这不是冲突,只是一些代码说明。我更改了自上次发布以来某个时间点创建的变量(可能是很久以前)。

我的问题

git 如何知道要使用哪个变量名?我想 git 可以在进行更改时查找提交的时间戳(并选择最近的时间戳),但这似乎是一项非常昂贵的任务,但感觉并非如此。

我通常不会对这些非冲突更改三思而后行,但我能确定 git 会做正确的事情吗?这是一个有效的假设,还是我应该更加注意它们以避免用一些旧代码覆盖一些新代码?

我总是将旧分支 merge 到新分支中。

最佳答案

Git 是一个内容可寻址的数据库,这意味着每个对象都存储在其内容的哈希值下。 Git 也进行三向 merge 。它找到找到最近的“merge-base”(git 中甚至有一个命令 - merge-base - git help merge-base 来阅读它)他们有共同点的祖先,即在过去的某个时间点 fork 出来的点。

与非散列系统中的 3 向 merge 需要比较文件进行比较不同,git 可以查看 3 个散列。假设您要将 feature merge 到 master 中。如果项目中某个文件的特定路径的 3 个哈希相同,它会跳过它——它在任何一个分支中都没有改变——这非常快。如果散列在 master 中发生了变化但在 feature 中没有变化,那么它只使用 master 版本,因为有人在 master 上改变了它,但没有人关心在 feature 上,所以 master 版本是改变/重要的版本。反之亦然,如果它改变了功能,但没有改变主人,它只使用功能版本。这也 super 快。事实上,大多数时候这是大多数情况。大多数文件在较大的项目中不会更改,因此 merge 最终只会比较一些小的文件集,这些文件的哈希值在两个分支中都已更改。

如果哈希值在两个分支中都从这两个分支的 merge 基础上发生了变化,那么 git 会退回到老式的 merge 方式,逐行比较。如果一组行在一条路径中发生了变化,但在另一条路径中没有发生变化(与 merge 基础副本相比),那么它将 merge 来自该分支的更改。如果您在两个分支中都更改了一个变量名,那么它会将其包装在冲突标记中并告诉您您需要手动解决这个问题,这是唯一正确的方法。正如 Linus Torvalds 所说,您不希望机器试图为您解决这个问题,他是对的。

关于git - git 如何知道要保留一行的哪个版本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22350914/

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