我已经在一个功能部门工作了几个星期,并且有大约80个提交的历史,涉及我们项目的许多部分的工作.对于小功能,我只需要重新定义,将提交压缩成一个简洁的提交,合并它以进行开发,然后推送它.但在这里,我已经积累了很长的历史,承诺涉及许多不同的部分.
我想将它们拆分成较小的提交,即"功能F的完成部分A""完成部分B"等等,但是工作不是线性的,并且每个部分都是同时建立的.
我可以将它们全部压缩成一个提交并推送它,但是我会失去所有的历史记录,这可能会使调试在未来变得很痛苦,因为它是如此大的变化.
我不熟悉在专业环境中使用git,所以我不确定最佳实践.你对这种情况有什么看法?
一般的方法是
我假设您的存储库看起来像这样
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)
另请参见将先前的提交分解为多个提交
重新排序提交
目前,您只需在一次提交中对一个功能进行所有更改.但它们不是一个线性顺序:
现在你可以做另一个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)