Answers:
在rebase联机帮助页中有一个拆分提交的指南。快速摘要是:
执行包括目标提交(例如git rebase -i <commit-to-split>^ branch
)在内的交互式变基,并将其标记为要编辑。
当rebase到达该提交时,可使用git reset HEAD^
来在提交之前重置为,但保持工作树完好无损。
增量添加更改并提交,并根据需要进行任意数量的提交。add -p
在给定文件中仅添加部分更改可能很有用。使用commit -c ORIG_HEAD
,如果你想重新使用原来的提交信息有一定承诺。
如果要测试要提交的内容(好主意!),git stash
以隐藏未提交的部分(或stash --keep-index
什至在提交之前),请进行测试,然后git stash pop
将其余部分返回工作树。继续进行提交,直到完成所有修改为止,即拥有干净的工作树。
运行git rebase --continue
以在立即拆分的提交之后继续应用提交。
git rebase -i <sha1_of_the_commit_to_split>^ branch
。而git gui
对于拆分任务,可用于将一个文件的不同部分加入到不同的提交一个很好的工具。
git add -p
,它可以比git gui
本部门做得更多(特别是编辑块,暂存从当前块开始的所有内容以及通过正则表达式搜索块)。
这是使用Magit的方法。
假设ed417ae是您要更改的;它包含两个无关的更改,并被掩埋在一个或多个提交中。点击ll
以显示日志,并导航到ed417ae:
然后点击r
打开变基弹出窗口
并m
在点修改提交。
请注意,@
您现在想拆分的提交上是如何存在的-这意味着HEAD现在位于该提交上:
我们要将HEAD移到父级,因此导航到父级(47e18b3)并点击x
(magit-reset-quickly
,o
如果使用的话,绑定到evil-magit
),然后输入“是的,我的意思是在点提交”。您的日志现在应如下所示:
现在,打q
去正规Magit状态,然后使用常规的unstage u
命令unstage什么不会在第一次提交去,提交c
其余像往常一样,然后s
踏歌而c
ommit发生的事情在第二次提交,并在完成后:点击r
打开重新设置弹出窗口
另一个r
继续,您就完成了!ll
现在显示:
要拆分提交<commit>
并在此提交之前添加新提交,并保存作者的日期<commit>
,请执行以下步骤:
之前编辑提交 <commit>
git rebase -i <commit>^^
注意:也许也需要编辑<commit>
。
樱桃入选<commit>
指数
git cherry-pick -n <commit>
以交互方式重置索引中不需要的更改并重置工作树
git reset -p && git checkout-index -f -a
另外,也可以交互地存储不需要的更改: git stash push -p -m "tmp other changes"
进行其他更改(如果有)并创建新的提交
git commit -m "upd something" .
(可选)重复项目2-4以添加更多中间提交。
继续重新定基
git rebase --continue
如果您只想从一个文件中提取内容,则有一个更快的版本。之所以更快,是因为交互式变基实际上不再是交互式的(而且,如果您想从上一次提交中提取内容,那么它甚至更快,那么根本就不需要变基)
the_file
。关闭the_file
。那是您唯一需要的版本,其余的只是git命令。在索引中进行该删除:
git add the_file
将刚删除的行恢复到文件中,而不会影响索引!
git show HEAD:./the_file > the_file
“ SHA1”是您要从中提取行的提交:
git commit -m 'fixup! SHA1'
创建第二个全新提交,其内容要提取到步骤3中还原的内容:
git commit -m 'second and new commit' the_file
不要编辑,不要停止/继续-只接受所有内容:
git rebase --autosquash -i SHA1~1
当然,如果要提取的提交是最后的提交,则速度更快:
4. git commit -C HEAD --amend
5. git commit -m 'second and new commit' thefile
6. no rebase, nothing
如果使用,magit
则第4、5和6步是单个操作:提交,即时Fixup
如果尚未推送,请使用git rebase
。更好的是,用于git rebase -i
以交互方式移动提交。您可以将有问题的提交移至最前面,然后根据需要将其拆分,然后将补丁移回(如果需要)。