使用 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
这是有道理的:它无法将该编辑记录为新提交的一部分,因为源文件不存在。我想要将其记录为上一次提交的一部分,但我不知道该怎么做,除非将其记录为新提交的一部分然后 amend
ing它进入之前的提交。
这是解决这种情况的一种方法:
$ 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
的使用只是为了节省手动 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
让我们安全了,这样你就可以用不同的方法重试最后的步骤,看看哪种方法更适合你
我有一个文件 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
ing它进入之前的提交。
这是解决这种情况的一种方法:
$ 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
的使用只是为了节省手动 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
让我们安全了,这样你就可以用不同的方法重试最后的步骤,看看哪种方法更适合你