svn老鸟转用git必须理解的概念
不都是SCM代码管理嘛,有很大区别么?很多svn老鸟都是抱着这样的心态去学习git,然后无一幸免地陷入“查阅过很多资料,依然掌握不好”的困境,至少我们团队是这样的。
网上的资料确实已经很多了,却没有把整个知识结构串起来。通读《git权威指南》是可行的,只是大家都急着用,没那耐性。我这里熬一碗鸡汤,整理供大家享用。
一、安装
服务器端不展开,因为主要面向搬砖的码农。
客户端可参见大神 廖雪峰 的Git教程-安装git
需要特别说明的是,在windows中,msysgit才是真正的git客户端,乌龟tortoisegit只是个界面。mercurial和sourcetree也是类似道理。
二、本地版本库
又见 工作区和暂存区
这里容易是初学者容易踩坑的地方,代码只提交到本地版本库,却没有推送到远程版本库。(其实是选型的人的反人类设定吧,用分布式的工具去做集中式的管理。)
svn是本地-远程两层的结构,而git则是工作区-本地-远程三层的结构。
在客户端看的见到的源码文件是工作区,提交到的是本地版本库,本地版本库的修改如果不推送,就是单机自己玩,不会影响其他人。
三、相关命令和冲突合并
命令方面资料很健全,我就不重复造轮子了。见上文的Git教程。
命令的查阅很流行这种叫Cheatsheet(考试作弊的小抄么?)速查手册,也是一搜一大把~
比如 http://ndpsoftware.com/git-cheatsheet.html 清晰地指出从哪个区到哪个区对应的命令是什么~

又比如上图,图示说明了遇到各种场景应该怎么办。
至于冲突,都是发生在跨分支或跨库的修改。比如,工作区的修改未commit而pull远程的更新时会报错(要先commit),本地库push发现远程库有其他人提交时会报错(要先pull并在本地解决冲突),暂存区取回stash pop时可能发生冲突。
而当合并发生冲突需要手动解决时,svn老鸟肯定是懵逼的,三路对比合并,哪个打哪个啊。。。这是因为,在svn中只有“我和中央库”的冲突,而git中却是“我和他”的冲突。
所以在git中做合并有三个源:base是分支的共同祖先,local是本地仓当前分支,remote是要从这个分支合过来,output当然就是合并结果的预览啦。
详见 对于解决 Git 的 Merge Conflict 你有哪些经验和技巧?
四、命令行or图形界面?
两者没有本质区别,图形界面最后也还是触发命令。直接用命令行能更好理解整个操作的过程。
图形界面则操作方便。但新手一定要对图形界面中的参数保持敏感,可能多勾了选项结果就完全不一样,比如--force。。。
五、分支管理
查阅过很多git分支管理的资料,依然用得不好,直到踩过若干个月的坑。。。
git的发源是开源系统,思想是分布式、去中心化,用svn的集中式管理是很容易踩坑的。
首先,svn是针对文件内容的对比,而git是针对文件增量和提交时间的对比,多人的频繁的冲突合并极容易发生错误。
其次,git的去中心化思想认为每个开发者都是熟练的负责任的。而事实上不是的,如果团队里有一两个“流氓”,遇到冲突没有细看,直接--force或use mine,测试会抓狂的,然后开发和项目经理都会抓狂的~
然后最后,你便会质疑:为什么不用svn啊?git跟svn没什么区别啊,还更难用!
且看看开源项目对git是怎么用的。 Git使用规范流程 开发者先fork复制出自己的库(远程),然后一系列的开发(本身也可以有分支管理),push上自己的远程库后,再pull request提交给管理员review和合并。而开源项目的发布,是有stable和nightly update等不同的发布版本。
回过头来看,公司团队里的项目要怎样管理git的版本和分支呢?

上图 git flow 便是最完整最科学的分支管理模型了。
这里有四点血泪经验要谨记:
1.不要吝啬开分支,git开分支的代价很小。
2.合并是容易出事的环节,要让负责任的熟手来把关。
3.以feature划分开发分支是非常好的思维方式,把相互依赖的内容放在一起、把不相关的内容隔离开、让“这个功能暂时不上”这种需求变更变得可行。
4.分支是活的、会变动的,标签tag才是一个确切的版本。
至此,使用git做源码管理的项目和团队足以运作起来而且可以避开大部分的坑。要用得更溜的话可以继续精修patch、rebase、revert、--fast-forward、cherry pick等更高阶的用法。
最后彩蛋:老司机温馨提醒,请把eclipse项目文件、编译后文件(文件夹)加入.gitignore文件,这个问题在svn就存在了~
svn老鸟转用git必须理解的概念的更多相关文章
- svn git 必须理解的概念
不都是SCM代码管理嘛,有很大区别么?很多svn老鸟都是抱着这样的心态去学习git,然后无一幸免地陷入“查阅过很多资料,依然掌握不好”的困境,至少我们团队是这样的. 网上的资料确实已经很多了,却没有把 ...
- iOS开发——源代码管理——git(分布式版本控制和集中式版本控制对比,git和SVN对比,git常用指令,搭建GitHub远程仓库,搭建oschina远程仓库 )
一.git简介 什么是git? git是一款开源的分布式版本控制工具 在世界上所有的分布式版本控制工具中,git是最快.最简单.最流行的 git的起源 作者是Linux之父:Linus Bened ...
- svn迁移到git
步骤命令如下: > git svn clone https://svn-url/ProjectName --no-metadata --authors-file=user.txt --trunk ...
- svn 版本转为git
git clone 相当于git init 和 git svn fetch.git svn rease git svn fetch 从svn服务器取指定区间的版本转化成git库 git svn reb ...
- SVN迁移到Git的过程(+ 一些技巧)
SVN迁移到Git的过程(+ 一些技巧) 李顺利 Key Words SVN,Git,Clone,Conversion,Tips,VCS,Pro Git 关于在VCS中SVN和Git之间的迁移(Clo ...
- SVN迁移到Git的过程(+ 一些技巧
关于在VCS中SVN和Git之间的迁移(Clone)这个部分网上已经有大批的文章介绍,而且都非常不错,能够满足我们的常见的需求,这里介绍的是我自己整理的一些技巧和使用中出现的一些问题和疑问.阅读本篇文 ...
- svn迁移到git仓库并保留commit历史记录
svn迁移到git仓库并保留commit历史记录 最近在做svn迁移到gitlab,由于之前一直是由svn做版本控制.最简单的方式是将svn的内容export出来,然后添加到gitlab即可.但是,如 ...
- git - svn 平滑到 git
1. 建立自己的git仓库,需要是空git仓库 2. checkout 你的 git仓库 3. svn忽略.git文件,忽略.git .gitignore 4. 把 .git文件拷到你的 svn仓库 ...
- Git的一些基本概念
Git的一些基本概念 设置自己的用户名和邮箱git config –global user.name "Your Name"git config –global user.emai ...
随机推荐
- Oracle数据库中实现mysql数据库中auto-increment功能
在Mysql数据库中,想要实现一条数据的自增一功能(即插入此数据时填写null即可,系统自动+1),可直接在所在列使用语句auto-increment. id int primary key auto ...
- 剑指offer系列40----机器人的运动范围
package com.exe8.offer; /** *[题目]地上有一个m行和n列的方格.一个机器人从坐标0,0的格子开始移动, * 每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标 ...
- bzoj2152 聪聪可可
Description 聪聪和可可是兄弟俩,他们俩经常为了一些琐事打起来,例如家中只剩下最后一根冰棍而两人都想吃.两个人都想玩儿电脑(可是他们家只有一台电脑)……遇到这种问题,一般情况下石头剪刀布就好 ...
- 互联网 DBA 需要做那些事(转)
众所周知,互联网DBA与传统行业DBA有很大的不同,那就是管理的机器多,新技术更新快,面对的开发多.网络环境复杂.要求7*24待机:这样就 导致互联网DBA的工作在传统DBA工作之上,增加了更多的复杂 ...
- Java 新IO
NIO提供全新的底层I/O模型.与最初的java.io包中面向流(stream-oriented)概念不同,NIO采用了面向块的概念(block-oriented).在尽可能的情况下,I/O的操 ...
- NeHe OpenGL教程 第九课:移动图像
转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...
- DPI和像素
像素(Pixel) 对于计算机的屏幕设备而言,像素(Pixel)或者说px是一个最基本的单位,就是一个点.其它所有的单位,都和像素成一个固定的比例换算关系.所有的长度单位基于屏幕进行显示的时候,都统一 ...
- JAVA 数组算法(复制、查找、插入)
一.复制数组算法 //数组复制算法 public class Test{ public static void main(String[] args){ int[] arrA = {100,800,5 ...
- mongoDB数据库备份
mongodump -h dbhost -d dbname -o dbdirectory 备份mongoDB数据库 重新打开 dos命令框 mongodump -h 127.0.0.1:27017 - ...
- Beautiful Soup第三方爬虫插件
什么是BeautifulSoup? Beautiful Soup 是用Python写的一个HTML/XML的解析器,它可以很好的处理不规范标记并生成剖析树(parse tree). 它提供简单又常用的 ...