修改具有 hg cp 效果的提交 --之后



我有一个文件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 都将之前.txt作为其历史记录的一部分,因此差异将显示为删除较大文件的一部分,而不是删除一个文件并创建一个包含其某些内容的新文件。

然而,我实际上做的是

$ cp before.txt part1.txt # Then edit part1.txt
$ hg mv before.txt part2.txt # Then edit part2.txt
$ hg commit

所以以前.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到上一次提交中。

这是解决这种情况的一种方法:

$ 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.txtpart2.txt应该有正确的内容。使用revert只是为了省去手动重新编辑文件更改的麻烦。但是,如果看起来更容易,您也可以手动重做。

使用还原将另一个变更集的效果拉入工作文件夹是我经常使用的技巧。它就像一种手动修改方式,为您提供了完全的灵活性。但是,只有当您将工作副本还原的修订版与作为工作副本父级的修订版密切相关时,它才能正常工作。否则,它将产生许多令人讨厌的变化。

基于@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是安全的,然后再切换到不同的修订版
  • 自从以前的shelve使我们安全以来,hg up -r -2本可以-C,这样您就可以使用不同的方法重试最后的步骤,看看什么更适合您

最新更新