如果不创建一个分支并在一个新分支上做一堆奇怪的工作,那么在将一个提交提交到本地存储库之后,是否有可能将其分解为几个不同的提交?


当前回答

如果你有这个:

A - B <- mybranch

如果您在提交B中提交了一些内容:

/modules/a/file1
/modules/a/file2
/modules/b/file3
/modules/b/file4

但是你想把B分解成C-D,得到这样的结果:

A - C - D <-mybranch

例如,您可以这样划分内容(不同提交中来自不同目录的内容)。。。

将分支重置回要拆分的分支之前的提交:

git checkout mybranch
git reset --hard A

创建第一个提交(C):

git checkout B /modules/a
git add -u
git commit -m "content of /modules/a"

创建第二个提交(D):

git checkout B /modules/b
git add -u
git commit -m "content of /modules/b"

其他回答

请注意还有git reset-soft HEAD^。它类似于gitreset(默认为--mixed),但它保留了索引内容。因此,如果您添加/删除了文件,那么索引中已经有了这些文件。

事实证明,在大型犯罪的情况下非常有用。

使用最新提交

如果您只想从现有提交中提取一些内容并保留原始提交,可以使用

git reset --patch HEAD^

而不是git reset HEAD^。此命令允许您重置所需的块。

选择要重置的块后,您将拥有将重置上一次提交中更改的分段块。现在,您更改最后一次提交,从中删除这些更改

git commit --amend --no-edit

您可以通过以下方式将未堆叠的块添加到单独的提交中

git add .
git commit -m "new commit"

不使用最新提交

当然,按照上面的建议,使用gitrebase——interactive来执行之前的一些提交。

离题事实:

在mercurial中,他们有hgsplit——我希望在git中看到hg吸收之后的第二个特性。

现在,在Windows上的最新TortoiseGit中,您可以非常轻松地完成此操作。

打开rebase对话框,对其进行配置,然后执行以下步骤。

右键单击要拆分的提交,然后选择“编辑”(在拾取、挤压、删除…中)。单击“开始”开始重新定基。一旦到达提交拆分,请选中“编辑/拆分”按钮,然后直接点击“修正”。提交对话框打开。取消选择要单独提交的文件。编辑提交消息,然后单击“提交”。在有文件要提交之前,提交对话框将一次又一次打开。当没有更多的文件要提交时,它仍然会询问您是否要再添加一个提交。

非常有用,谢谢TortoiseGit!

以下是如何在IntelliJ IDEA、PyCharm、PhpStorm等中拆分一个提交

在版本控制日志窗口中,选择要提交的拆分,右键单击并从此处选择“交互式回扣”将要拆分的对象标记为编辑对象,单击“开始”回扣您应该看到放置了一个黄色标记,表示HEAD已设置这一承诺。右键单击该提交,选择“撤消提交”现在这些提交返回到暂存区,您可以提交它们分别地在所有更改都已提交后,旧的提交变得不活动。

您可以执行交互式rebase git rebase-i。手册页完全符合您的要求:

http://git-scm.com/docs/git-rebase#_splitting_commits