我能用Mercurial压扁你吗?
我有一对承诺,实际上应该只有一个。如果我使用git,我会使用:我能用Mercurial压扁你吗?,mercurial,Mercurial,我有一对承诺,实际上应该只有一个。如果我使用git,我会使用: git rebase -i <some-commit-before> git-rebase-i 然后把它们压扁 我可以在mercurial中这样做吗?如果是这样,怎么做?是的,您可以使用mercurial来实现这一点,而无需任何扩展 或者,如果要使用扩展,可以使用: 手术室 我最喜欢的是hg strip--keep命令。然后我在一次提交中提交所有更改 对我来说,这是最快、最舒适的方式,因为我喜欢在日常工作中做很
git rebase -i <some-commit-before>
git-rebase-i
然后把它们压扁
我可以在mercurial中这样做吗?如果是这样,怎么做?是的,您可以使用mercurial来实现这一点,而无需任何扩展 或者,如果要使用扩展,可以使用:
- 手术室
- 我最喜欢的是
hg strip--keep
命令。然后我在一次提交中提交所有更改
对我来说,这是最快、最舒适的方式,因为我喜欢在日常工作中做很多小事情;)
注1:
strip
需要启用内置扩展mq
。注2:默认情况下,我最喜欢的Git/Mercurial客户端(SmartGit/Hg)会追加
——在剥离期间保留参数。更方便的是:它提供了一个名为join-commits
:]的选项,它的工作就像一个符咒。要挤压2,请执行以下操作:
$ hg rebase --dest .~2 --base . --collapse
点是当前修订的快捷方式
当您在一个分支上有几个提交,并且希望将它们全部折叠为一个时,这就更容易了:
$ hg rebase --dest {destination branch (e.g. master)} --base . --collapse
工作原理:
(来自)
如果你正在阅读这个答案,你可以忘记所有其他的选择
并使用来自的折叠
命令
evolve
是mercurial的一个扩展,它帮助我们拥有安全的可变历史,但它仍然是实验性的。您可以使用它,方法是从其中克隆它并将其添加到.hgrc中,如下所示
[extensions]
evolve = ~/evolve/hgext/evolve.py
假设您在主目录中克隆了evolve repo。现在你可以走了。您还可以通过hg help fold
查找帮助
您可以告诉折叠
挤压/折叠未断开的线性提交链。fold所做的是,它创建一个新的变更集,其中包含来自所有变更集的变更,并将所有这些提交标记为过时。你可以在网站上对此有更深入的了解
现在假设您有以下历史记录
a -> b -> c -> d -> e -> f -> g
你想挤压e
,f
和g
。你能行
hg up g
hg fold -r e
hg up d
hg fold -r b
hg evolve --all
结果将是
a -> b -> c -> d -> h
其中,h
是变更集,它包含来自所有三个提交e
、f
和g
的变更
您还可以从历史记录的中间折叠变更集,也就是说,您不必选择包含提示的链。假设您要折叠b
,c
和d
。你能行
hg up g
hg fold -r e
hg up d
hg fold -r b
hg evolve --all
这将导致
a -> i -> j
其中,i
是b
,c
,d
和j
的折叠变更集,与h
是相同的变更集。
必须阅读。我认为chistedit
(自Mercurial 2.3以来内置)最接近纯Mercurial的rebase-I
(chistedit
是histedit
的交互式版本)。进入histedit后,将折叠
命令映射到rebase的挤压
和滚动
命令映射到rebase的修复
。有关更多信息,请参阅文档
下面是一个简单的例子。假设您有以下内容,并且希望将所有1e21c4b1的更改移动到上一版本中,并且只保留上一版本的消息
@ 1e21c4b1 drees tip
| A commit you want to squash
o b4a738a4 drees
| A commit
o 788aa028 drees
| Older stuff
您可以运行hg chistedit-r b4a738a4
将历史编辑回b4a738a4。在chistedit中,然后将光标向下移动到1e21c4b1,点击r
,表示要滚动该修订。请注意,histedit(从最旧到最新)中的顺序与hg日志(从最新到最旧)中的顺序相反
选择更改后,然后选择c
提交更改。结果如下:
hg strip .
hg add
hg commit --amend
@bfa4a3be drees尖端
|承诺
o 788aa028 drees
|老东西
如果您对它们比较陌生,那么histedit
可能是比chistedit
更好的选择,因为它在histedit文件中提供了命令描述供参考。使用普通文本编辑(就像普通的重基一样)设置命令只需要再进行一些编辑
注意,要使用histedit
或chisteedit
,您需要将histedit
添加到~/.hgrc中的扩展中:
[extensions]
histedit =
[extensions]
strip =
我建议使用chistedit
,因为它最接近rebase-I
,在历史上任何地方都可以使用。如果你真的只想将当前版本包含/调整到上一个版本中,那么@G.Demecki的strip
建议会很好,因为所发生的事情是清楚的。它是自Mercuria 2.8以来内置的。要获得与上述相同的结果,您可以执行以下操作:
hg strip .
hg add
hg commit --amend
注意~/.hgrc中需要启用与histedit类似的strip
:
[extensions]
histedit =
[extensions]
strip =
我使用:
让我们假设您想要挤压(联合)2个最近的提交
查找修订号
hg log -G -l 3
可能的产出:
@ changeset: 156:a922d923cf6f
| branch: default
| tag: tip
| user: naXa!
| date: Thu Dec 13 15:45:58 2018 +0300
| summary: commit message 3
|
o changeset: 155:5feb73422486
| branch: default
| user: naXa!
| date: Thu Dec 13 15:22:15 2018 +0300
| summary: commit message 2
|
o changeset: 154:2e490482bd75
| branch: default
~ user: naXa!
date: Thu Dec 13 03:28:27 2018 +0300
summary: commit message 1
软复位分支
hg strip --keep -r 155
再次提交更改
hg commit -m "new commit message"
笔记
strip
需要启用内置扩展。使用以下内容创建/编辑~/.hgrc
配置文件:
[extensions]
strip =
汞代4.8(11~2018, 9年后),可考虑新的命令<代码> Hg吸收< /代码>(a)。
见“
absorb扩展将接受工作目录中的每一项更改,找出系列中修改该行的提交,并自动将更改修改为该提交。
如果存在任何歧义(即多个提交被修改到同一行),那么absorb将忽略该更改,并将其保留在工作目录中以手动解决
在技术层面,hg
查找所有未提交的更改,并尝试将每个更改的行映射到明确的先前提交。
对于可以清晰映射的每个更改,未提交的更改都会被吸收到相应的先前提交中。受该操作影响的提交将被重定基础