【发布时间】:2015-01-10 05:41:58
【问题描述】:
我正在尝试撤消尚未推送的已提交更改。
我使用 TortisHG。我不知道如何启用条形扩展。
我怀疑那里有一个解决方案might be best practice,但我无法理解合并部分。而且我认为它不能解决解决本地提交但未推送的变更集的问题。
我发现 Tortis 中的回滚不会减少芥末。
最后 - 使用 GIT 会更容易吗?
【问题讨论】:
我正在尝试撤消尚未推送的已提交更改。
我使用 TortisHG。我不知道如何启用条形扩展。
我怀疑那里有一个解决方案might be best practice,但我无法理解合并部分。而且我认为它不能解决解决本地提交但未推送的变更集的问题。
我发现 Tortis 中的回滚不会减少芥末。
最后 - 使用 GIT 会更容易吗?
【问题讨论】:
只需将工作区更新到不需要的提交更改之前的位置。
然后只需在该更改之后移植后续位,您需要从该位置及时向前工作
然后你可以使用 strip 来整理
【讨论】:
几天前问了几乎完全相同的问题 - Discarding more than one commit in TortoiseHg。当不需要的变更集位于分支的头部时,它可以工作。为了省去您查找的麻烦,我在下面复制了我的答案。如果您在不需要的变更集之上提交了所需的变更集,则使用 rebase 会有一个稍微复杂的答案,但不清楚这是否是一个问题:
在最近的一个 mercurial(我认为是 v2.8 之后)中,您可以使变更集过时,从而将它们从大多数视图中隐藏起来,但如果您发现需要它们,它们仍然存在。这是做你想做的事情的推荐方法。
假设最近的变更集是 132,最新的好变更是 130。只需像这样废弃变更集 131 和 132:
hg prune -r 131::132
再简单不过了(只要确保当前父级不是不需要的变更集之一)。 [而且我不明白 git 怎么能让它变得更简单。]
如果您想查看过时变更集的内容,只需将 --hidden 添加到普通命令行,例如:
hg log -r 120::132 --hidden
注意。 Tortoise 具有查看过时变更集的功能,但我认为它还没有能力使它们过时。
【讨论】:
一种选择是修改旧的变更集。这特别有用,因为您想要撤消的变更集是提示,但包含一些您想要恢复的变更和一些您想要保留的变更。只需还原要撤消的文件并运行hg commit --amend。这会将任何工作目录更改应用于先前的提交。这将产生的效果是取消您想要摆脱的更改。
【讨论】:
您在“最佳实践”中提到的“在进行合并时保留“我的”或“他们的”文件,更多的是关于丢弃来自其中一个分支的更改。我相信您所需要的只是“条形”扩展。
您还可以通过将您的变更集临时导入补丁队列并只挑选您需要的变更来使用 MQ:
关于启用“strip”扩展。如果您启用了 MQ 扩展,“条带”会自动激活,即使它一直显示为“未选中”和“禁用”。禁用 MQ(并重新启动 TortoiseHG)将允许您显式启用/禁用“strip”。
PS:在 Win32 机器上检查,TortoiseHG 3.2.3
PPS:对于“GUIsh”解决问题的方式感到抱歉 :-)
更新: 我试图用旧版本的 Mercurial 重现上述命令行版本。 首先,我们创建一个 repo 并用变更集填充它:
C:\temp>mkdir testhg
C:\temp>cd testhg
C:\temp\testhg>hg init
C:\temp\testhg>hg --version
Mercurial Distributed SCM (version 2.2.1)
(see http://mercurial.selenic.com for more information)
Copyright (C) 2005-2012 Matt Mackall and others
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE
C:\temp\testhg>echo test1 > file.txt
C:\temp\testhg>hg addremove
adding file.txt
C:\temp\testhg>hg ci -m "test 1"
C:\temp\testhg>echo test2 >> file.txt
C:\temp\testhg>hg ci -m "test 2"
C:\temp\testhg>echo test3 >> file.txt
C:\temp\testhg>hg ci -m "test 3"
这些是我们的变更集:
C:\temp\testhg>hg log
2[tip] 201b257237ac 2015-01-13 17:59 +0200 Username
test 3
1 2054f00740b6 2015-01-13 17:58 +0200 Username
test 2
0 160251440fb0 2015-01-13 17:58 +0200 Username
test 1
将最后两个更改移动到补丁队列中:
C:\temp\testhg>hg qimport -r 1 -r 2
C:\temp\testhg>hg qseries
1.diff
2.diff
删除中间的更改(补丁文件本身仍然保存在补丁目录中):
C:\temp\testhg>hg qremove -k 1.diff
推迟我们想要保留在历史记录中的更改并完成它:
C:\temp\testhg>hg qpush
applying 2.diff
patching file file.txt
Hunk #1 succeeded at 2 with fuzz 2 (offset -1 lines).
now at: 2.diff
C:\temp\testhg>hg log
1[2.diff,qbase,qtip,tip] 9d0771cf5145 2015-01-13 17:59 +0200 Username
test 3
0[qparent] 160251440fb0 2015-01-13 17:58 +0200 Username
test 1
C:\temp\testhg>type file.txt
test1
test3
C:\temp\testhg>hg qfinish 1
C:\temp\testhg>hg log
1[tip] 9d0771cf5145 2015-01-13 17:59 +0200 Username
test 3
0 160251440fb0 2015-01-13 17:58 +0200 Username
test 1
【讨论】: