将一个提交分解为多个提交
Break a commit into multiple commits
让我先说清楚:我压缩、提交并推送到 public 历史分支中的每个提交。 public 历史记录中只有一次提交。我的工作目录很干净。没有对任何文件进行更改。
现在,我想将一个提交拆分为多个提交以重新创建历史记录而不 更改任何不必要的文件。
我目前正在使用 GitKraken,因此不胜感激。它没有实现完整的功能集(比如 git commit --allow-empty
。不是一回事。),但我可以访问命令行来执行它不直接支持的任何操作。
将单个提交拆分为多个提交(例如使用命令行 git):
可选:git branch backupBranchName
如果您担心犯错和丢失您的工作,或者希望能够轻松地退出更改,请先备份您的分支。
git reset HEAD^
撤消当前提交,同时通过软重置保留更改。之前提交的更改现在将变为未暂存的更改。
git add --patch .
选择第一个更改子集以形成第一个提交,并将它们暂存。如果它们已经按文件拆分,您可以轻松选择要暂存的文件。更有可能的是,您希望拆分的相同文件可能有不相关的更改。在这种情况下,您可以使用 -p
或 --patch
参数以交互方式选择要添加的 hunk。您可能需要 "split" 大块头才能获得正确的更改集。如果独立更改不修改类似的代码段,这应该就足够了。如果独立更改修改同一行,您可能需要在源代码编辑器中临时编辑这些行。
git stash --keep-index
测试您的更改。您可能想要验证已暂存的更改集,以确保代码仍然正确构建,并且所有单元测试都通过。为此,您需要暂时存储未添加到当前提交的更改。已经上演的更改应该保留,以便现在可以构建和测试它们。
git commit
创建新提交。
git stash pop
取消存储剩余的更改并从第 2 步继续拆分。
正如您已经推动的那样,完成上述步骤后,您的新作品的历史将有所不同。这意味着您不能简单地将它推送到同一个分支,因为 Git 将拒绝更改。您可能希望将更新作为新分支推送。或者,在这样做之前你需要深思熟虑,你可以强制推送分支以覆盖远程存储库中的历史记录,但只有在它不会打扰在同一个存储库中工作的其他人时才这样做,他们可能有建立在古老的历史之上。强制推送通常被认为是一种不好的做法,因此请仔细考虑何时实际使用它。更标准的做法是推送一个新分支,打开一个新的拉取请求,然后关闭任何旧的拉取请求。
让我先说清楚:我压缩、提交并推送到 public 历史分支中的每个提交。 public 历史记录中只有一次提交。我的工作目录很干净。没有对任何文件进行更改。
现在,我想将一个提交拆分为多个提交以重新创建历史记录而不 更改任何不必要的文件。
我目前正在使用 GitKraken,因此不胜感激。它没有实现完整的功能集(比如 git commit --allow-empty
。不是一回事。),但我可以访问命令行来执行它不直接支持的任何操作。
将单个提交拆分为多个提交(例如使用命令行 git):
可选:git branch backupBranchName
如果您担心犯错和丢失您的工作,或者希望能够轻松地退出更改,请先备份您的分支。
git reset HEAD^
撤消当前提交,同时通过软重置保留更改。之前提交的更改现在将变为未暂存的更改。
git add --patch .
选择第一个更改子集以形成第一个提交,并将它们暂存。如果它们已经按文件拆分,您可以轻松选择要暂存的文件。更有可能的是,您希望拆分的相同文件可能有不相关的更改。在这种情况下,您可以使用 -p
或 --patch
参数以交互方式选择要添加的 hunk。您可能需要 "split" 大块头才能获得正确的更改集。如果独立更改不修改类似的代码段,这应该就足够了。如果独立更改修改同一行,您可能需要在源代码编辑器中临时编辑这些行。
git stash --keep-index
测试您的更改。您可能想要验证已暂存的更改集,以确保代码仍然正确构建,并且所有单元测试都通过。为此,您需要暂时存储未添加到当前提交的更改。已经上演的更改应该保留,以便现在可以构建和测试它们。
git commit
创建新提交。
git stash pop
取消存储剩余的更改并从第 2 步继续拆分。
正如您已经推动的那样,完成上述步骤后,您的新作品的历史将有所不同。这意味着您不能简单地将它推送到同一个分支,因为 Git 将拒绝更改。您可能希望将更新作为新分支推送。或者,在这样做之前你需要深思熟虑,你可以强制推送分支以覆盖远程存储库中的历史记录,但只有在它不会打扰在同一个存储库中工作的其他人时才这样做,他们可能有建立在古老的历史之上。强制推送通常被认为是一种不好的做法,因此请仔细考虑何时实际使用它。更标准的做法是推送一个新分支,打开一个新的拉取请求,然后关闭任何旧的拉取请求。