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

sta*_*tle 5 git tortoisegit git-extensions

抱歉,如果某处有重复的内容,我在寻找解决方案时淹没在大量更改提交消息的技巧中(这对我没有帮助)。

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

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

可悲的是,当我注意到有一个包含两者更改的文件时,我已经提交(未推送)第一个变更集并在其上创建了工作分支

有没有办法编辑我的提交,以便我可以提取影响变更集 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
Run Code Online (Sandbox Code Playgroud)

这给了我old_branch变更集 1 和new_branch变更集 2。

再次感谢!

jbu*_*jbu 6

使用git add -p选择性地级更改/帅哥,你打算提交。提交第一批后,您可能会留下第二组更改,在这种情况下,您可以正常添加文件并提交。

Git 会询问你想对每次提交做什么。类型 '?' 求助。按 'y' 以暂存大块,按 'n' 将大块从暂存区排除。

如果 git 没有选择足够细的大块,当它询问您如何处理大块时,您可以按“e”,您的编辑器将打开,您可以选择所需的大块部分包括。

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