使用git分支作为学术研究中过去实验的快照

使用git分支作为学术研究中过去实验的快照,git,Git,我的基本问题是如何复制分支,但我在Stackoverflow上做了一些搜索,找不到适合我的目的的方法-所以请不要将我的问题标记为重复,因为我在这里寻求个性化建议 我正在和一个5人以上的小组进行一个研究项目。我们有一个共同的代码库(主分支)。出于我的目的,我需要为一个实验稍微修改公共代码库,所以我创建了一个分支并在那里完成了我的工作 现在,实验完成后,我想 保持分支的原样,而不重新合并(原因:其他人不需要我新添加的代码,我希望将来引用它) 创建此分支的副本(这是一个新分支)并在那里继续我的工作,以

我的基本问题是如何复制分支,但我在Stackoverflow上做了一些搜索,找不到适合我的目的的方法-所以请不要将我的问题标记为重复,因为我在这里寻求个性化建议

我正在和一个5人以上的小组进行一个研究项目。我们有一个共同的代码库(主分支)。出于我的目的,我需要为一个实验稍微修改公共代码库,所以我创建了一个分支并在那里完成了我的工作

现在,实验完成后,我想

  • 保持分支的原样,而不重新合并(原因:其他人不需要我新添加的代码,我希望将来引用它)
  • 创建此分支的副本(这是一个新分支)并在那里继续我的工作,以便新分支上的任何更改不会反映在旧分支上

  • 最干净、最安全的方法是什么?我需要知道有什么暗示吗?非常感谢

    创建分支,完成工作后:

    这些标签有什么方便之处:

    • 它们有一个作者和一条消息,您可以在其中存储实验摘要
    • 它们无法更改(尽管您可以重新创建)
    • 您可以保留当前的分支,并可以在那里开始新的实验
    因此,继续在该分支中进行下一个实验(无需创建新的实验,因为您已将以前的状态保存到标记中)。完成后-创建一个新的带注释的标记

    如果您需要从另一个分支开始工作,只需签出该分支,在那里提交并从那里创建一个标记。如果您决定返回到旧的实验并尝试新的东西,您将签出旧标记(或从中创建分支),引入更改,然后再次创建另一个标记。

    因为,标记在这里很有用;注释标记尤其允许您添加这些注释。但值得注意的是,Git还有一个更基本、更基本的特性:Git是关于提交的。那些对Git不熟悉的人经常阅读或使用一些介绍性的东西,这些东西会让你跳入使用分支和文件的行列,这会让新用户认为Git是关于分支和文件的,而不是,或者至少不是确切地说。Git是关于提交的。提交是Git中的基本单元,因此您需要知道提交是什么,它为您做了什么

    让我们回到问题的标题:

    使用git分支作为学术研究中过去实验的快照

    提交是一个快照。但更准确地说,这是一个由两部分组成的快照。任何提交的任何部分(或任何存储的Git对象的任何部分)都不能更改,因此正确处理这两个部分很重要,但如果处理错误,那也没什么大不了的,因为您总是可以向存储库添加更多提交。要摆脱旧的恶意提交可能相当困难,因为它们不断地回来,像病毒一样被其他Git克隆体传播,但通常没有必要破坏它们,因为它们往往是无害的。1

    提交的两个部分是:

    • 主数据或源快照:它保存Git在您(或任何人)提交时知道的所有文件的副本,并一直冻结;及
    • 元数据,或关于提交本身的信息:它保存了诸如提交人和提交时间等信息,并一直处于冻结状态
    您或Git找到提交的基本方法是通过其哈希ID。每个提交都有一个唯一的哈希ID:一个大的字母和数字长字符串,这实际上只是一个大的加密哈希的十六进制编码。2


    1这里的主要例外是错误提交,它存储了一些巨大的数据文件,否则不会妨碍存储库的使用。只要你没有让它们逃出实验室,它们就很容易被清除,这样就不会有其他副本再次感染你的数据库。如果他们已经离开了,您必须开始注意您的Git存储库与哪些Git存储库发生了Git性关系

    2当前,这是提交内容的SHA-1校验和,前面是单词
    commit
    、空格、对象大小的ASCII表示和ASCII NUL字节。有一个项目正在进行中,以转移到SHA-256,并使哈希算法更容易在未来更改,如果需要的话


    如何将其转化为分支、标记等 理解分支和标记名的关键在于几个部分

    • 首先,正如我们已经知道的,每个提交都有一个唯一的hash ID。我们可以进一步概括:所有Git对象都有唯一的hash ID,包括带注释的标记对象

    • 其次,Git中的任何引用名称(如分支名称或标记名称)都包含一(1)个散列ID。分支名称被约束为仅包含提交哈希ID,而标记名称可以包含提交ID或带注释的标记对象ID

    • 第三,各种Git对象持有散列ID。最重要的是,每个提交都包含一组早期提交哈希ID。大多数提交只有其中一个。带注释的标记对象中也有一个哈希ID,通常是提交哈希ID

    这最后一部分为我们提供了有用的分支。如果您有一个很长的提交链,其中每个提交链都存储其前一个提交链的哈希ID,那么最终的情况很容易如下所示:

    ... <-F <-G <-H
    
    ...--F--G--H   <-- branch
    
    如果我们创建了另一个分支名称,该名称也指向commit
    H

    ...--F--G--H   <-- branch, develop
    
    ...--F--G--H   <-- branch
                \
                 I   <-- develop (HEAD)
    
    然后进行新提交
    I
    ,新提交
    I
    将指向现有提交
    H

    ...--F--G--H   <-- branch, develop
    
    ...--F--G--H   <-- branch
                \
                 I   <-- develop (HEAD)
    
    我们重新获得旧文件,同样重要的是,如果我们再次提交
    J
    ,它会导致名称
    分支
    指向新提交:

                 J   <-- branch (HEAD)
                /
    ...--F--G--H
                \
                 I   <-- develop
    
    在此模式下,如果进行新提交
    K
    ,则新提交
    K
    为n
                 J   <-- branch (HEAD)
                /
    ...--F--G--H
                \
                 I   <-- develop
    
              tag:foo
                 |
                 v
                ... [extra data]
                 |
                 v
                 J   <-- branch (HEAD)
                /
    ...--F--G--H
                \
                 I   <-- develop
    
              tag:foo
                 |
                 v
                ... [extra data]
                 |
                 v
                 J   <-- branch, HEAD
                /
    ...--F--G--H
                \
                 I   <-- develop
    
              tag:foo
                 |
                 v
                ... [extra data]
                 |
                 v
                 J   <-- branch
                / \
    ...--F--G--H   K   <-- HEAD
                \
                 I   <-- develop
    
              tag:foo
                 |
                 v
                ... [extra data]
                 |
                 v
                 J--L   <-- branch (HEAD)
                / \
    ...--F--G--H   K   ???
                \
                 I   <-- develop