分布式版本控制系统git在项目开发中的使用

原文连接:http://tabalt.net/blog/use-gi...git

关因而用git仍是svn的争论,我想不用多聊了,总的来讲,git是更稳定、更强大、更现代的分布式版本控制工具,值得你们去尝试与应用。github

1、准备工做

  • 配置我的信息vim

    git config --global user.name "$username"
    git config --global user.email "$email"
    git config --global push.default simple
    git config --global color.ui trueapi

  • git仓库的建立与受权服务器

    git仓库通常由管理员建立好了,若是是github网站,直接点击右上角的“ + ”号,选择 “New repository”,填写信息并建立便可。
    
    git服务器广泛使用ssh公钥来受权访问。unix系列环境下,使用ssh-keygen命令建立。

    ssh-keygen
    cd ~/.ssh
    ls id_rsa.pub运维

    将id_rsa.pub文件发给git服务器的管理员,或复制文件中的内容在github的Settings -> SSH keys 页面中添加便可:

    https://github.com/settings/sshssh

    如何建立、管理一个git仓库,是git服务器运维的问题了,这里不作过多的探讨。
  • 初始化项目分布式

    cd ~/dev/
    git clone git@127.0.0.1:path/to/git_test.git
    cd ~/dev/git_test
    git statussvn

2、本地分支开发

当有一些紧急bug须要修复或者一些小功能的改动,一我的就能轻松搞定,可使用本地分支来开发。函数

  • 更新本地master分支为最新

    cd ~/dev/git_test
    git checkout master
    git pull
  • 创建本地开发分支

    git branch -b dev1011
  • 在本地开发分支上修改代码

    echo "hello git" > hello.txt
    git add hello.txt
    git commit -am 'add test file hello.txt'
    echo "test" > test.txt
    git add test.txt
    git commit -am 'add test file test.txt'
  • 开发完毕后,合并代码到master

    • 他人可能在咱们开发的时候提交了代码,所以先更新master分支的代码

      git checkout master
      git pull

    • 以最新的master分支代码rebase本地开发分支,若是出现冲突请看第四节:git冲突处理。

      git checkout dev1011
      git rebase master

    • 合并本地开发分支的代码到master

      git checkout master
      git merge dev1011
      git push

3、远程分支开发

远程分支适用于多人协同开发同一个系统或功能的场景。使用远程分支开发,能够避免在master分支上引入不稳定的代码。

远程分支名能够根据开发的独立子系统或模块名称命名,如game、user、api、admin 等等。

  • 初始化远程user分支

    • 更新本地master分支为最新

      cd ~/dev/git_test
      git checkout master
      git pull

    • 以本地master分支为基准新建远程user分支

      git push origin master:user

  • 在远程user分支开发(平常开发)

    • 将远程user分支checkout下来

      git checkout user
      git pull

    • 在本地创建属于本身的开发分支

      git checkout -b userdev

    • 编写代码

      echo 'hello user' > user.txt

    • 提交到本地开发分支

      git add user.txt
      git commit -am 'add user.txt'

    • 其余人可能修改了代码,先合并user上变更的内容到本地本身的开发分支

      git checkout user
      git pull
      git checkout userdev
      git rebase user

    • 合并本地本身的开发分支的代码到远程user分支

      git checkout user
      git merge userdev
      git push

    • 切换到本地userdev开发分支,继续开发

      git checkout userdev
      //coding...

    能够看到,这小节的操做步骤,和使用本地分支开发时几乎彻底同样,只是将基于master的操做,换成基于user的操做。

  • 合并user分支到master

git checkout master
    git pull
    git checkout user
    git rebase master

    git checkout master
    git merge user
    git push
  • 更新远程user分支的代码

    这时,远程的master,本地的master,本地的develop保持一致;但若是master里被人修改了代码(如修改紧急bug等),远程的user分支的代码并非最新的了。

    • 借用本地master的代码更新远程user分支:

      git push origin master:user

    • 开发完毕后,能够直接删除远程user分支

      git push origin :user

    • 开发完毕后,能够删除本地分支

      git branch -D user

4、git冲突处理

使用git merge 、git rebase、git pull等命令时,都有可能和别人修改的代码发生冲突。

从本质上说,都是merge 和 patch(应用补丁)时产生冲突。rebase是从新设置基准,而后应用补丁的过程,因此也会冲突。git pull会自动merge,repo sync会自动rebase,因此git pull和repo sync也会产生冲突。

  • 逻辑冲突

    逻辑冲突实际上git是发现不了的。git merge 或者path成功,可是生成的代码逻辑是有问题的,须要经过完备自动化测试等方式来保障。

    可能形成逻辑冲突的状况:

    • 其余人修改了文件名,我在老文件里作改动

    • 函数参数、返回值等变化,调用方未作相应修改等

  • 树冲突

    两个用户同时修改文件名形成的冲突,称为树冲突。下面是一个用户修改a.txt为b.txt,另外一个用户修改a.txt为c.txt形成冲突的状况:

    $ git status
        added by us:    b.txt
        both deleted:   a.txt
        added by them:  c.txt

    若是最终肯定使用b.txt,执行以下操做:

    git rm a.txt
    git rm c.txt
    git add b.txt
    git commit

    树冲突也能够用git mergetool来解决,用d 删除不要的文件,用c保留须要的文件,最后执行git commit提交。

  • 内容冲突

    内容冲突是最多见的状况,两个用户修改了同一个文件的同一块区域,git会报告内容冲突。

    通常状况下,出现冲突时都会有“CONFLICT”字样,并提示哪些文件有冲突。

    当repo sync报错时,可能并不直接提示冲突,而是下面这样:

    error: project mini/sample

    能够经过rebase解决:

    git rebase remote-branch-name

    merge/patch的冲突解决

    当某个文件有冲突产生时,git会在冲突的地方作标记。下面是一个有冲突的文件,冲突标记<<<<<<< (7个<)与=======之间的内容是个人修改,=======与>>>>>>>之间的内容是别人的修改;此外,没有任何其它垃圾文件产生。

    $ vim conflict.txt
        
        <<<<<<< HEAD
        //my changes
        =======
        //other's changes
        >>>>>>> commit log

    直接编辑文件中被标记的地方,将不须要的表明和冲突标记删除。并执行 add、commit操做

    git add conflict.txt
    git commit

    rebase的冲突解决

    rebase的冲突解决过程,就是解决每一个应用补丁冲突的过程。

    按照上面的操做编辑每个冲突文件,并一一执行git add 的操做,而后执行下面的命令继续rebase操做:

    git rebase --continue

    有冲突继续解决,重复这这些步骤,直到rebase完成。

    若是中间遇到某个补丁不须要应用,能够用下面命令忽略:

    git rebase --skip

    若是想回到rebase执行以前的状态,能够执行:

    git rebase --abort

    rebase以后,不须要执行commit,也不存在新的修改须要提交,都是git自动完成。

打赏做者

原文连接:http://tabalt.net/blog/use-gi...

相关文章
相关标签/搜索