建立一个;“干净”;显式合并的git历史记录
我有一个使用GitFlow的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日志时维护
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}
(commitD
的快照)中。现在,如果愿意,您可以轻松选择从D
共享树
最后的git签出-B develope
使git切换到commitM
,并将名称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}
(commitD
的快照)中。现在,如果愿意,您可以轻松选择从D
共享树
最后的git签出-B develope
使git切换到commitM
,并将名称develope
指向它。这是一种快进合并,这意味着您可以使用:
git checkout develop; git merge --ff-only $m
但这需要一个更模糊的命令。我越是查看提交树
,就越觉得它是一个很棒的工具。我越是查看提交树
,就越觉得它是一个很棒的工具。