git - 如何以这种特定方式拆分 git commit
问题描述
情况:我有一个git commit(在 HEAD),它混合了额外的日志记录代码,然后是一些“真实代码”。
现在我想做以下事情:
- 编辑掉所有的日志代码,基本上清理了代码库
- 提交这个
- 我现在在最后两次提交中有所需的状态,但是它们的顺序错误,首先添加所有内容,然后删除日志记录,当我想要添加其他代码然后添加日志记录时
- 交换这两个提交,这样
- 首先,在没有记录的情况下添加了实际功能
- 然后将日志记录代码添加到自己的提交中
现在我可以“手动”执行此操作,通过获取包含日志记录的代码的纯副本,然后按照上述删除日志记录并将这些提交压缩为一个(因此提交历史记录中根本没有日志记录代码),然后恢复包含日志记录的代码副本,并将其添加为新提交。
但是有没有一种方法可以优雅地做到这一点,并且使用git功能减少人为错误的可能性?
澄清一下,我不想选择在我想要的第一次提交中包含哪些部分(因为那里有很多小的更改,我不想再次查看它们)。我想选择从第一次提交中删除哪些部分,并添加为新的第二次提交。
解决方案
我认为没有任何方法可以做到没有任何人为错误的可能性,但是通过使用一些 git 功能并基本上撤消你的提交,然后只在每次提交中添加你想要的部分,你可以实现你所描述的。
我会通过软重置来做到这一点HEAD~1
,然后使用git add --patch
仅添加您想要在第一次提交中提交的部分,提交,然后添加日志记录。
以下是我将如何处理这个问题:
git reset --mixed HEAD~1
这会重置您的最后一条提交消息并取消暂存这些更改。git add --patch
这为您提供了一种交互模式,您可以在其中选择要暂存的未暂存更改的哪些部分。如果代码块太大(即您只想提交它的一部分),您可以通过点击将其拆分为较小的部分s
,然后只暂存较小的部分。它支持将代码块拆分为单行更改,因此希望这对您来说已经足够了。git commit
提交你的“真实代码”git add .
暂存其余更改(日志记录代码)git commit
再次提交日志记录代码
通过使用这种方法,您不必在任何地方复制粘贴任何代码,从而至少减少了人为错误的机会。
推荐阅读
- c# - ASP.NET Core - API 多参数
- visual-studio-code - 如何解决错误:“找不到名称 'acquireVsCodeApi'”?在 vs 代码扩展 web 视图开发中
- css - 带有填充的容器内部的引导网格系统
- javascript - ./src/components/navbar/HomeNav.js 中的错误模块构建失败 - Webpack 错误
- flutter - 在通用有状态小部件中不能具有通用参数的功能
- reactjs - Rfresh 父组件,同时在 ag-grid 中详细更新 CellRendering
- flutter - NavigationRail 不尊重 AutomaticKeepAliveClientMixin
- macos - 我可以将 macOS lpr 输出重定向到 PDF 而不是打印机吗?
- python - 如何同步运行 Airflow 任务
- android - Android CameraX takePicture 在 android codelab 中不起作用