我是比较新的水银和我的团队正在尝试它现在作为颠覆的替代品。
我怎么能犯,推动一个文件到另一个存储库,而在未提交我的工作目录留给其他修改(或至少不推送到其他库)?
出现这种情况我们数据库迁移。 我们要迁移承诺源头控制,这样DBA可以查看和编辑它,而我们的代码修改工作与数据库迁移一起去。 这些变化还没有准备好去,所以我们不想推个个出来。
在颠覆,我只是做:
svn add my_migration.sql
# commit only the migration, but not the other files I'm working on
svn commit -m "migration notes" my_mygration.sql
并继续在本地工作。
这不与善变的工作时,我推着它到其他版本库,如果有,我没有拉下改变它,它要我拉下来,把它们合并,并承诺该合并到库。 合并后提交不允许你这样它迫使你提交你的本地仓库一切忽略文件。
我能想出的最简单的事情就是提交文件,以我的本地库,克隆我的本地库,获取从实际库的任何新的变化,将它们合并,并提交这个合并,并把我的变化了。
hg add my_migration.sql
hg commit -m "migration notes" my_migration.sql
cd ..
hg clone project project-clone
cd project-clone
hg fetch http://hg/project
hg push http://hg/project
这工作,但感觉像我想的东西比较容易,有些方法告诉善变已经忽略了我的工作目录中的文件,只是做了合并和发送的文件一起。 我怀疑善变的队列可以做到这一点,但我不完全神交MQ呢。
有实现搁置和取消搁置命令,给你指定的变化分开存放,直到稍后时间的互动方式Mercurial的特点: 搁置 。
然后你可以hg shelve
和hg unshelve
暂时存放的变化了。 它可以让你在“补丁大块”一级的工作挑选的项目搁置了。 它似乎没有搁置了一个文件列出的添加,只有在与修改回购文件了。
它包含水银作为一种“扩展”,它只是意味着你必须启用它在你汞柱配置文件。
对于真正的旧版本水银的注意事项(被列入货架前 - 这不再是必需的):
我没有看到任何伟大的安装说明一些google搜索,所以在这里我用得到它的工作结合东西:
用得到它:
hg clone http://freehg.org/u/tksoh/hgshelve/ hgshelve
唯一的文件(目前)在该项目是hgshelve.py文件。
修改你的〜/ .hgrc补充货架的扩展,指着在那里你克隆回购:
[extensions]
hgshelve=/Users/ted/Documents/workspace/hgshelve/hgshelve.py
它已经近2年,因为我最初提出这个问题。 我会采取不同的方式,现在(正如我在上面的问题的留言中提到以上)。 我现在会做将代替承诺在我的本地回购我的更改一个文件(可以使用汞记录扩展到只提交文件的碎片):
hg commit -m "commit message" filename
然后,只需推出。
hg push
如果有其他原因更改了,我需要首先合并回购作出了冲突,我会更新到父版本(与“汞父母-r。”如果你不知道它是什么看到的),提交我的其他变化有那么我有2头。 然后恢复到原来的单一文件提交和拉/合并更改到该版本。 然后推出与变化
hg push --rev .
要推出只有单一文件,并且该修订的合并。 然后,你可以合并您在本地得到了两个头。
这种方式摆脱的MQ的东西,被拒绝帅哥的潜力,使一切由源代码控制跟踪。 您也可以“汞条”修订过,如果你以后决定,你不希望他们。
TL;博士:我原来的解释看起来很复杂,但我希望它充分说明了如何使用补丁队列。 这里的短版本:
$ hg qnew -m "migration notes" -f migration my_migration.sql
$ hg qnew -f working-code
# make some changes to your code
$ hg qrefresh # update the patch with the changes you just made
$ hg qfinish -a # turn all the applied patches into normal hg commits
水银队列让这样的事情变得轻而易举,它使变更集可能更复杂的操作。 这是值得我们学习。
在这种情况下,第一个你可能想要保存什么在当前目录拉低更改之前:
# create a patch called migration containing your migration
$ hg qnew -m "migration notes" -f migration.patch my_migration.sql
$ hg qseries -v # the current state of the patch queue, A means applied
0 A migration.patch
$ hg qnew -f working-code.patch # put the rest of the code in a patch
$ hg qseries -v
0 A migration.patch
1 A working-code.patch
现在,让我们做的工作代码一些额外的工作。 我会继续做qseries
只是要明确的,但是一旦你建立了补丁队列的心智模式,您将不必守望着名单。
$ hg qtop # show the patch we're currently editing
working-code.patch
$ ...hack, hack, hack...
$ hg diff # show the changes that have not been incorporated into the patch
blah, blah
$ hg qrefresh # update the patch with the changes you just made
$ hg qdiff # show the top patch's diff
因为所有的工作,现在保存在补丁队列,你可以不应用这些更改,并恢复他们您在远程变化拉后。 通常情况下取消应用所有的补丁,只是做hg qpop -a
。 只是为了显示在补丁队列中的作用,我会弹出他们关闭一次一个。
$ hg qpop # unapply the top patch, U means unapplied
$ hg qseries -v
0 A migration.patch
1 U working-code.patch
$ hg qtop
migration.patch
$ hg qpop
$ hg qseries -v
0 U migration.patch
1 U working-code.patch
在这一点上,这是因为如果在你的目录中没有变化。 执行hg fetch
。 现在,你可以重新把你的补丁队列变化,并合并他们,如果有任何冲突。 这在概念上有点类似与git的变基。
$ hg qpush # put the first patch back on
$ hg qseries -v
0 A migration.patch
1 U working-code.patch
$ hg qfinish -a # turn all the applied patches into normal hg commits
$ hg qseries -v
0 U working-code.patch
$ hg out
migration.patch commit info... blah, blah
$ hg push # push out your changes
在这一点上,你已经同时保持其它地方的变化推出的迁移。 您的其他变化是在队列中的补丁。 我做了我的大部分的个人开发使用补丁队列来帮助我组织我的变化更好。 如果你想摆脱补丁队列,并返回到一个正常的风格,你就必须出口的更改,并在“正常”善变重新导入它们。
$ hg qpush
$ hg qseries -v
0 A working-code.patch
$ hg export qtip > temp.diff
$ rm -r .hg/patches # get rid of mq from the repository entirely
$ hg import --no-commit temp.diff # apply the changes to the working directory
$ rm temp.diff
我沉迷巨大的补丁队列发展和mq
是最好的实现在那里的一个。 手艺一些变化同时真正的能力,并提高如何集中和清洁你提交的。 这需要习惯一段时间,但它会令人难以置信的好与DVCS的工作流程。
如果你不希望依靠扩展另一种选择是让你的上游资源库的克隆本地,你只能使用这些类型的集成任务。
在你的榜样,你可以简单地拉/你的改变合并进一体化/上游资源库,推动直接到远程服务器。
我一般用的是用它来提交一个文件:
hg commit -m "commit message" filename
在后来的情况下,我有一个合并冲突,我还没有准备好提交我的变化,请按照下列步骤操作:
1)创建一个补丁文件。
hg diff > changes.patch
2)恢复所有的优秀的未提交的修改,只有在检查你的补丁文件之后。
hg revert --all
3)拉,更新和合并到最新版本
hg pull -u
hg merge
hg commit -m "local merge"
4)现在只需导入你的补丁回来,让你的变化。
hg import --no-commit changes.patch
请记住,使用从自动提交更改-no-提交标志。
既然你说最简单的,我经常使用hg commit -i
提交整个文件,即使(--interactive)。 随着--interactive
你可以选择文件(S)你想,而不是在命令行上输入他们的整个路径(S)。 作为额外的奖励,你甚至可以选择包含/排除的文件中块。
然后就是hg push
来推新创建的承诺。
我把使用更多的细节hg commit --interactive
在这样的回答: https://stackoverflow.com/a/47931672/255961
文章来源: What's the easiest way to commit and push a single file while leaving other modifications alone?