老实说,除非您有大量需要拆分的提交并且它们是非常独立的功能,否则我不会这样做,即不会更改要解决冲突的同一行。
正如其他人所建议的那样,为每个功能创建一个新分支并用于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
文件中,为每个功能创建一个文件。我通过执行一个非常丑陋的 Windowsecho 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 等。
现在假设微软在开发 Visual Studio 时每周进行一次备份,有人有条不紊地进行旧备份并将代码更改提交到 Git 等版本控制系统中。然后他们开始对变化进行分类......
一个。= 编译器更改
湾。= 库更改
C。= IDE 更改
d。= 安全改进
等等
微软可以为每一个创建分支,并开始拥有最新最好的 IDE(包括在内),在最新的 Windows 上运行,并且仍然能够使用它们编写的语言(否)和库(否)c
编译旧的遗留程序.a
b
以前锁定在遗留软件中的开发人员可以以逻辑和增量的方式进行改进,例如相互独立的语言更改和库更改,并在最新和最好的 Visual Studio 上进行,而无需通过所有中间版本。
例子
<LanguageStandard>stdcpp14</LanguageStandard>
现在我并不是说这就是发生的事情,但在我看来,Visual Studio 的最新版本在允许更新遗留程序方面要好得多,而不是丢弃和(从不?)重写,在我看来是由于版本控制和将旧软件更改组织到逻辑分支:编译器版本、DLL/库版本。
因此,我可以看到将大量旧提交拆分为不同分支的情况可能是值得的。
在 Visual Studio 2019 上,我可以添加该行
<PlatformToolset>v141_xp</PlatformToolset>
到一个配置文件,并设法编译和运行一个旧的 Windows 程序,该程序无法编译和链接到 VS 2015 和 VS 2017。看起来很像微软的某个人在一些旧软件上重新定位了性能和安全性改进,同时省略了breaking changes
这通常伴随着现代化而来。