同一文件中的更改可以拆分到 git 中的不同提交吗?

Can changes in the same file be split to different commits in git?

抱歉,如果某处有重复项,我在搜索此问题的解决方案时淹没在更改提交消息的大量技巧中(这对我没有帮助)。

我有两组更改,它们应该是每个更改的一部分。不幸的是,我在早上开始了第二个变更集,没有注意到我忘记在前一天晚上提交第一个变更集。

在大多数情况下,它们会影响不同的文件。但是,一个文件包含两个变更集的更改,如果在没有第二个变更集的情况下推送,则会破坏构建。太糟糕了,我想在一个单独的分支上工作,直到功能正常。

遗憾的是,当我注意到时,我已经提交(未推送) 第一个变更集并在其上创建了 branch有一个包含两者更改的文件。

有没有办法编辑我的提交,以便我可以提取影响变更集 2 的变更?

在 Mercurial 中,您可以通过

理清提交
  1. 将它们转换为补丁,
  2. 在文本编辑器中打开它们并
  3. 移动补丁文件之间的差异行(如果你的 Mercurial GUI 当时没有打开)。

当 GUI 重新打开时,补丁包含了它们应该包含的内容,可以最终确定并推送。

这实际上是我想要的工作流程。 git 有类似的东西吗?

我正在使用的工具:Win10 上的 TortoiseGit 和 GitExtensions

编辑:答案中建议的解决方案

git checkout new_branch
git reset -p HEAD~1
git add -p
...
git commit -m "my changeset 1"
git add
git commit -m "my changeset 2"
git checkout old_branch
git reset --hard <new_branch>~1

这让我在变更集 1 处 old_branch 和在变更集 2 处 new_branch

再次感谢!

使用 git add -p 来 select 有效地阶段 changes/hunks 您计划提交的内容。提交第一批后,您可能会留下第二组更改,在这种情况下,您可以正常添加文件并提交。

Git 会询问你想对每次提交做什么。类型 '?'求助。按 'y' 将帅哥登台,然后按 'n' 将帅哥从你的暂存区中移除。

如果 git 没有 select 足够细的大块,当它询问您如何处理大块时,您可以按 'e' 和您的编辑器将打开,您可以选择要包含的帅哥部分。

最近了解到这个,它非常有用。