使用 hg cp --after 修改提交

Amending a commit with the effects of hg cp --after

我有一个文件 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

这是有道理的:它无法将该编辑记录为新提交的一部分,因为源文件不存在。我想要将其记录为上一次提交的一部分,但我不知道该怎么做,除非将其记录为新提交的一部分然后 amending它进入之前的提交。

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

$ 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 的使用只是为了节省手动 re-edit 文件更改的麻烦。但如果这样看起来更容易,您也可以手动重做。

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

根据@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 让我们安全了,这样你就可以用不同的方法重试最后的步骤,看看哪种方法更适合你