Git:我有一个80多次提交的功能分支.如何在不破坏历史的情况下将其安全地合并到开发/生产中?

Sev*_*lix 3 git merge

我已经在一个功能部门工作了几个星期,并且有大约80个提交的历史,涉及我们项目的许多部分的工作.对于小功能,我只需要重新定义,将提交压缩成一个简洁的提交,合并它以进行开发,然后推送它.但在这里,我已经积累了很长的历史,承诺涉及许多不同的部分.

我想将它们拆分成较小的提交,即"功能F的完成部分A""完成部分B"等等,但是工作不是线性的,并且每个部分都是同时建立的.

我可以将它们全部压缩成一个提交并推送它,但是我会失去所有的历史记录,这可能会使调试在未来变得很痛苦,因为它是如此大的变化.

我不熟悉在专业环境中使用git,所以我不确定最佳实践.你对这种情况有什么看法?

Ren*_*ink 5

一般的方法是

  1. 拆分混合功能提交
  2. 重新排序提交

我假设您的存储库看起来像这样

o--------o----------o----------o
A        B          C          D
Run Code Online (Sandbox Code Playgroud)

并且您的功能更改是混合和分发的

- feature 1 changes are in A,B,C
- feature 2 changes are in A,C,D
- feature 3 changes are in B,C,D
Run Code Online (Sandbox Code Playgroud)

拆分提交

如果要对每个要素进行更改,必须首先拆分提交.

$ git rebase -i HEAD~3
Run Code Online (Sandbox Code Playgroud)

这将打开一个编辑器

pick A ...
pick B ...
pick C ...
pick D ...
Run Code Online (Sandbox Code Playgroud)

由于您需要编辑每个提交更改它

edit A ...
edit B ...
edit C ...
edit D ...
Run Code Online (Sandbox Code Playgroud)

保存并退出编辑器,git将开始rebase.Git会重新定义A并暂停让你进行编辑.现在,您可以重置提交A并进行新提交,以反映每个功能更改.

$ git reset HEAD~
$ git add ... # only files of feature A
$ git commit -m 'Feature A'
$ git add ... # only files of feature B
$ git commit -m 'Feature B'
$ git add ... # only files of feature C
$ git commit -m 'Feature B'
$ git rebase --continue
Run Code Online (Sandbox Code Playgroud)

Git继续,您必须一次又一次地重复上述示例,直到所有提交被拆分为止.您的存储库看起来不像

o---o---o---o---o---o---o---o---o
E   F   G   H   I   J   K   L   M
Run Code Online (Sandbox Code Playgroud)

另请参见将先前的提交分解为多个提交

重新排序提交

目前,您只需在一次提交中对一个功能进行所有更改.但它们不是一个线性顺序:

  • 特征1的变化在E,G,I中
  • 特征2的变化在F,J,L中
  • 特征3的变化是H,K,M

现在你可以做另一个rebase -i并重新排序提交.

pick E
pick G
pick I
pick F
pick J
pick L
pick H
pick K
pick M
Run Code Online (Sandbox Code Playgroud)

保存并退出rebase交互式编辑器,git将重新排序提交.您可能会遇到必须解决的合并冲突.提交将被重新排序,因此它们可能与现在的早期提交冲突.

希望git rebase完成没有任何冲突,你最终会得到这个存储库

 o---o---o---o---o---o---o---o---o
 N   O   P   Q   R   S   T   U   V

|         | |         | |         |
+---------+ +---------+ +---------+
 feature 1   feature 2   feature 3
Run Code Online (Sandbox Code Playgroud)