我该如何在Sourcetree中拆分一个未推送的过去提交?

19

Sourcetree的交互式rebase功能很棒,但我经常发现自己想要将一个提交 “拆分” 成多个较小的提交。我知道有一种方法可以在命令行中完成此操作,但似乎找不到在UI中处理此操作的任何位置。

是否有一种使用Sourcetree进行此操作的方法?还是这是我必须下到命令行来实现我的目标的情况之一?


你是指要拆分一个已经存在的提交(改变历史,例如 git rebase --interactive),还是从工作副本中添加一些更改,提交它们,然后重复此过程,例如 git add --patch - Chris
改变历史记录。更大的情况是,在推送之前,我有一堆提交需要清理。其中一些提交需要拆分成较小的提交,其中一些将与其他提交合并在一起。Sourcetree 处理压缩和重新排序部分非常好,但我无法弄清如何拆分现有提交。 - cdeszaq
你是在使用 SourceTree 的 Windows 版本还是 Mac 版本? - user456814
这可能可以通过GUI使用简单的重置,然后是常规的rebase来完成,但老实说,直接从命令行做这种事情要容易得多。我再也不会向任何人推荐git GUI了,甚至不包括SourceTree。在我看来,使用GUI隐藏所有这些功能只会使事情变得更加困难,而不是更容易。 - user456814
@Cupcake - 我用的是Mac,但我的团队中有些人使用Windows,所以在那里也有一个解决方案会很好。我完全知道你所说的CLI vs. GUI,但我发现GUI环境中的学习曲线(如果它被设计得很好)要低一些,让新用户更专注于概念和工作流程,而不是记住实现目标所需的具体命令等等。树形结构的可视化对此非常有帮助。 - cdeszaq
1个回答

35
使用交互式 rebase 命令从命令行中拆分提交的过程在 git help rebase 中有详细解释(搜索“SPLITTING COMMITS”)。这不是一个 git 命令或选项,而是一种提交编辑的方式。您可以使用 Mac 上的 SourceTree 执行其中描述的步骤。根据您的问题,我了解到您之前已经使用 SourceTree 进行过交互式 rebase,并熟悉其用户界面。

更新:

看来我的原始回答(请参见上文)过于神秘。没有特殊的git命令可用于拆分提交,因此SourceTree也没有提供命令或选项来执行该操作。您需要阅读并按照文档中说明的步骤使用 GUI,而非命令行。

以下是这些步骤(引自文档)及如何在Atlassian SourceTree中执行它们:

  1. 使用 git rebase -i <commit>^开始交互式 rebase,其中<commit>是您要拆分的提交。实际上,只要包含该提交即可使用任何提交范围。

右键单击要编辑的提交的父提交。从弹出的上下文菜单中选择“以交互方式重新排列子项<hash>…”<hash>是所单击提交的哈希值的缩写)。

  1. 将您想要拆分的提交标记为“edit”操作。

SourceTree打开“交互式变基”对话框。在列表中找到要分割的提交(它是最后一个),并在列“修订提交?”中勾选其复选框。按下“确定”按钮继续。

  1. 当需要编辑该提交时,执行git reset HEAD^。其效果是将HEAD倒回一步,索引紧随其后。但是,工作树保持不变。

SourceTree在后台运行所需的Git命令,并停止在您标记为修订的提交处进行编辑。右键单击当前HEAD的父提交,并从出现的上下文菜单中选择“重置(无分支,重新变基<branch>)到此提交”<branch>是您开始过程时检出的分支名称)。它会询问要使用哪种模式进行重置;在“使用模式”列表中选择“混合-保留工作副本但重置索引”,然后按“确定”

  1. 现在向索引中添加您想要放入第一个提交的更改。您可以使用git add(可能是交互式的)或git gui(或两者都有)来完成。

现在是分割时间!将要放入第一个提交中的文件和块添加到索引中;如果需要,甚至可以进行原始提交中不存在的更改。但是,请注意,未包含在正在编辑的提交中的更改可能会与稍后提交引入的更改发生冲突。

  1. 使用适当的提交消息提交当前索引。

按照惯例使用 SourceTree 并提交暂存的更改.

  1. 重复最后两个步骤,直到您的工作目录干净为止。

(无注释)

  1. 使用 git rebase --continue 继续变基。

"操作"菜单中选择"继续变基"

恭喜! 您刚刚使用 SourceTree 提供的隐藏命令 "split commit" 分割了一个提交 :p

备注

如果出现问题或您改变主意或出于任何原因需要取消整个过程,则请使用"操作"菜单中的"中止变基"。 在后台,SourceTree 将调用 git rebase --abort,并且一切都会返回到开始之前的状态。

如果您需要拆分/编辑同一分支上的多个提交,则可以在第1步中使用最旧的提交,并在第2步中标记所需的所有提交以进行修改。 其他所有内容都相同,SourceTree 将重复步骤3-7以修改您标记为需要修改的每个提交。

这就是使用Atlassian SourceTree拆分提交的方法。任何其他提供交互式变基方式的带有GUI的 Git 客户端均可代替使用。


问题要求如何在GUI中完成此操作。已经提到可以使用命令行界面完成它。 - florisla
1
@florisla 仔细阅读我的(原始)答案。它说没有特殊的 git 命令来拆分提交,但文档提供了一个大型的配方。可以使用 SourceTree 或任何其他提供交互式变基的 GUI 客户端按照配方的所有步骤进行操作。我用详细的解释更新了答案。 - axiac

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接