我有一个文件before.txt
,我想将其拆分为两个较小的文件。我应该应该做的是
$ hg cp before.txt part1.txt # Then edit part1.txt
$ hg mv before.txt part2.txt # Then edit part2.txt
$ hg commit
然后,part1.txt和part2.txt都将before.txt作为其历史记录的一部分,因此差异将显示为删除较大文件的一部分,而不是删除一个文件并使用其中的一些创建新文件其内容。
但是,我实际上所做的是
$ cp before.txt part1.txt # Then edit part1.txt
$ hg mv before.txt part2.txt # Then edit part2.txt
$ hg commit
所以before.txt仅存在于我两个文件之一的历史记录中。如果我没有运行hg commit
,对我来说似乎很清楚,我可以用
$ hg cp --after before.txt part1.txt
或类似的东西。而且我还没有将此提交推送到上游,因此我应该能够根据自己的喜好对其进行编辑。但是我不知道该怎么做。当我运行那个hg cp
时,我看到:
$ hg cp --after before.txt part1.txt
before.txt: No such file or directory
before.txt: No such file or directory
abort: no files to copy
这很有意义:由于源文件不存在,因此无法将编辑内容记录为新提交的一部分。我想要将其记录为上一次提交的一部分,但是我不知道如何做到这一点,除非将其记录为新提交的一部分,然后amend
将其记录到新提交中。以前的提交。
答案 0 :(得分:2)
这是解决这种情况的一种方法:
$ hg shelve # get any miscellaneous, unrelated changes out of the way
$ hg up <parent of revision with the mistake in it>
$ hg cp before.txt part1.txt
$ hg mv before.txt part2.txt
$ hg revert -r <revision with the mistake in it> --all
$ hg commit
$ hg strip <revision with the mistake in it>
(我实际上没有尝试所有这些命令,希望没有错别字!)
第一步是可选的,具体取决于您的工作目录的状态。
现在part1.txt
和part2.txt
应该具有正确的内容。使用revert
只是为了省去手动重新编辑文件更改的麻烦。但是,如果看起来更容易,您也可以手动重做。
使用revert将另一个变更集的效果拖入工作文件夹是我经常使用的技巧。就像手动修改方式一样,它为您提供了完全的灵活性。但是,只有当您将工作副本还原为的修订与作为工作副本的父版本的修订紧密相关时,它才能很好地工作。否则会造成许多麻烦的变化。
答案 1 :(得分:1)
基于@DaveInCaz答案,这是一个MCVE
mkdir tmpdir
cd tmpdir
hg init
echo line1 > before.txt
echo line2 >> before.txt
hg add before.txt
hg commit -m "my before"
cp before.txt part1.txt
hg add part1.txt
hg mv before.txt part2.txt
echo line1 > part1.txt
echo line2 > part2.txt
hg commit -m "my bad"
hg shelve
hg up -r -2
hg cp before.txt part1.txt
hg cp before.txt part2.txt
hg revert -r -1 --all
hg commit -m "my good"
hg strip -r -2
一些评论:
hg cp
,因为后面的revert
将为我们删除文件before.txt
,否则它将抱怨丢失文件revert --all
至少在我的版本中,它要求指定要还原的内容hg shelve
是安全的hg up -r -2
可能有-C
,因为以前的shelve
使我们安全了,因此您可以使用不同的方法重试最后的步骤,并查看更适合您的方法