所以我在Mercurial中犯了一个愚蠢的错误 . 很多时候,我会在没有做“hg pull”和“hg update”的情况下开始工作 . 当我尝试推送我的更改时,出现错误 .
有没有办法删除我的本地提交,所以我可以避免创建多个头,分支等?我只想删除我的本地提交,将我的更改与提示合并,然后重新提交 . 听起来很简单吧?我似乎无法找到任何方法轻松删除本地提交,所以我可以干净地合并提示 .
我再次尝试删除使用“hg ci”进行的本地提交 . 我不想修改文件,还原等 .
启用“ strip ”扩展名并键入以下内容:
hg strip #changeset# --keep
#changeset# 是您要删除的变更集的哈希值 . 这将删除从它下降的所述变更集 including 变更集 and will leave your working directory untouched . 如果您还希望还原已提交的代码更改,请删除 --keep 选项 .
#changeset#
--keep
有关更多信息,请查看Strip Extension .
如果你得到"unkown command 'strip'",你可能需要启用它 . 为此,请找到 .hgrc 或 Mercurial.ini 文件并将以下内容添加到其中:
.hgrc
Mercurial.ini
[extensions] strip =
注意(正如Juozas在他的评论中提到的)具有多个头部是Mercurial中的正常工作流程 . 你不应该使用strip命令来对抗它 . 相反,您应该将头部与传入头部合并,解决任何冲突,测试,然后推送 .
当你真的想要摆脱污染分支的变更集时, strip 命令很有用 . 事实上,如果您处于this question的情况并且想要永久删除所有"draft"更改集,请查看the top answer,这基本上建议:
strip
hg strip 'roots(outgoing())'
如果您正在使用Hg Tortoise,请激活扩展名“ strip ”:
文件/设置/扩展/选择条带
然后选择要开始条带化的底部修订,方法是在其上执行 right click ,然后选择:
right click
修改历史记录条带
像这样:
在这个例子中,它将从第19个修订版删除到最后一个修订版(22) .
现代答案(仅在Mercurial 2.1之后有关):
使用Phases并标记您要发送的修订版本 .
在TortoiseHG中,您可以右键单击提交以更改其阶段 .
Also: 拉动后,您还可以使用扩展名"rebase"将本地提交移动到共享存储库的头部 .
正如其他人都指出你应该只是拉动然后合并头部,但是如果你真的想要在没有任何EditingHistory工具的情况下摆脱你的提交,那么你可以只是 hg clone -r 你的回购获得除了那些改变以外的所有 .
hg clone -r
这不会将它们从原始存储库中删除,但会创建一个没有它们的新克隆 . 然后你可以删除你修改过的仓库(如果你愿意的话) .
我也遇到过这个问题 . 我做了2 commit 并想要回滚并删除这两个提交 .
commit
$ hg rollback
但 hg rollback 只是回滚到最后一次提交,而不是2次提交 . 那时我没有意识到这一点,我改变了代码 .
hg rollback
当我发现 hg rollback 刚刚回滚一次提交时,我发现我可以使用 hg strip #changeset# . 所以,我使用 hg log -l 10 来查找最新的10次提交并获得我想要的正确的变更集 strip .
hg strip #changeset#
hg log -l 10
$ hg log -l 10 changeset: 2499:81a7a8f7a5cd branch: component_engine tag: tip user: myname<myname@email.com> date: Fri Aug 14 12:22:02 2015 +0800 summary: get runs from sandbox changeset: 2498:9e3e1de76127 branch: component_engine user: other_user_name<name@email.com> date: Mon Aug 03 09:50:18 2015 +0800 summary: Set current destination to a copy incoming exchange ...... $ hg strip 2499 abort: local changes found
abort: local changes found 是什么意思?这意味着 hg 发现了尚未提交的代码的更改 . 因此,要解决此问题,您应该 hg diff 来保存您已更改的代码 hg revert 和 hg strip #changeset# . 像这样:
abort: local changes found
hg
hg diff
hg revert
$ hg diff > /PATH/TO/SAVE/YOUR/DIFF/FILE/my.diff $ hg revert file_you_have_changed $ hg strip #changeset#
完成上述操作后,您可以使用差异文件,并将代码添加回项目中 .
$ patch -p1 < /PATH/TO/SAVE/YOUR/DIFF/FILE/my.diff
您可以使用Rebase extension更轻松地解决这个问题,只需使用 hg pull --rebase ,您的提交会自动重新调整到撤销的版本,从而避免出现分支问题 .
hg pull --rebase
如果你熟悉git,你会很乐意使用histedit,就像 git rebase -i 一样 .
git rebase -i
hg strip 正是您要找的 . 如果您熟悉git,它类似于 git reset .
hg strip
git reset
使用控制台:
您需要知道修订号 . hg log -l 10 . 此命令显示最近10次提交 . 找到您正在寻找的提交 . 变更线 changeset: 5888:ba6205914681 需要4位数字
changeset: 5888:ba6205914681
然后 hg strip -r 5888 --keep . 这将删除提交记录但保留所有文件,然后您可以重新发送它们 . (如果要删除文件只需删除--keep hg strip -r 5888
hg strip -r 5888 --keep
hg strip -r 5888
8 回答
启用“ strip ”扩展名并键入以下内容:
#changeset#
是您要删除的变更集的哈希值 . 这将删除从它下降的所述变更集 including 变更集 and will leave your working directory untouched . 如果您还希望还原已提交的代码更改,请删除--keep
选项 .有关更多信息,请查看Strip Extension .
如果你得到"unkown command 'strip'",你可能需要启用它 . 为此,请找到
.hgrc
或Mercurial.ini
文件并将以下内容添加到其中:注意(正如Juozas在他的评论中提到的)具有多个头部是Mercurial中的正常工作流程 . 你不应该使用strip命令来对抗它 . 相反,您应该将头部与传入头部合并,解决任何冲突,测试,然后推送 .
当你真的想要摆脱污染分支的变更集时,
strip
命令很有用 . 事实上,如果您处于this question的情况并且想要永久删除所有"draft"更改集,请查看the top answer,这基本上建议:如果您正在使用Hg Tortoise,请激活扩展名“ strip ”:
然后选择要开始条带化的底部修订,方法是在其上执行
right click
,然后选择:像这样:
在这个例子中,它将从第19个修订版删除到最后一个修订版(22) .
现代答案(仅在Mercurial 2.1之后有关):
使用Phases并标记您要发送的修订版本 .
在TortoiseHG中,您可以右键单击提交以更改其阶段 .
Also: 拉动后,您还可以使用扩展名"rebase"将本地提交移动到共享存储库的头部 .
正如其他人都指出你应该只是拉动然后合并头部,但是如果你真的想要在没有任何EditingHistory工具的情况下摆脱你的提交,那么你可以只是
hg clone -r
你的回购获得除了那些改变以外的所有 .这不会将它们从原始存储库中删除,但会创建一个没有它们的新克隆 . 然后你可以删除你修改过的仓库(如果你愿意的话) .
我也遇到过这个问题 . 我做了2
commit
并想要回滚并删除这两个提交 .但
hg rollback
只是回滚到最后一次提交,而不是2次提交 . 那时我没有意识到这一点,我改变了代码 .当我发现
hg rollback
刚刚回滚一次提交时,我发现我可以使用hg strip #changeset#
. 所以,我使用hg log -l 10
来查找最新的10次提交并获得我想要的正确的变更集strip
.abort: local changes found
是什么意思?这意味着hg
发现了尚未提交的代码的更改 . 因此,要解决此问题,您应该hg diff
来保存您已更改的代码hg revert
和hg strip #changeset#
. 像这样:完成上述操作后,您可以使用差异文件,并将代码添加回项目中 .
您可以使用Rebase extension更轻松地解决这个问题,只需使用
hg pull --rebase
,您的提交会自动重新调整到撤销的版本,从而避免出现分支问题 .如果你熟悉git,你会很乐意使用histedit,就像
git rebase -i
一样 .hg strip
正是您要找的 . 如果您熟悉git,它类似于git reset
.使用控制台:
您需要知道修订号 .
hg log -l 10
. 此命令显示最近10次提交 . 找到您正在寻找的提交 . 变更线changeset: 5888:ba6205914681
需要4位数字然后
hg strip -r 5888 --keep
. 这将删除提交记录但保留所有文件,然后您可以重新发送它们 . (如果要删除文件只需删除--keephg strip -r 5888