Git使用入门--从SVN转战Git
一、背景
公司的研发代码一直用SVN管理,但随着代码量与分支数量的不断增加,也逐渐暴露出了SVN的短板,所以公司研发服务部从去年就开始力推Git,用Git完全取代SVN是迟早的事。
为了提前让小师弟/师妹们适应Git环境,身为老司(油)机(条)的我主动整理了一份简单的文档,便于大家更容易从SVN切换到Git😏。
二、Git与SVN的区别
Git与SVN都是主流的版本管理工具,使用习惯其实也比较相似,但之所以要SVN转Git还是因为两者之间的差异,细节差异在此不表(主要是不懂...😅)。其中需要理解的最大差异有以下两点:
1、Git是分布式,SVN是中心式
2、Git分支记录了差异,而SVN分支是完整的拷贝
1、Git是分布式,SVN是中心式
Git与SVN的差异一图胜千言。
用户在使用SVN过程中是直接与服务器交互的,每一次提交、更新都是直接在和服务器请求,本地只是一份代码拷贝。所以在离线状态下是无法执行提交、更新、查看log等操作的。一旦服务器出现问题(比如被炸了😅),虽然本地的代码还在,但版本管理信息是无法恢复的。并且,由于只有一个版本库的存在,当一个用户在进行代码合并等重要操作时,其他用户一般需要等待,否则可能会造成大量冲突。
而Git则是采用分布式管理,每个用户本地都有一个完整的代码库,每次的commit等操作其实都只是和本地的版本库交互,只有使用push、pull等命令才会与中心服务器交互,从而实现与其它用户代码同步。所以Git在离线状态下也可以进行代码提交、查看log等命令的,只是无法与其他用户进行数据同步。
在这个网络中,服务器上的版本库(即上图中的交换中心)与用户的版本库其实都是等价、并处于同一层级的,两者之间可以相互取代。比如完全可以去掉中心服务器,而改用某一用户的机器作为数据交换中心。所以即便是服务器炸了,也可以从用户机器上clone一份,快速恢复。
2、git分支记录了差异,而SVN分支是完整的拷贝
- 对SVN而言,每新切一个分支,则意味着服务器上要重新拷贝一份完整的代码,用户也需要另外下载一份完整的代码。
无论对服务器还是用户而言,都是一笔很大的存储开销。 - 而对Git而言,新切一个分支只不过增加一个指针而已。所有的分支都在同一份代码目录上,不同分支上只记录了差异。
所以使用Git比较明显的一个体验是,用户本地只用存在一份代码,在同一份代码上进行切换分支的操作即可。
Git与SVN都是很优秀的版本管理工具,虽然现在主流的声音都是力推git,但其实也没有谁比谁强的关系,只是两者的实现方式有所区别,侧重点不同。比如SVN拥有更好的权限管理,适合管理项目的文档计划等。而git更加适用于多分支、大团队的代码管理。
三、Git安装
1. 安装git版本管理系统
从Git官网下载安装即可。安装完成后本地可以用Git自带的命令行工具或者GUI操作Git。
具体使用方法:在某目录下右键,选择git bash here
即可呼出命令行工具。
说明:git的命令行操作都要以git
开头。
2. 再安装图形客户端TortoiseGit (小乌龟)
其实执行完第1步就已经完成了Git环境搭建,但是对于我们这种弱鸡码农,全程用命令行提交/更新代码总还是有些吃力(虽然Git自带GUI,但用起来也不太友好),所以为了减少学习成本(偷懒),安装一个第三方图形客户端也是有必要的。首推TortoseGit客户端,俗称小乌龟🐢。
TortoseGit是开源的Git图形客户端,单从名称上就可以看出它和TortoiseSVN神似。安装完后会发现,它的UI界面与操作习惯也和后者高度相似。这也让广大码农节省了不少从SVN迁移到Git所导致的学习成本。
3. Netbeans安装git插件
同样,在Netbeans中配置Git插件,也能让日常的使用更加方便。官方文档
四、新建/克隆一个项目
安装完Git,“是时候表演真正的技术了~”😊
-
创建一个新的库(git init)
场景:如果我自己捣鼓了一个小项目,代码还没有版本管理,想使用git管理起来该如何操作呢?
git bash命令行操作:
1. 在需要管理的代码目录中呼出命令行工具--右键选择"git bash here"
2. 执行`git init`即可
TortoiseGit操作:
- 在需要管理的代码目录中右键,选择"Git create repository here ...",然后按照提示操作即可。
执行完以上操作后,该目录就成为了一个git库,目录下的代码就能被git管理了~
开始愉快的add、commit吧!😁
-
克隆一个库(git clone)
一般情况下,公司项目的代码已经被Git管理起来了,我们需要做的只是把已有代码下载下来使用就好了。这里需要到git 的clone命令。
clone含义:顾名思义,clone就是将远程的代码库克隆到本地。这样你本地就有一个和服务器一样一样的git库了,并且也建立了与中心的连接,可以push代码到服务器了。
clone操作和SVN的checkout命令比较类似,都是将服务器的代码下载到本地,只不过Git是拷贝了整个库。
TortoiseGit操作:
1、获取服务器的clone地址
2、在本地目录右键,选择 ”git clone“,按照提示操作即可
五、常用操作(提交、更新、切换分支)
1. 提交代码
命令行操作:
Git提交代码的完整流程为:
1、git add 需要提交的文件 #将需要提交的内容添加到缓存区
2、git commit #提交到本地库
3、git push #推送到远程服务器,让其他人也能同步
Git提交代码与SVN的显著区别是多了两步操作。
TortoiseGit操作:
TortoiseGit对git的提交进行了二次封装,应该是将add操作影藏掉了,所以看起来与SVN提交并无二异。
所以在提交时只需右键点击”commit to master..“, 然后在提交前选择commit 或者 commit&push即可。
前者表示仅提交到本地库,后者表示提交到本地库并推送到服务器。
具体可参看下图:
小乌龟提交代码
官方解释如下:
The main button Commit has a drop-down menu. There are the options ReCommit and Commit & push. The option ReCommit commits your changes and leaves the Commit dialog open, so that you can continue committing. The last option Commit & push will commit your changes and immediately push your changes. If no remote tracking branch is configured for the current active branch, the push dialolg (cf. the section called “Push”) is opened.
2. 更新代码
SVN中更新代码方式为update,而git中叫做pull。
pull操作实际包含两个动作:fatch + merge。
fatch会先从服务器上获取最新的内容,然后merge到本地分支上。
需要注意的是,无论使用小乌龟提交还是更新,都必须等待进度条走完,并且最后弹出success才算成功。
3. 切换分支
命令行操作:
创建分支:git branche name
切换分支:git checkout name
TortoiseGit操作:
右键选择Switch/Checkout,即可切换分支。
下拉框里面显示有本地分支,以及远程分支。
注意:
切换分支前要确保当前分支上没有修改,不然切换分支过程中可能失败。
本地首次切换一个分支时,会创建本地分支。下次就能直接用。
六、其它推荐掌握的操作
1. 暂存修改
有时候在切换分支/更新脚本时,会提示本地存在未提交的内容,需要先提交后才能切换分支。若此时不想提交,而又想切换分支,可以使用pop save功能。
执行【pop Save】会将本地所有的修改存到缓存区,同时将脚本还原到未修改的状态。此时就可以切换分支、更新脚本了。
若要还原刚才缓存的部分修改,再执行一下 【Stash Pop】功能即可还原之前缓存的部分修改。
2. 修改/合并上次的提交
Git提供了一个命令可以修改最近的一次提交--amend。在提交窗体中勾选 amend即可。
使用场景:如果一次提交少了某个文件,或者某个文件提交有问题。
使用amend命令可以直接对最近的一次提交进行修改,相当于给你一次机会重新提交,代码与log信息都能重新编辑。使用amend后log记录仍然显示为一条,而不是两条。
3. 还原修改
与SVN类似,直接使用revert即可。
但有时候会出现revert失败的情况,此时可以打开git的log,然后选中最后一个提交,右键选择【reset *** to this】,一般这个命令不会出错。
4. 提交空文件夹
Git不支持提交空文件夹。如果需要提交空目录,可以在里面放置一个无用的文本文件。
或者按照网上的教程,在里面添加一个.ignore文件。详情度娘。