老实说,我不会这样做,除非您有大量需要拆分的提交,并且它们是非常独立的功能,即不会在有冲突需要解决的地方更改同一行。
正如其他人建议的那样,为每个功能创建一个新分支并使用 git rebase --interactive 包含所需的提交。
为确保不会误入歧途,请通过以下方式创建 git-rebase-todo 文件的内容
- 编辑所有所需提交的列表并按功能对其进行分类
- 将提交列表分离到单独的文件中
您可以使用类似的命令创建提交列表
git log --oneline --reverse 44e19^... > log.txt
显示从 44e19 开始的提交。这会给你一个像这样的文件
44e1936 dSRGratuities (SummaryRecord)
67fedda Receipt Report HEADER: 20! multiply by Paym_FieldCount
69d70e2 Receipt Report: Payment
....
在编辑时(添加分类:特征 a、b、c 等)可能看起来像我的 sorted.txt
c 44e1936 dSRGratuities (SummaryRecord)
a 67fedda Receipt Report HEADER: 20! multiply by Paym_FieldCount
b 69d70e2 Receipt Report: Payment
c abea7db Receipt Report: Cashback
a cf96185 Receipt Report: Gratuity
c 70e987a Receipt Report: use amount tendered for printing
a 7722ac8 Receipt Report: use amount tendered for calculations
c 47f1754 Receipt Report: store amount tendered
b b69a73f Receipt Report: Use enum Paym_FieldCount
a 9a0b471 Receipt Report HEADER: enum PaymentEntries (with Paym_FieldCount)
c ad67e79 Use SharpReport enum
b 3c510c6 enum SharpReport
a e470e07 m_Gratuities m_dSSGratuities (SalesSummary)
b 4e0c3e4 m_Gratuities m_szGratuities (SalesSummaryRecord)
b bd054f7 _gx_fn_Cashback
然后使用您最喜欢的脚本语言编写脚本,将排序列表转换为git-rebase-todo 文件的集合。您的脚本可能与我刚刚编写的脚本相似。
foreachline text sorted.txt {
set fields [split $text { }]
set branch [lindex $fields 0]
set commit [lindex $fields 1]
set comment [string range $text 10 end]
set command "echo pick $commit $comment"
exec cmd /S /C $command >> $branch.txt
}
该脚本逐行读取提交排序文件,并用空格字符 { } 分割以获取两个字段 branch 和 commit,并获取一个子字符串(字符 10 以后)作为提交的描述。描述不是必需的,但它对我们人类检查错误很有用。
然后它将一行放入适当的git-rebase-todo 文件中,为每个功能创建一个文件。我通过执行一个非常丑陋的 Windows echo string >> file 命令解决了这个问题。
这会创建许多文件,例如我的档案a.txt
pick 67fedda Receipt Report HEADER: 20! multiply by Paym_FieldCount
pick cf96185 Receipt Report: Gratuity
pick 7722ac8 Receipt Report: use amount tendered for calculations
pick 9a0b471 Receipt Report HEADER: enum PaymentEntries (with Paym_FieldCount)
pick e470e07 m_Gratuities m_dSSGratuities (SalesSummary)
整个事情都很丑陋。除非您必须这样做并且擅长编写脚本,否则我不推荐它。
我前段时间写了上面的文字,我对事情进行了一些反思。上面我暗示这是很多工作,不值得做,但从那以后我看到有人做了上面的事情,而且非常值得。
我记得 Visual Studio for MFC/C++ 的版本,每个新版本都会有编译器更改、IDE 更改、MFC 改进,并在更高版本的 Windows 上运行。这意味着,如果您想让您的编译器远离 VS6 和 Windows XP,您可能必须更改语言以满足编译器的要求,并更改函数调用以满足 MFC 等。
现在假设 Microsoft 在开发 Visual Studio 时每周进行一次备份,有人有条不紊地进行旧备份并将代码更改提交到 Git 等版本控制系统中。然后他们开始对变化进行分类......
-
一个。 = 编译器更改
-
b. = 库更改
-
c。 = IDE 更改
-
d。 = 安全改进
等等
Microsoft 可以为其中的每一个创建分支,并开始拥有最新最好的 IDE(包括c),在最新的 Windows 上运行,并且仍然能够使用该语言编译旧的遗留程序(没有 a)和图书馆(不是b)。
以前锁定在遗留软件中的开发人员随后可以以逻辑和渐进的方式进行改进,例如语言更改和库更改相互独立,并且可以在最新最好的 Visual Studio 上完成,而无需通过所有中间版本。
例子
<LanguageStandard>stdcpp14</LanguageStandard>
现在我并不是说这就是发生的事情,但在我看来,Visual Studio 的最新版本在允许更新遗留程序方面要好得多,而不是丢弃和(永远?)重写,而且它在我看来,这是由于版本控制和将旧软件更改组织到逻辑分支:编译器版本、DLL/库版本。
因此,我可以看到将大量旧提交拆分为不同分支的情况可能是值得的。
在 Visual Studio 2019 上,我可以添加该行
<PlatformToolset>v141_xp</PlatformToolset>
到一个配置文件并设法编译和运行一个旧的 windows 程序,该程序无法编译和链接到 VS 2015 和 VS 2017。看起来很像微软的某个人在一些旧软件上重新定位了性能和安全性改进,而省略了经常伴随现代化而来的breaking changes。