建立一个;“干净”;显式合并的git历史记录

建立一个;“干净”;显式合并的git历史记录,git,git-merge,git-flow,git-history,Git,Git Merge,Git Flow,Git History,我有一个使用GitFlow的git存储库(即,它有master、develope、release-*和feature-*分支)。但是,合作者没有使用显式合并(即,git merge--no ff),因此,例如,git log--first parent没有提供迄今为止合并历史的简单汇总 接下来,协作者将使用显式合并。然而,在他们这样做之前,我想确保历史记录是“干净的”,这样在调用git log--first parent时就不会显示以前的历史记录。但是,显然,我希望在调用未过滤的git日志时维护

我有一个使用GitFlow的git存储库(即,它有
master
develope
release-*
feature-*
分支)。但是,合作者没有使用显式合并(即,
git merge--no ff
),因此,例如,
git log--first parent
没有提供迄今为止合并历史的简单汇总

接下来,协作者将使用显式合并。然而,在他们这样做之前,我想确保历史记录是“干净的”,这样在调用
git log--first parent
时就不会显示以前的历史记录。但是,显然,我希望在调用未过滤的
git日志时维护实际的提交历史记录

我倾向于做以下事情:

$ git checkout develop
$ git checkout --orphan CleanSlate
$ git rm . -r -f
$ git commit --allow-empty -m "Establish a clean slate for the develop branch"
$ git merge --no-ff --allow-unrelated-histories develop -m "Introduce all legacy files"
$ git checkout develop
$ git merge CleanSlate
基本上,我们的想法是:

  • 建立一个没有以前历史记录的新分支(
    --孤立分支
  • (可选)从工作树中删除所有文件,这样我们就不会重新提交它们
  • 建立一个初始提交,这样我们就可以合并到其中
  • develope
    分支执行显式合并(即,
    --无ff
    ),确认不相关的历史记录
  • 快进
    开发
    到我们刚才执行的显式合并,以表示历史
  • 我的问题:在将此方法应用于生产环境之前,我是否应该了解此方法的后果?是否有替代或更简单的方法更适合于完成此类场景


    (在测试中,这似乎实现了我的目标,对现有的分支或工作流没有负面影响。但是,有了git,我总是对我不知道我不知道的事情保持警惕。)

    我想我理解了这个想法

    让我们一步一步地画出实际发生的事情。对于初始绘图,假设分支
    develope
    在普通提交
    D
    处结束:

    ...--B--C--D   <-- develop
    
    因此,第四个命令创建一个没有父级的空提交
    E

    这给了我们这个图表:

              E   <-- CleanSlate (HEAD)
    
    ...--B--C--D   <-- develop
    
    merge命令进行新的合并提交;从逻辑上讲,
    F
    是下一个字母,但我已经陷入了诱惑,在这里称之为
    M

              E--M   <-- CleanSlate (HEAD)
                /
    ...--B--C--D   <-- develop
    
    给予:

              E--M   <-- develop (HEAD), CleanSlate
                /
    ...--B--C--D
    
    使用两个
    -p
    (提交的父对象)参数,我们按照喜欢的顺序为合并提交
    M
    选择父散列:第一个
    -p
    是由
    git log跟踪的父对象--第一个父对象
    ,第二个
    -p
    是使
    M
    成为合并提交的第二个父对象

    存储在两个新提交中的实际树(或快照)分别位于
    $et
    (The)和
    develope^{tree}
    (commit
    D
    的快照)中。现在,如果愿意,您可以轻松选择从
    D
    共享树

    最后的
    git签出-B develope
    使git切换到commit
    M
    ,并将名称
    develope
    指向它。这是一种快进合并,这意味着您可以使用:

    git checkout develop; git merge --ff-only $m
    

    但这需要一个更模糊的命令 我想我理解这个想法了

    让我们一步一步地画出实际发生的事情。对于初始绘图,假设分支
    develope
    在普通提交
    D
    处结束:

    ...--B--C--D   <-- develop
    
    因此,第四个命令创建一个没有父级的空提交
    E

    这给了我们这个图表:

              E   <-- CleanSlate (HEAD)
    
    ...--B--C--D   <-- develop
    
    merge命令进行新的合并提交;从逻辑上讲,
    F
    是下一个字母,但我已经陷入了诱惑,在这里称之为
    M

              E--M   <-- CleanSlate (HEAD)
                /
    ...--B--C--D   <-- develop
    
    给予:

              E--M   <-- develop (HEAD), CleanSlate
                /
    ...--B--C--D
    
    使用两个
    -p
    (提交的父对象)参数,我们按照喜欢的顺序为合并提交
    M
    选择父散列:第一个
    -p
    是由
    git log跟踪的父对象--第一个父对象
    ,第二个
    -p
    是使
    M
    成为合并提交的第二个父对象

    存储在两个新提交中的实际树(或快照)分别位于
    $et
    (The)和
    develope^{tree}
    (commit
    D
    的快照)中。现在,如果愿意,您可以轻松选择从
    D
    共享树

    最后的
    git签出-B develope
    使git切换到commit
    M
    ,并将名称
    develope
    指向它。这是一种快进合并,这意味着您可以使用:

    git checkout develop; git merge --ff-only $m
    

    但这需要一个更模糊的命令。我越是查看
    提交树
    ,就越觉得它是一个很棒的工具。我越是查看
    提交树
    ,就越觉得它是一个很棒的工具。