4Git工具重写历史

时间:2018-12-20 22:07:31 来源:彭家屿新闻网 作者:匿名



很多时候,在使用Git时,您可能会出于某种原因修改提交历史记录。 Git的一大优点是它可以让你在最后一分钟做出决定。您可以在提交到临时区域时决定要提交哪些文件。您可以使用stash命令确定要暂停的工作。您可以覆盖已发生的提交,使它们看起来不同。 。这包括更改提交顺序,更改说明或修改提交,合并,拆分或完全删除提交中包含的文件。——在开始与他人分享您的工作之前,这很棒。

在本节中,您将学习如何完成这些有用的任务,以便在与他人共享之前,您的提交历史记录将是您想要的。

更改最近的提交可能是重写历史记录的最常见行为。对于最近提交的内容,您通常需要执行两项基本操作:更改提交说明,或通过添加,更改和删除更改刚刚记录的快照。

如果您只想修改最后一次提交描述,这很简单:

这将带您进入一个文本编辑器,其中包含您最近提交的更改的说明。保存并退出编辑器时,编辑器会编写一个带有描述的新提交,并使其成为新的最后一次提交。

如果要在完成提交后修改提交的快照,添加或修改文件,可能是因为您在最初提交时忘记添加新文件。这个过程基本相同。您修改该文件,然后针对录制的文件运行该文件,然后您将获得当前的暂存器并将其用作新提交的快照。

使用此技术时必须小心,因为修复将更改提交的SHA-1值。这就像一个非常小的rebase——。推送最后一次提交后不要修复它。

要修改历史记录中的早期提交,必须使用更复杂的工具。 Git没有修改历史记录的工具,但您可以使用rebase工具将一系列提交更改为原始HEAD,而不是移动到新HEAD。使用此交互式rebase工具,如果要修改或更改描述,添加文件或其他任何内容,您可以在每次提交后保留它。您可以通过添加选项以交互方式运行rebase。您必须通过告知提交重新提交的命令来指示您需要覆盖的提交的提交深度。例如,如果要修改最后三个提交指令或其中任何一个,则必须提供一个参数,指示要修改的提交的父提交,例如或。它可能更容易记住,因为你想修改最后三次提交;但请记住,在提交四次提交之前,您实际上是指提交的父提交。同样,这是一个rebase命令。无论描述是否被修改,——范围内的每个提交都将被覆盖。不要覆盖已推送到中央服务器的提交。——这样做可能会使其他开发人员感到困惑,因为您有相同更改的不同版本。运行此命令将提供文本编辑器的提交列表,如下所示

值得注意的是,这些提交的顺序与您通常通过命令看到的顺序相反。如果您运行,您将看到以下结果:

请在此处注明相反的顺序。交互式rebase为您提供可运行的脚本。它从您在命令行()上指定的提交开始,然后从上到下重放每个提交中引入的更改。它将被列在顶部而不是最多,因为这是第一个需要重播的。

您需要修改此脚本以保留要修改的更改。要执行此操作,只需为要修改的每个提交更改要编辑的最后一个推送。例如,如果您只想修改第三个提交语句,则可以像这样修改文件:

保存并退出编辑器时,Git将恢复到列表中的最后一次提交,然后使用以下消息将您发送到命令行:

这些说明清楚地告诉您该怎么做。输入

修改提交说明并退出编辑器。然后,跑

此命令将自动应用其他两个提交,您将完成该任务。如果更改要编辑的更多行的选择,则可以对要修改的提交重复这些步骤。 Git每次都会停止,让你修复提交并在完成后继续运行。

您还可以使用交互式rebase完全重新排列或删除提交。如果要删除“添加的cat-file”提交并修改引入其他两个提交的顺序,则重新定义脚本将从以下更改:

保存并退出编辑器时,Git会将分支恢复到这些提交的父提交,应用它,然后停止。您有效地修改了这些提交的顺序,并完全删除了“添加的cat-file”提交。

交互式rebase工具还会将一系列提交内容抑制为单个提交。该脚本为rebase信息添加了一些有用的指令:如果你不使用'pick'或'edit',而是指定'squash',Git将应用更改及其先前的更改并合并提交指令。因此,如果要将这三个提交合并为一个提交,则可以将脚本修改为如下所示:

当您保存并退出编辑器时,Git将应用所有三个更改并将您发送回编辑器以合并并提交三个指令。保存时,您只有一个提交,其中包含前三个提交中所做的所有更改。

拆分提交是撤消提交,然后部分暂停或提交多次,直到结束。例如,假设您要将提交的中间部分拆分三次。拆分'更新的自述文件格式并将责任添加到两个提交中:第一个是'更新自述文件格式',第二个是'添加责备'。您可以修改pre-commit指令以在脚本中拆分为“edit”:

然后,该脚本将您带到命令行,重置提交,提取重置更改,并从中创建多个提交。保存和退出编辑器时,Git将恢复到列表中第一次提交的父提交,应用第一个commit(),应用第二个commit(),然后转到控制台。在那里,您可以对提交进行混合重置,这将撤消提交并撤消已修改的文件。此时,您可以暂存和提交文件,直到您有多个提交并运行它。

Git在脚本中应用了最后一个commit(),您的历史记录如下:

同样,这将修改列表中提交的SHA值,因此请确保此列表不包含已推送到共享存储库的提交。如果要在脚本中修改大量提交,还可以使用——覆盖历史记录。例如,全局修改电子邮件地址或从所有提交中删除文件。顺序是这将大规模修改您的历史记录,因此您可能不应该使用它,除非您的项目尚未公开且没有其他人正在处理您要修改的提交。但是,这可能非常有用。您将学习一些常用的用途来了解他们的能力。

从所有提交中删除文件

这经常发生。有些人不小心提交了一个巨大的二进制文件,你想从任何地方删除它。也许你不小心提交了一个包含密码的文件,并且你想让你的项目开源。可能是您用来清理整个历史记录的工具。要从整个历史记录中删除名为password.txt的文件,可以使用此选项:此选项将执行指定的命令,并在每次签出项目时重新提交结果。在此示例中,您将删除所有快照中名为password.txt的文件,无论该文件是否存在。如果要删除意外提交的所有编辑器备份文件,可以运行类似的命令。您可以观察到Git重写目录树并提交,然后将分支指针移动到结尾。一个好主意是在测试分支上执行此操作,然后在确保产品确实是您想要的之后硬重置主分支。要在所有分支上运行,可以将命令传递给它们。

将子目录设置为新的根目录

假设您已完成从另一个代码控制系统导入并获得一些无意义的子目录(继电器,标签等)。如果您希望子目录成为每个提交的新项目的根目录,也可以执行此操作:

您的项目根目录现在是一个子目录。 Git会自动删除不影响该子目录的提交。

全局更改电子邮件地址

另一种常见情况是您忘记在开头设置您的姓名和电子邮件地址。也许您想要打开一个项目并将所有工作电子邮件地址更改为个人地址。在任何一种情况下,您都可以在多个提交中更改您的电子邮件地址。您必须小心更改要使用的电子邮件地址:这将遍历并重写所有提交以获取新地址。由于提交包含其父提交的SHA-1值,因此该命令会修改历史记录中的所有提交,而不仅仅是与电子邮件地址匹配的提交。

上一页|下一页

简书

相关新闻