zoukankan      html  css  js  c++  java
  • TortoiseHg 学习笔记 (转)

    0.前言
        TortoiseHg是分布式的源码管理工具Mercurial的GUI客户端。 mercurial 作为3大主流的分布式源码管理工具,已经被广泛的使用。例如 googlecode.com和codeplex.com都支持mercurial作为源码管理工具。下面结合某个场景,叙述TortoiseHg的具体使用方法。

    1.假想场景
    【1】主管在版本库服务器中建立一个仓库,该服务器的IP地址为192.168.1.102,版本库服务器的端口为8000(默认)。
    在版本库中只有一个main.c文件,main.c文件的内容如下
    1. #include <stdio.h>  
    2. int main(void) {  
    3.     printf("Hg Test ");  
    4. }  
    【2】A男和B男分别clone版本库
    【3】A男试图在main.c中min函数,B男试图在版本库中加入max函数。两人同时开始修改。
    【4】B男似乎速度快一点,增加了max函数并提交。
    【5】A男也完成了max函数,拉取版本库之后发现B男已经提交了一个版本,A男发现两个版本存在冲突。
    【6】A男和B男相互沟通,决定同时保留min函数和max函数。
    【7】A男使用合并工具完成合并并提交至服务器。
    【8】B男拉取服务器内容,并进行更新。
    最后A男和B男本地版本库中的内容完全相同,main.c中的内容变为
    1. #include <stdio.h>  
    2. int min(int a, int b) {  
    3.     return a < b ? a : b;  
    4. }  
    5. int max(int a, int b) {  
    6.     return a > b ? a : b;  
    7. }  
    8. int main(void) {  
    9.     printf("Hg Test ");  
    10. }  



    【Init】 初始化,创建一个空的仓库。
    【Clone】 复制仓库,来源可以是一个http或ssh链接表示的仓库,也可以是本地仓库。
    【Commit】 提交,即接受所有的改动将当前版本作为最新版本(也叫tip)。只提交的本地仓库,而且本地仓库会详细记录所有的变动(称为变更集或改动集)。多次提交并不会影响远程仓库。
    【Revert】恢复,即撤销所有的改动,恢复到未更改的状态。
    【Pull】拉取,将雅远程仓库有而当前仓库没有的变更集“下载”到本地仓库。不过这只是添加了变更集文件【Update】更新,当获取了其他变更集,更改以保持和远程仓库一致
    【Push】推送,将当前仓库的变更集“上传”到其他仓库去。
    合并。当一个文件同时被多次修改,并存放在多个仓库时,要获得一个统一的版本就需要合并。

    2.服务器搭建
    【若干准备】
    创建一个名为main.c的函数,文件内容如下
    #include <stdio.h>
    int main(void) {
        printf("Hg Test ");
    }
    【建立仓库】
    在该文件所在目录,右击选择tortoiseHg -> create respository here(或在Hg workbench中操作)建立本地仓库。请注意首次创建的仓库为一个空仓库,可进行必要的提交工作。
    图2.1 建立本地仓库

    图2.2 建立本地仓库

    【首次提交】
    进行提交操作时,需要首先选中最新版本,接着选择需要跟踪文件,然后编写必要的修改说明,最后点击提交按钮。请注意提交操作仅仅提交到本地仓库,若要使远程仓库产生变化需要进行下一步推送操作。(由于此处为图2.3 首次提交

    图2.4 提交之后结果

    【修改服务器设置】
    选择server选项,修改全局参数和该仓库参数。其中允许他人推送。为了简单说明问题,全局参数和该仓库设置相同。在该项设置中默认的端口号位8000,也可以使用其他端口号,请一定要避免知名端口号。
    图2.5 修改全局设置

    图2.6 修改本地仓库设置

    【启动服务器】
    在tortoiseHg中选择【仓库】->【web server】
    图2.7 启动webserver

    3.B男操作过程
    【过程概述】——clone远程仓库至本地->修改源代码->本地提交Commit->拉取远程代码pull->合并merge或更新update->推送到远程仓库push

    【clone过程】
        新建一个空文件夹(必须为空文件夹),在空文件中右击,选择TortoiseHg->Clone。源地址中输入远程仓库URL,例如远程仓库服务器的IP地址为192.168.1.102,Hg仓库的端口号为8000。那么远程仓库的URL可写为:
        http://192.168.1.102:8000/
    图3.1 clone操作
    【修改代码】
        修改源代码,增加一个max函数,修改之后的main文件如下所示。
    1. #include <stdio.h>  
    2. int max(int a, int b) {  
    3.     return a > b ? a : b;  
    4. }  
    5. int main(void) {  
    6.     printf("Hg Test ");  
    7. }  

    【本地提交】

        在界面的右下角可看到代码的变化情况,+号代表增加。

    图3.2 本地提交

    【拉取操作】
        由于A男没有提交代码到远程仓库,所有此时B男拉取时提示没有任何更新内容。
    【推送操作】
        B男执行推送操作,那么远程仓库发生了变化。(此时A男也有可能在编写代码,但是他并没有完成代码本地提交和推送操作,那么A男拉取时之后,需要和他本地的代码进行合并,然后再进行推送操作。虽然此处B男的拉取和推送操作非常简单,但是没有任何代表性,请关注下文A男的操作)
    图3.3 拉取并推送到远程仓库

    【必要的检查】
        通过网页查看推送是否成功,请输入远程仓库URL 192.168.1.102:8000。
    图3.4 必要的检查

    4.A男操作过程
    【本地克隆】
        和B均操作相同
    【修改代码】
        增加min函数。
    1. #include <stdio.h>  
    2. int min(int a, int b) {  
    3.     return a < b ? a : b;  
    4. }  
    5. int main(void) {  
    6.     printf("Hg Test ");  
    7. }  


    【本地提交】
    图4.1本地提交
    【拉取操作】
        A男发现B男已经提交了一个版本,需要进行代码合并。
    图4.2 拉取操作

    【合并操作】
        合并操作可借助合并工具,但是在合并之前还是和同事沟通一下。合并一般发生在两个人同时修改了同一个文件。
    图4.3 合并操作

        同一个文件中在两个分支中出现修改,已经无法自动合并需要进行下一步手动合并。
    图4.4 合并操作

        选择合并工具并开始合并,TortoiseHg会添加在系统中安装的合并工具,例如Bcompare或者winmerge。在界面中选择Tool Resolve使用工具解决合并,Take Local选择本地文件,Take Other选择远程文件(相当于放弃了本地修改)。建议选择使用工具合并同时和您的同时好好沟通一下,如何合并。
    图4.5 合并操作

        使用合并工具时,左侧为远程内容,右侧为本地内容。虽然合并工具提示仅存在很小的差异,例如min和max,<和>。但是如果有效沟通一下的话便会发送实际上应该增加一个函数,需要把max函数复制到本地已完成合并。
    图4.6 使用工具完成合并

        合并完成,编写必要的修改说明。
    图4.7 提交必要的合并说明

    【推送操作】
    图4.8 推送操作

    【检查结果】
    图4.9 必要的检查

    5.B男再次操作
    【拉取操作】
        此时B男发现远程服务器存在变更,需要进行合并或更新。
    图5.1 拉取操作

    【更新操作】
        此时B男只需要进行更新操作即可,及时进行合并操作Hg也会提示没有任何可以合并的内容。此时B男只需要通过更新update和服务器保持一致即可。【小技巧,可优先进行合并操作,若提示没有任务合并内容便使用更新操作】
    图5.2 更新操作
        最后A男和B男的本地仓库中,main.c的内容完全相同。

    6.ubuntu中使用
    图6.1 ubuntu中TortoiseHg界面
     
  • 相关阅读:
    算法练习--ABCD*E=DCBA
    Android实现炫酷SVG动画效果
    swift -NavigationController,代理传值
    交换机的原理及其配置(一)
    NOI2015 题解
    实现存储过程详解
    数据流图(DFD)画法
    SQL SERVER 常用字符类型的区别
    数据库常见面试题集锦,数据库面试题,数据库练习题
    Django自定义模型(model)中的字段标签
  • 原文地址:https://www.cnblogs.com/zhengqian/p/7597370.html
Copyright © 2011-2022 走看看