编辑 Git 项目历史记录
最后修改时间:2023 年 9 月 1 日Git 允许您编辑项目历史记录。当您正在处理功能分支并希望在与其他人共享之前清理它并使其看起来像您想要的方式时,这非常有用。例如,您可以编辑提交消息,将与相同功能相关的较小提交压缩在一起,或者将包含不相关更改的提交拆分为单独的提交,将更改添加到先前的提交等。
警告
除非绝对必要,否则请避免修改具有多个贡献者的远程分支的历史记录,例如,如果您不小心推送了一些敏感数据。
为了防止数据丢失,将拒绝将重写分支历史记录的修改推送到远程存储库,因此您必须强制推送更改。
您无法在不允许的情况下修改受保护分支的历史记录(在IDE 设置的 版本控制 | Git页面中配置受保护分支)。请注意,如果分支在 GitHub 上标记为受保护,当您检查时,PyCharm 会自动将其标记为受保护出来。
push --force
CtrlAlt0S此外,您无法执行修改当前签出分支中未包含的提交的分支历史记录的操作。
编辑提交消息
如果您唯一需要更改的是提交消息,则可以在推送此提交之前对其进行编辑。
在Git工具窗口 的 “日志”选项卡中右键单击要编辑其消息的提交 ,然后从上下文菜单中选择“编辑提交消息” ,或按。Alt09F2
在打开的对话框中,输入新的提交消息并单击“确定”。
修改之前的commit
有时,您可能会过早提交并忘记添加一些文件,或者注意到上次提交中存在错误,您希望在不创建单独提交的情况下修复该错误。
您可以通过使用“修改提交”选项来执行此操作,该选项将分阶段更改附加到先前的提交。因此,您最终会得到一次提交,而不是两次不同的提交。
在提交工具窗口中,选择包含要添加到先前提交的更改的修改文件。Alt00
选中“修改”复选框,使“提交”按钮更改为“修改提交”并单击它。
修改任何先前的提交
如果您需要向任何早期提交添加更改而不是单独提交它们,则可以使用fixup
或squash
操作来完成此操作。这两个命令都将分阶段更改附加到所选提交,但处理提交消息的方式不同:
squash
将新的提交消息添加到原始提交中fixup
丢弃新的提交消息,仅保留原始提交的消息
笔记
这两个命令都需要变基,因为它们更改了提交哈希值。
在提交工具窗口中,选择包含要附加到早期提交的更改的修改文件。Alt00
在 Git工具窗口 的 “日志”选项卡中,右键单击要使用本地更改进行修改的提交,然后从上下文菜单中选择“修复”或“压缩到” 。Alt09
如果您选择压缩更改,请修改提交消息。
单击Commit按钮上的箭头并选择Commit 和 Rebase。
壁球提交
如果您需要合并与相同功能相关的任何两个提交,您可以将它们压缩为一个,以便更清晰的分支历史记录。
在 Git工具窗口 的 “日志”选项卡中,选择要合并为一个的提交,然后从上下文菜单中选择“压缩提交” 。Alt09
在打开的对话框中,编辑提交消息(默认情况下,它包含来自两次提交的消息),然后单击“确定”。
将更改推送到远程分支。CtrlShift0K
删除提交
您可以放弃当前分支中推送的提交,而无需创建恢复更改的附加提交。
在日志视图中选择要放弃的提交,然后从上下文菜单中选择“删除提交” 。
通过执行交互式变基来编辑项目历史记录
通过 PyCharm 中的 Git 集成,您可以通过执行交互式 rebase来编辑项目历史记录,使其线性且有意义。这允许您在将更改从功能分支集成到另一个分支之前,通过更改单个提交、更改其顺序、将提交压缩为一个、跳过包含无关更改的提交等来清理提交历史记录。
编辑当前分支的历史记录
PyCharm 允许您在将更改应用到不同分支之前编辑当前分支中的提交历史记录。
打开 Git工具窗口 并切换到“日志”选项卡。Alt09
过滤日志,使其仅显示当前分支的提交:
选择要编辑的一系列提交中最旧的提交,右键单击它并选择Interactively Rebase from Here。
将显示“交互式变基”对话框,其中包含当前分支中在选定提交之后进行的所有提交的列表:
如果“从此处交互式变基”选项被禁用,则可能是由于以下原因之一造成的:
所选提交有多个父项
所选提交不在当前分支中
选定的提交被推送到受保护的分支
要确定原因,请将鼠标悬停在上下文菜单中的操作上,然后在状态栏中查找消息:
您可以对分支历史记录执行以下更改:
更改应应用提交的顺序:使用和按钮在列表中上下移动提交。
选择一个提交:这是所有提交的默认状态。如果您需要撤消已对提交执行的操作,请单击“选择” ,以便按原样应用此提交。
编辑:单击“停止”进行编辑 ,以便当您启动变基时,您可以在此提交处停止以便能够对其进行编辑。
当 rebase 在提交时停止时,PyCharm 窗口的右下角会弹出一条通知,让您继续或中止 rebase:
在继续变基之前,您可以使用上下文操作(例如Revert、Undo、Amend等)修改此提交。如果您不执行任何操作,则此提交将按原样应用。
如果您已关闭通知,请从主菜单中选择Git | 继续变基以恢复它。
重写提交消息:单击重写或双击提交并在打开的迷你编辑器中编辑文本。
将两个提交合并为一个:选择要合并到前一个提交中的提交,然后单击“Squash”或“Squash”按钮旁边的箭头,然后单击“Fixup”。
如果您单击Squash,默认情况下,来自两个提交的消息将被合并,因此,如果您不修改生成的提交消息,此操作将反映在分支历史记录中。
如果单击Fixup,则修复提交的提交消息将被丢弃,因此此更改将在分支历史记录中不可见。
在这两种情况下,您都可以在应用这些操作之一时打开的迷你编辑器中编辑提交消息。
忽略提交:单击“删除”,以便不应用所选提交的更改。
撤消所有更改:单击“重置”以放弃已应用于提交的所有操作。
因此,“变基提交”对话框会显示一个图表,说明您应用于分支中提交的所有操作,以便您可以在开始变基之前查看它们:
单击开始变基。
编辑分支历史并将其集成到另一个分支
PyCharm 允许您将一个分支变基到另一个分支之上,并在应用更改之前编辑源分支历史记录。
从主菜单中选择 Git | 变基:
单击修改选项并选择--interactive。
从列表中,选择要将当前分支变基到的目标分支:
如果您需要从特定提交开始对源分支进行变基,而不是对整个分支进行变基,请单击修改选项并选择--onto。在源分支字段中,输入要将当前分支应用到新基础的提交的哈希值:
提示
要复制提交哈希,请在Log中选择它,右键单击它并选择Copy Revision Number。
如果您要变基的分支当前未签出,请单击“修改选项”,单击“选择另一个要变基的分支”,然后从显示的列表中选择一个分支:
PyCharm 将在开始变基操作之前检查此分支。
如果要对分支中可访问的所有提交进行变基,请单击修改选项并选择--root(有关此选项的更多信息,请参阅git-rebase)。
如果您需要保留空提交(即不会从其父级更改任何内容的提交),请单击修改选项并选择--keep-empty(有关此选项的更多信息,请参阅git-rebase)。
单击变基。
将显示“交互式变基”对话框,其中包含当前分支中在选定提交之后进行的所有提交的列表。
您可以对分支历史记录执行以下更改:
更改应应用提交的顺序:使用和按钮在列表中上下移动提交。
选择一个提交:这是所有提交的默认状态。如果您需要撤消已对提交执行的操作,请单击“选择” ,以便按原样应用此提交。
编辑:单击“停止”进行编辑 ,以便当您启动变基时,您可以在此提交处停止以便能够对其进行编辑。
当 rebase 在提交时停止时,PyCharm 窗口的右下角会弹出一条通知,让您继续或中止 rebase:
在继续变基之前,您可以使用上下文操作(例如Revert、Undo、Amend等)修改此提交。如果您不执行任何操作,则此提交将按原样应用。
如果您已关闭通知,请从主菜单中选择Git | 继续变基以恢复它。
重写提交消息:单击重写或双击提交并在打开的迷你编辑器中编辑文本。
将两个提交合并为一个:选择要合并到前一个提交中的提交,然后单击“Squash”或“Squash”按钮旁边的箭头,然后单击“Fixup”。
如果您单击Squash,默认情况下,来自两个提交的消息将被合并,因此,如果您不修改生成的提交消息,此操作将反映在分支历史记录中。
如果单击Fixup,则修复提交的提交消息将被丢弃,因此此更改将在分支历史记录中不可见。
在这两种情况下,您都可以在应用这些操作之一时打开的迷你编辑器中编辑提交消息。
忽略提交:单击“删除”,以便不应用所选提交的更改。
撤消所有更改:单击“重置”以放弃已应用于提交的所有操作。
因此,“变基提交”对话框会显示一个图表,说明您应用于分支中提交的所有操作,以便您可以在开始变基之前查看它们:
单击开始变基。
感谢您的反馈意见!