Sourcetree的交互式rebase功能很棒,但我经常发现自己想要将一个提交 “拆分” 成多个较小的提交。我知道有一种方法可以在命令行中完成此操作,但似乎找不到在UI中处理此操作的任何位置。
是否有一种使用Sourcetree进行此操作的方法?还是这是我必须下到命令行来实现我的目标的情况之一?
Sourcetree的交互式rebase功能很棒,但我经常发现自己想要将一个提交 “拆分” 成多个较小的提交。我知道有一种方法可以在命令行中完成此操作,但似乎找不到在UI中处理此操作的任何位置。
是否有一种使用Sourcetree进行此操作的方法?还是这是我必须下到命令行来实现我的目标的情况之一?
git help rebase
中有详细解释(搜索“SPLITTING COMMITS”)。这不是一个 git 命令或选项,而是一种提交编辑的方式。您可以使用 Mac 上的 SourceTree 执行其中描述的步骤。根据您的问题,我了解到您之前已经使用 SourceTree 进行过交互式 rebase,并熟悉其用户界面。
更新:
看来我的原始回答(请参见上文)过于神秘。没有特殊的git
命令可用于拆分提交,因此SourceTree
也没有提供命令或选项来执行该操作。您需要阅读并按照文档中说明的步骤使用 GUI,而非命令行。
以下是这些步骤(引自文档)及如何在Atlassian SourceTree
中执行它们:
- 使用
git rebase -i <commit>^
开始交互式 rebase,其中<commit>
是您要拆分的提交。实际上,只要包含该提交即可使用任何提交范围。
右键单击要编辑的提交的父提交。从弹出的上下文菜单中选择“以交互方式重新排列子项<hash>
…”(<hash>
是所单击提交的哈希值的缩写)。
- 将您想要拆分的提交标记为“edit”操作。
SourceTree
打开“交互式变基”对话框。在列表中找到要分割的提交(它是最后一个),并在列“修订提交?”中勾选其复选框。按下“确定”按钮继续。
- 当需要编辑该提交时,执行
git reset HEAD^
。其效果是将HEAD
倒回一步,索引紧随其后。但是,工作树保持不变。
SourceTree
在后台运行所需的Git
命令,并停止在您标记为修订的提交处进行编辑。右键单击当前HEAD
的父提交,并从出现的上下文菜单中选择“重置(无分支,重新变基<branch>)到此提交”(<branch>
是您开始过程时检出的分支名称)。它会询问要使用哪种模式进行重置;在“使用模式”列表中选择“混合-保留工作副本但重置索引”,然后按“确定”。
- 现在向索引中添加您想要放入第一个提交的更改。您可以使用
git add
(可能是交互式的)或git gui
(或两者都有)来完成。
现在是分割时间!将要放入第一个提交中的文件和块添加到索引中;如果需要,甚至可以进行原始提交中不存在的更改。但是,请注意,未包含在正在编辑的提交中的更改可能会与稍后提交引入的更改发生冲突。
- 使用适当的提交消息提交当前索引。
按照惯例使用 SourceTree
并提交暂存的更改.
- 重复最后两个步骤,直到您的工作目录干净为止。
(无注释)
- 使用
git rebase --continue
继续变基。
从"操作"菜单中选择"继续变基"。
恭喜! 您刚刚使用 SourceTree
提供的隐藏命令 "split commit" 分割了一个提交 :p
如果出现问题或您改变主意或出于任何原因需要取消整个过程,则请使用"操作"菜单中的"中止变基"。 在后台,SourceTree
将调用 git rebase --abort
,并且一切都会返回到开始之前的状态。
如果您需要拆分/编辑同一分支上的多个提交,则可以在第1步中使用最旧的提交,并在第2步中标记所需的所有提交以进行修改。 其他所有内容都相同,SourceTree
将重复步骤3-7以修改您标记为需要修改的每个提交。
这就是使用Atlassian SourceTree
拆分提交的方法。任何其他提供交互式变基方式的带有GUI的 Git
客户端均可代替使用。
git
命令来拆分提交,但文档提供了一个大型的配方。可以使用 SourceTree
或任何其他提供交互式变基的 GUI 客户端按照配方的所有步骤进行操作。我用详细的解释更新了答案。 - axiac
git rebase --interactive
),还是从工作副本中添加一些更改,提交它们,然后重复此过程,例如git add --patch
? - Chris