Mercurial的使用心得
本文发表地址:http://www.xiabingbao.com/mercurial/2015/01/22/mercurial-understanding/
本人接触版本控制的历史
在很久很久以前,我们是怎么进行版本控制的呢,当我们工作到某个阶段后,就把此时的项目存为一个文件夹(A),然后再从这儿复制出一份(B)接着修改,而存储的那个文件夹(A)就是我们打的版本号,当我们把B改动到某个阶段后再打一个版本,然后从这个版本里衍生出一个C,一直衍生下去……。如果我们在某个版本改坏了的话,我们再从上个版本复制出一份接着修改。
本人当时在学校的时候对版本控制了解的不深,就是用的这种方式进行版本控制的,这种手动进行版本控制的一个坏处就是:我们不知道每两个版本的差异在哪儿,都修改了哪些文件,只能说是这个版本比上个版本多了几个功能,可是文件的差异在哪儿,就不好对比了。不过后来在工作中遇到了SVN,这种情况就改善了很多。
当时小蚊使用SVN时,每次我要对某个项目的代码进行改动时,都先从服务器上down下一份代码来,然后开始修改。因为本地的代码已经很老了,如果其他人也提交了代码的话,我再用我本地的老代码进行提交,就可能出现代码覆盖或文件冲突的情况。刚开始使用时都没有写改动信息,后来发现同事会在项目里弄一个changelog.txt来保存每次的修改,然后我也跟着学。可是后来发现原来SVN本身就有记录改动日志的功能,从这儿之后才算是开始步入正轨,真正地接触到了版本控制系统。
当我开始接触github时,慢慢地使用上了git这个版本控制系统,可是因为是项目只有自己在改,也没有学习到很多。
后来换了新工作之后,新公司使用的是mercurial作为版本控制系统,在工作中学习到了很多分布式版本控制系统的知识。
mercurial的使用
hg和git有着无数的相似之处,都是分布式版本控制,都是有分支。git我只是在提交自己的项目时使用,很多的东西还没用到,不过工作中使用的是hg,每天都在多人合作代码,常会遇到合并分支时出现文件冲突、推代码时出现多个相同的分支。
  什么是分支,分支是干什么用的?
  像以前传统时的那种版本控制系统,整个项目都是集中一个服务器上,任何的修改都是要先从整个服务器上拉取代码,修改完成后再上传上去,若在修改的期间,其他人也提交了代码,最后自己提交的时候可能会覆盖掉上一个人的改动;现在分布式版本控制系统的优势就是,一个分支就是一个代码库,你在该分支上进行的任何操作都不会影响到其他分支,如果把整个分支整坏了,或者想放弃这个分支,那么直接切回到default分支重新新建即可,在那个分支上所有的改动都被保留在了那个分支上。
hg常用命令
  hg clone rep 从rep的地址拉取代码
  hg status 查看当前仓库中的文件改动状态:
    M: 内容已改动;
    !(感叹号):版本库还在跟踪该文件,可是本地仓库已经丢失该文件
    R:该文件从版本库中删除;
    ?(问号):本地仓库中新添加的文件,版本库里还没有该文件,需要使用hg add 文件名 添加到版本库中
    A:该文件是新添加的
  hg remove 文件名 版本系统不再跟踪该文件
  hg revert 文件名 恢复该文件
状态是!(感叹号)的,需要进行二选一了,是该文件真需要删除了,还是被误删了;若真的需要删除,则使用hg remove 文件名,若被误删了则使用hg revert恢复该文件
  hg add . 将所有没有在版本控制系统的文件添加到控制系统中,
  hg add 文件名 是将某个文件添加到控制系统中 hg log 查看提交的历史信息
  hg commit 将本地的改动进行提交
  hg push 将改动推到远程的分支上
  hg merge 分支名 将其他分支的代码合并过来
  hg diff 查看改动,hg diff 文件名 查看该文件的改动
使用过程中遇到的问题
- 当前分支拉取当前分支不用merge,直接hg pull -u
- 取消当前分支的修改回到最初状态时,hg update -C
- 切换到其他分支且不保留当前分支的修改时,hg update default -C
- 切换到其他分支且保留当前分支的修改时,hg update default
- 创建分支时要在default分支上进行创建,这样保证所有的分支没有瓜葛;若在其他的分支上直接创建分支时,则把上一个分支的修改保留了下来,不容易进行拆分;视情况而定 
- 若第一次提交分支时,则使用hg push -b 当前分支名 –new-branch,若已经是第二次以上的提交了则使用hg push -b 当前分支名即可,当然,每次提交时都带着—new-branch也没错 
- 多人合作时需要拉取别人的分支的代码,不要担心,别人的分支和default分支没有任何区别 
 7.1 在default分支上拉取远程的代码并更新本地代码:
 hg pull -u(hg pull, hg update)
 7.2 在default分支上新建自己的分支:
 hg branch 自己的分支名
 7.3 合并他人的分支:
 hg merge 他人的分支名
 7.4 将合并的先提交一下,不然一会儿自己的改动和刚拉取的他人的代码混到一起了:
 hg commit -m ‘merge from xiaoming’
 7.5 进行自己的改动,该修改的修改,该添加的添加,该删除的删除
 7.6 提交自己的修改:
 hg commit -m ‘改动原因或目的’
 7.7 再拉取下远程的代码,在改动的过程中说不定已经有人更新default分支了,不合并的话,会把别人的提交弄丢:
 hg pull -u
 hg merge default
 hg commit -m ‘merge from default’(若merge default时需要提交)
 7.8 将自己的代码推送到远程代码库:
 hg push -b 自己的分支名 –new-branch
- 配置 .hg目录 
 8.1 grc : hg的远程代码库地址 ,若远程地址改动了 ,不用从零开始在新的地址拉取,只需要在这个文件中可以修改地址即可
[paths]
default = ssh://https://www.github.com/wenzi0github/test
    8.2 branch : 当前的分支 ,这个文件里存储着当前的分支名 
    8.3 last-message.txt : 最后一次提交的信息,hg commit -m ‘message’
  9. 合并分支时出现冲突或出现推代码时出现多个相同的分支(多头),怎么办?
当我出现这个的状况时通常是使用<a href=“”>sourceTree</a>的这个可视化工具来解决的,sourceTree上安装kdiff3的插件,当合并时出现了冲突,能够很明显的看到文件的哪部分出现了冲突,然后应该选择哪个作为需要合并的部分 当出现多个相同的分支时,把其他相同的分支直接merge到一个分支上,然后再推代码。
总结
当然,这里也只是个人经历的总结而已,依然还有很多的东西没有总结到位。
Mercurial的使用心得的更多相关文章
- 我的MYSQL学习心得(一) 简单语法
		我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据类型 我的MYSQL学习心得(五) 运 ... 
- NoSql数据库使用半年后在设计上面的一些心得
		NoSql数据库这个概念听闻许久了,也陆续看到很多公司和产品都在使用,优缺点似乎都被分析的清清楚楚.但我心里一直存有一个疑惑,它的出现究竟是为了解决什么问题? 这个疑惑非常大,为此我看了很多分析文章, ... 
- 我的MYSQL学习心得(二) 数据类型宽度
		我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据类型 我的MYSQL学习心得(五) 运 ... 
- 我的MYSQL学习心得(三) 查看字段长度
		我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(四) 数据类型 我的MYSQL学习心得(五) 运 ... 
- 我的MYSQL学习心得(四) 数据类型
		我的MYSQL学习心得(四) 数据类型 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(五) 运 ... 
- 我的MYSQL学习心得(五) 运算符
		我的MYSQL学习心得(五) 运算符 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据 ... 
- 我的MYSQL学习心得(六) 函数
		我的MYSQL学习心得(六) 函数 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据类 ... 
- 我的MYSQL学习心得(七) 查询
		我的MYSQL学习心得(七) 查询 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据类 ... 
- 我的MYSQL学习心得(八) 插入 更新 删除
		我的MYSQL学习心得(八) 插入 更新 删除 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得( ... 
随机推荐
- html知识代码
			<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ... 
- linux内核源代码、配置与编译
			内核源代码下载:www.kernel.org Linux内核源代码采用树形结构进行组织,非常合理地把功能相关的文件都放在同一个子目录下,使得程序更具可读性. linux内核代码最好不要在windows ... 
- Ubuntu解压命令全览
			1. Ubuntu解压命令全览.tar 解包:tar xvf FileName.tar 打包:tar cvf FileName.tar DirName 注:tar是打包,不是压缩! .gz 解压1:g ... 
- python 之时间模块 time
			time模块可以用于格式化日期和时间,时间间隔是以秒为单位的浮点小数.每个时间戳都以自从1970年1月1日午夜(历元)经过了多长时间来表示. 下面是time模块常用的一些时间格式转换的函数.时间戳可以 ... 
- delphi程序中定义热键
			delphi程序中定义热键 用到3个API函数 BOOL RegisterHotKey ( HWND hWnd, //响应该热键的窗口句 ... 
- The Cheap KD 8 is rumored to arrive online
			Nike and also the Oklahoma City Thunder star revealed the Cheap KD 8, which they are calling probabl ... 
- 【android】夜间模式简单实现
			完整代码,请参考我的博客园客户端,git地址:http://git.oschina.net/yso/CNBlogs 关于阅读类的app,有个夜间模式真是太重要了. 那么有两种方式可以实现夜间模式 1: ... 
- 由浅入深之Tensorflow(4)----Saver&restore
			x = tf.placeholder(tf.float32) y = tf.placeholder(tf.float32) w = tf.Variable(tf.zeros([1, 1], dtype ... 
- JS正则表达式从入门到入土(7)—— 分组
			分组 在使用正则的时候,有时候会想要匹配一串字符串连续出现多次的情况,比如:我想匹配字符串Byron连续出现3次的情况. 有些人会直接写: Byron{3} 但是,这种情况仅仅会匹配Byro加上三个n ... 
- Python笔记 #03# Help!
			源:DataCamp datacamp 的 DAILY PRACTICE + 日常收集. Functions Built-in functions Help! Multiple arguments ... 
