背景
由于最近公司即将从Mercurial
版本管理迁移到GitLab
上,特此写下此文纪念一下。
什么是 Hg Mercurial
Mercurial
在IT界是跨平台的分布式版本控制软件,主要由Python语言实现。主要是命令行程序操作,图像化呢也有。由于该软件命名中文翻译是——水银,为了输入命令时方便,用元素命名Hg
来作为调用程序的关键字。
目前网络上提供托管服务的有bucket
wiki
作者我呢,用过svn,git,最后才接触hg,用来的感觉吧。命令像git,但没git那么复杂,说他像svn呢,感觉这软件比较年轻。
基本操作
## 帮助
$ hg help
## 初始化:
$ hg init
## 查看状态,会展示对改动了哪些被跟踪文件,新增未跟踪文件,冲突文件
$ hg status
## 查看远程仓库地址
$ hg paths
## 查看当前分支
$ hg branch
## 查看日志
$ hg log
内容管理
## 从远程仓库克隆到本地
$ hg clone ssh://code@code.example.com/repository
## 新增文件
$ hg add "file-name"
## 在做了更改后
$ hg commit -m 'change description...'
## 推送该分支的更改到远程仓库
$ hg push -r "version_number"
## 从远程仓库拉取
$ hg pull
## 将拉到本地远程仓库的内容和本地仓库合并
$ hg fetch
## 撤销对当前文件的修改
$ hg revert "file-name"
## 撤销上一次提交,并将上一次提交的内容,放入待提交区
$ hg rollback
特别说明一下 hg rollback只能回滚一次。意思是:如果你提交了两次,运行rollback两次,也只能回滚最近的那一次。
分支管理
## 创建分支
$ hg branch "new_branch_name"
## 切换到该分支
$ hg update "branch_name"
## 将这个分支合并到当前分支上
$ hg merge "other_branch_name"
## 推送该分支的改动到远程仓库
$ hg push -b "branch_name"
这分支操作,SVN的感觉
草稿
hg草稿管理
## 将当前的被跟踪的改动存到草稿,并命名
$ hg shelve --name "draft_name"
## 展示当前项目的草稿
$ hg shelve --list
## 将这个保存在草稿内的改动应用到当前项目
$ hg unshelve "draft_name"
类比git stash
, 使用该功能需要开启拓展 shelve
对比
## 查看当前对跟踪文件的改动
$ hg diff
## 查看当前版本对于"version_number" 版本的不同
$ hg diff -r "version_number"
## 查看ver2相对于ver1的改动
$ hg diff -r "ver1" -r "ver2"
拈来
## 将该版本的提交记录直接复制过来, 命令成功后,会在当前分支生成一个提交记录!
$ hg graft -r "rev"
就是 git cherry-pick
补丁 导入
## 将当前已跟踪文件的更改导入 ./code.patch 文件内
$ hg diff > code.patch
## 将文件内改动应用到当前项目
$ hg import code.patch --no-commit
你可把这个功能当保存草稿用,也能离线推送编辑给别人
其他
hg日志查看
## 查看最新版本
$ hg tip
## 查看日志,并附上分支图
$ hg log -G
## 查看这次提交的日志
$ hg log -r "version_number"
hg 使用了自增自然数,和hash字符共同管理版本号,集svn,git版本号于一身,这下你挑不出毛病了吧
## 查看上一个版本提交日志
$ hg parent
配置
全局配置文件放在~/.hgrc
,当前项目的配置文件放在./.hg/
隐藏目录内。远程仓库
的路径记录在./.hg/hgrc
内。
提交用户
配置提交时署名
## file ~/.hgrc
[ui]
username = zhang3 <zhang3@example.com>
拓展管理
hg
的拓展管理使用ini
格式文件管理,内部拓展只需要写上拓展名就像开关一样,使用第三方拓展需要指明拓展文件路径。
[extensions]
shelve =
strip =
my_ext = ~/my_ext.py
常见问题
-
'hg status' failed with code 255: 'abort: repository requires features unknown to this Mercurial: sparserevlog !
这个是sparse-revlog
相关的报错
注意后面那句话 see https://www.mercurial-scm.org/wiki/MissingRequirement, 访问后你可以看到不通版本之间兼容性问题。
如果用了可视化工具如:SourceTree
, TortoiseHg
。 需要调整配置。
- Hg 改了配置文件,没生效
如果你在使用SourceTree
, TortoiseHg
等这样的可视化版本管理工具,一般会自带一个hg
软件,要注意改动路径。
Hg 多头问题
产生的原因,往往是提交代码时,没有 hg pull
. 操作时提示: abort: push creates new remote head ** on branch **
, 解决方案有:
- 不管他,
hg update -b
,hg push -b
等命令替换为hg update -r
,hg push -r
,也就是指定推送某个commit
,这样就能避免多个头分支同名时,hg 不知你具体要推哪个分支,直接指定版本号,就可以继续工作了。 - 删除 多出来的"头"
$ hg strip -r (需要移除的提交版本号)`
Hg 如何回滚已提交的代码
hg rollback
只能回滚一次未提交到远程的 commit
,不得不说 rollback
的运行环境真苛刻。
我们可以这样,为刚刚提交的 commit
创建一个相反的 patch
,然后导入patch
。
## 创建 patch, 例如: hg diff -r 46643 -r 46591 > rollback_commit.patch
$ hg diff -r (rollback commit version) -r (你需要回滚的提交的上一个提交版本号,同一个分支上) > rollback_commit.patch
## 导入 rollback patch
$ hg import rollback_commit.patch --no-comit
## 查看反向提交的改动
$ hg status
好的,你在工作区就能看到待提交的回滚改动了。检查没问题提交到远程,就完成这个rollback
了.
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。