如何优雅的从SVN转到GIT
一、对于一个开发人员来说,不管你之前用的时SVN又或者时其他的版本管理工具,我想你一定知道又Git这样个分布式的管理工具,没吃过猪肉还没见过猪跑嘛!但是由于公司原因,很有可能出现某些开发人员只用过SVN而没有去真正的在生产环境下去使用过git,换工作的时候,新公司用Git导致无法快速的进入正常工作状态(当然这写对于一些老友条来说完全不存在的!!),那么今天就来分享下,如何优雅的从SVN转换到Git开发,本人目前在搞android开发,所以暂时说android的。
我们要理解后面的某些命令我们就先大概对几个概念有个印象:
1、工作区
工作区其实就是我们当前修改、创建、删除的文件保存的地方
2、缓存区
所谓的缓存区,其实就是我们将工作区的内容通过git add命令所提交到的地方
3、本地版本库
本地版本库其实就是一个完整的版本库,这个当我们使用git commit命令之后,缓存区的内容才会进入本地版本库,这里要搞清楚的是,commit之后还不是提交到远程库的。
4、远程版本库
远程版本库就是我们的服务器那里了,当我们执行了git push命令之后,本地版本库的内容才会提交到远程版本库的。
二、Git的安装与配置
在这里我们介绍Ubuntu上Git的安装,虽然Git的安装在Windows下是有一些差异,但是安装完成后使用就跟Ubuntu下时一致的了,所以我们接下来进入Ubuntu的安装过程
1、安装命令
sudo apt-get install git
2、配置身份标识
git config –global user.name “your name” //配置用户名
git config –global user.email “your email” //配置email
其实这两项配置可以随笔定义,只要能标识你的身法即可,这个只是方便后续提交代码的时候能在远程版本库中分辨哪个版本时谁提交的而已,并不指定有意义的用户名跟邮箱,只是习惯性这样配置而已!
三、简单的安装以及配置完成之后,我们就可以去拉取远程仓库的代码了
首先,我们刚开始去到公司,先注册公司代码管理平台帐号密码(我们公司用的是GitLab),登录上去之后能看到属于自己的项目,我们用ssh的方式去将代码clone下来,别紧张,还有些事要做呢,我们使用ssh的使用时要ssh_key的,否则会提示没有权限的。
1、生成ssh_key
在Ubuntu下使用命令:ssh-****** -t rsa -C "email”,然后一直enter完成后就可以生成ssh_key了,至于这里的email并不需要太过在意,随意点就行,当然我们默认都用自己的邮箱而已。命令执行完成后会在目录/home/xxxx/.ssh目录下生成对应的文件(xxx表示Linux当前用户目录),在其中我们能看到一个id_rsa.pub文件如下

复制文件中所有内容,然后去到GitLab平台下登录打开Settings--->SSH Keys,创建一个ssh_key,如下:

2、clone命令
好了,完成这些步骤我们就可以真正的clone代码了,假如项目的URL为[email protected]:ruanwenjiang/ETCdemo.git,那么我们可以通过下面的命令拉取代码了:
git clone [email protected]:ruanwenjiang/ETCdemo.git
出现下面的提示,时就ok了,

这里有一个问题要提下,就是我们很多人在使用Linux系统的时候习惯了用sudo,那么当我们创建一个准备用于clone项目的目录时,如果使用了sudo,那么clone的时候一直会提示输入密码的,权限问题!!!
3、选择分支
有的小伙伴一看到代码下来了,就哗啦哗啦的开始撸代码了,其实不用着急,这个时候你clone下来的代码仅仅时master分支而已,很多公司都会新建一条开发分支专门用于开发用的,比如说dev分支,我们不妨使用git branch -a命令查看下远程库都有哪些分支:

这里我们可以看出,时又一个develop分支的(至于开发分支时哪条,自然有人会告诉你),我们这里假设develop就是开发分支,那么我们用下马的命令去把该分支拉取下来即可:
git checkout develop

图中我们可以看出,我们本地已经生成了一个跟服务器一模一样的分支了!这样我们就可以切换到该分支快乐的开发了!
四、上面只是其中一种情况,那么假如服务器上没有代码,老大需要我们自己撸一个项目提交上去呢?这个时候只是多了一些操作!
1、首先我们先在GitLab上面新建一个工程,当然工程什么都没有如图:

*.iml
*/*.iml
*.jks
gradle/
*/.idea/
.idea/
.gradle
build/
*/build/
如无意外,项目就提交上去了,至于上面用到的几个命令git add,git commit,git push是什么意思,后面补充说明!
五、git常用命令
1、git add 文件名
这个命令是将工作区的文件提交到缓冲缓冲区的,当然如果我们加上-A这个参数,表示提交所有工作区的文件
2、git commit -m "注释"
这个命令是将缓冲区的文件提交到本地版本库
3、git push
这个命令时将本地本版库当前分支与远程本版库对应分支的差异代码提交到远程版本库,执行git push命令之前最好先pull一下,避免冲突问题的出现
4、git status
该命令时会返回当前版本库的工作区以及缓冲区的状态,比如说哪些文件被修改、添加、删除,又有哪些文件没有提交等等信息
5、git diff 文件名
该命令会返回对应文件跟版本库的差异
6、git log
这个命令会返回当前分支的操作记录,操作记录中包括了实际,操作的注释,commit id等内容
7、git reset --hard HEAD
回退到上一个版本
8、git reset --hard commit id前六位
回退到指定的commit id 的版本
9、git reflog
这个命令也是返回所有commit 记录,跟git log差不多,唯一不同的时他能够返回之前回退过的版本的commit id,开发中有那么一种状况,就是当我们从版本A去到回退到版本B的了,不久之后我们又想回到版本A,但是此时git log 命令是没法找到版本A的commit id号了,这时候我们可以使用git reflog命令了,时光倒流,贼牛逼!
10、git checkout 文件名
这个命令时撤销修改的,注意,这里的撤销针对的时工作区的文件,git checkout命令是无法撤销缓冲区跟本地版本库的内容的!
11、git branch
查看本地版本库又多少个分支,其中分支名签名带星号的时当前所操作的分支
12、git branch dev
创建分支名为dev的新分支
13、git branch -a
加上了-a参数,就会包括远程版本库的分支都会罗列出来
14、git checkout master
切换到master分支
15、git pull
同步远程版本库的代码到本地的当前分支,这个我们要养成习惯,就是在我们push代码的时候最好先做pull的操作
16、git merge 分支名
这个命令时合并分支的命令,当我们在开发分支可发并测试完成之后,我们就需要发布版本了,这个时候我们就可以将我们开发分支的代码合并到master分支了,执行git merge命令之前,我们需要先切到master分支(因为我们将要合并到master),当然执行合并命令的时候我们偶尔会出现合并冲突的问题,下面时README.md文件冲突的提示:
Auto-merging README.md
CONFLICT (content): Merge conflict in README.md
Automatic merge failed; fix conflicts and then commit the result.
这时候莫慌,我们只需要用cat或者gedit打开文件,你会看到冲突的部分会被”<<<<<<<<”,”======”,”>>>>>>>”这样的分号扩起来,我们只需要将这些符号删除,保存退出提交后再次合并就可以了!!!
17、git remote -v
这是查看远程仓库信息的命令,返回结果一般如下:
origin [email protected]:vrius/RemoteLib.git (fetch)
origin [email protected]:vrius/RemoteLib.git (push)
可以看到,括号为fetch的为拉取远程资源的,push为提交的,其中要注意的是origin就是远程仓库的名称,这个名称没更改过的话默认是origin,同时,默认情况下Git一旦关联上远程仓库,就会自动把本地的master分支跟远程仓库的master分支对应起来!
18、git push origin master
前面我们说了,创建一个开发分支直接在远程仓库创建,然后再用git checkout 命令同步下来,其实有点low,我们完全可以在本地创建完成后推送到远程版本库中,就是使用上面的命令其中origin时远程版本库的名称,这个我们可以通过git remote -v命令查看,mater就是我们要推送的分支,当然也可以时其他分支,成功后会返回如下信息:
$ git push origin dev
Counting objects: 15, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (10/10), done.
Writing objects: 100% (15/15), 1.39 KiB | 0 bytes/s, done.
Total 15 (delta 3), reused 0 (delta 0)
remote: Resolving deltas: 100% (3/3), done.
To [email protected]:vrius/RemoteLib.git
1cf826b..258b818 dev -> dev
至此,我们有了这些基础,其实已经可以正常的工作了,只是后期发布项目的时候,还会有个对tag标签的操作!
六、tag标签操作
1、我们之前说过,master是指向commit的,也就是说我们要找到某个版本就需要知道哪个版本的commit id,那么如果有一天你们的应用已经开发到了3.0,而你们老大叫你找出1.0版本的代码给他,那么你是不是懵逼了,master分支上那么commit id,要找多久啊,当然你可以建立一个映射表记录哪个commit id对应哪个版本,但是有更好的办法的,那就是标签,也就是在某个版本的commit处打上标签,这样就可以通过标签快速的定位到该版本了!
2、git tag v1.0 af04fdb
对commit id 前六位为af04fdb的版本打上标签,标签名为v1.0
3、git tag -d v1.0
删除标签
4、git show v1.0
查看对应标签的详细信息
5、git checkout v1.0
这个就是回到v1.0标签对应的commit id的版本了
注意,上面我们对tag的创建都是针对本地的,那么我们该如何将本地的tag推送到远程库呢?
6、git push 远程库名 标签名
推送单个标签
7、git push 远程库名 --tags
推送所有标签
好了,常用的这些应该够用了,祝大家工作愉快!
我们要理解后面的某些命令我们就先大概对几个概念有个印象:
1、工作区
工作区其实就是我们当前修改、创建、删除的文件保存的地方
2、缓存区
所谓的缓存区,其实就是我们将工作区的内容通过git add命令所提交到的地方
3、本地版本库
本地版本库其实就是一个完整的版本库,这个当我们使用git commit命令之后,缓存区的内容才会进入本地版本库,这里要搞清楚的是,commit之后还不是提交到远程库的。
4、远程版本库
远程版本库就是我们的服务器那里了,当我们执行了git push命令之后,本地版本库的内容才会提交到远程版本库的。
二、Git的安装与配置
在这里我们介绍Ubuntu上Git的安装,虽然Git的安装在Windows下是有一些差异,但是安装完成后使用就跟Ubuntu下时一致的了,所以我们接下来进入Ubuntu的安装过程
1、安装命令
sudo apt-get install git
2、配置身份标识
git config –global user.name “your name” //配置用户名
git config –global user.email “your email” //配置email
其实这两项配置可以随笔定义,只要能标识你的身法即可,这个只是方便后续提交代码的时候能在远程版本库中分辨哪个版本时谁提交的而已,并不指定有意义的用户名跟邮箱,只是习惯性这样配置而已!
三、简单的安装以及配置完成之后,我们就可以去拉取远程仓库的代码了
首先,我们刚开始去到公司,先注册公司代码管理平台帐号密码(我们公司用的是GitLab),登录上去之后能看到属于自己的项目,我们用ssh的方式去将代码clone下来,别紧张,还有些事要做呢,我们使用ssh的使用时要ssh_key的,否则会提示没有权限的。
1、生成ssh_key
在Ubuntu下使用命令:ssh-****** -t rsa -C "email”,然后一直enter完成后就可以生成ssh_key了,至于这里的email并不需要太过在意,随意点就行,当然我们默认都用自己的邮箱而已。命令执行完成后会在目录/home/xxxx/.ssh目录下生成对应的文件(xxx表示Linux当前用户目录),在其中我们能看到一个id_rsa.pub文件如下
复制文件中所有内容,然后去到GitLab平台下登录打开Settings--->SSH Keys,创建一个ssh_key,如下:
2、clone命令
好了,完成这些步骤我们就可以真正的clone代码了,假如项目的URL为[email protected]:ruanwenjiang/ETCdemo.git,那么我们可以通过下面的命令拉取代码了:
git clone [email protected]:ruanwenjiang/ETCdemo.git
出现下面的提示,时就ok了,
这里有一个问题要提下,就是我们很多人在使用Linux系统的时候习惯了用sudo,那么当我们创建一个准备用于clone项目的目录时,如果使用了sudo,那么clone的时候一直会提示输入密码的,权限问题!!!
3、选择分支
有的小伙伴一看到代码下来了,就哗啦哗啦的开始撸代码了,其实不用着急,这个时候你clone下来的代码仅仅时master分支而已,很多公司都会新建一条开发分支专门用于开发用的,比如说dev分支,我们不妨使用git branch -a命令查看下远程库都有哪些分支:
这里我们可以看出,时又一个develop分支的(至于开发分支时哪条,自然有人会告诉你),我们这里假设develop就是开发分支,那么我们用下马的命令去把该分支拉取下来即可:
git checkout develop
图中我们可以看出,我们本地已经生成了一个跟服务器一模一样的分支了!这样我们就可以切换到该分支快乐的开发了!
四、上面只是其中一种情况,那么假如服务器上没有代码,老大需要我们自己撸一个项目提交上去呢?这个时候只是多了一些操作!
1、首先我们先在GitLab上面新建一个工程,当然工程什么都没有如图:
创建工程没什么好说的,命名,然后create即可!
2、紧接着切换到我们项目的跟目录下执行如下命令
3、这样你的项目就初始化成了Git仓库了,紧接着执行
git add -A
git commit -m "注释"
这样项目就提交到了本地版本库了
4、创建远程库别名,一般用origin
git remote add origin [email protected]:vrius/Test.git
5、将远程分支跟本地分支关联起来
git branch --set-upstream-to=origin/master master(这里的前一个master是远程分支名,后一个是本地分支名,当然这里的前提时我们先在远程库创建master分支)
如果我们不想在远程库创建master分支,而是想直接推上去得话,直接用下面得命令即可,两种方式都行,看您喜欢:
git push -u origin master
6、提交,一般提交之前建议向pull一下
git push
*.iml
*/*.iml
*.jks
gradle/
*/.idea/
.idea/
.gradle
build/
*/build/
如无意外,项目就提交上去了,至于上面用到的几个命令git add,git commit,git push是什么意思,后面补充说明!
8、至此,问题又回到了分支上面,其实好简单,我们直接在GitLab上面创建一个develop分支,然后通过我们前面讲的git checkout develop命令去同步下来即可!!
到这里我们已经可以进行正常的开发工作了,但是代码写完了又要怎么提交呢?如果出错了又怎么回退版本呢?冲突了怎么办呢?下面我们好好介绍下一些常用的命令!五、git常用命令
1、git add 文件名
这个命令是将工作区的文件提交到缓冲缓冲区的,当然如果我们加上-A这个参数,表示提交所有工作区的文件
2、git commit -m "注释"
这个命令是将缓冲区的文件提交到本地版本库
3、git push
这个命令时将本地本版库当前分支与远程本版库对应分支的差异代码提交到远程版本库,执行git push命令之前最好先pull一下,避免冲突问题的出现
4、git status
该命令时会返回当前版本库的工作区以及缓冲区的状态,比如说哪些文件被修改、添加、删除,又有哪些文件没有提交等等信息
5、git diff 文件名
该命令会返回对应文件跟版本库的差异
6、git log
这个命令会返回当前分支的操作记录,操作记录中包括了实际,操作的注释,commit id等内容
7、git reset --hard HEAD
回退到上一个版本
8、git reset --hard commit id前六位
回退到指定的commit id 的版本
9、git reflog
这个命令也是返回所有commit 记录,跟git log差不多,唯一不同的时他能够返回之前回退过的版本的commit id,开发中有那么一种状况,就是当我们从版本A去到回退到版本B的了,不久之后我们又想回到版本A,但是此时git log 命令是没法找到版本A的commit id号了,这时候我们可以使用git reflog命令了,时光倒流,贼牛逼!
10、git checkout 文件名
这个命令时撤销修改的,注意,这里的撤销针对的时工作区的文件,git checkout命令是无法撤销缓冲区跟本地版本库的内容的!
11、git branch
查看本地版本库又多少个分支,其中分支名签名带星号的时当前所操作的分支
12、git branch dev
创建分支名为dev的新分支
13、git branch -a
加上了-a参数,就会包括远程版本库的分支都会罗列出来
14、git checkout master
切换到master分支
15、git pull
同步远程版本库的代码到本地的当前分支,这个我们要养成习惯,就是在我们push代码的时候最好先做pull的操作
16、git merge 分支名
这个命令时合并分支的命令,当我们在开发分支可发并测试完成之后,我们就需要发布版本了,这个时候我们就可以将我们开发分支的代码合并到master分支了,执行git merge命令之前,我们需要先切到master分支(因为我们将要合并到master),当然执行合并命令的时候我们偶尔会出现合并冲突的问题,下面时README.md文件冲突的提示:
Auto-merging README.md
CONFLICT (content): Merge conflict in README.md
Automatic merge failed; fix conflicts and then commit the result.
这时候莫慌,我们只需要用cat或者gedit打开文件,你会看到冲突的部分会被”<<<<<<<<”,”======”,”>>>>>>>”这样的分号扩起来,我们只需要将这些符号删除,保存退出提交后再次合并就可以了!!!
17、git remote -v
这是查看远程仓库信息的命令,返回结果一般如下:
origin [email protected]:vrius/RemoteLib.git (fetch)
origin [email protected]:vrius/RemoteLib.git (push)
可以看到,括号为fetch的为拉取远程资源的,push为提交的,其中要注意的是origin就是远程仓库的名称,这个名称没更改过的话默认是origin,同时,默认情况下Git一旦关联上远程仓库,就会自动把本地的master分支跟远程仓库的master分支对应起来!
18、git push origin master
前面我们说了,创建一个开发分支直接在远程仓库创建,然后再用git checkout 命令同步下来,其实有点low,我们完全可以在本地创建完成后推送到远程版本库中,就是使用上面的命令其中origin时远程版本库的名称,这个我们可以通过git remote -v命令查看,mater就是我们要推送的分支,当然也可以时其他分支,成功后会返回如下信息:
$ git push origin dev
Counting objects: 15, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (10/10), done.
Writing objects: 100% (15/15), 1.39 KiB | 0 bytes/s, done.
Total 15 (delta 3), reused 0 (delta 0)
remote: Resolving deltas: 100% (3/3), done.
To [email protected]:vrius/RemoteLib.git
1cf826b..258b818 dev -> dev
至此,我们有了这些基础,其实已经可以正常的工作了,只是后期发布项目的时候,还会有个对tag标签的操作!
六、tag标签操作
1、我们之前说过,master是指向commit的,也就是说我们要找到某个版本就需要知道哪个版本的commit id,那么如果有一天你们的应用已经开发到了3.0,而你们老大叫你找出1.0版本的代码给他,那么你是不是懵逼了,master分支上那么commit id,要找多久啊,当然你可以建立一个映射表记录哪个commit id对应哪个版本,但是有更好的办法的,那就是标签,也就是在某个版本的commit处打上标签,这样就可以通过标签快速的定位到该版本了!
2、git tag v1.0 af04fdb
对commit id 前六位为af04fdb的版本打上标签,标签名为v1.0
3、git tag -d v1.0
删除标签
4、git show v1.0
查看对应标签的详细信息
5、git checkout v1.0
这个就是回到v1.0标签对应的commit id的版本了
注意,上面我们对tag的创建都是针对本地的,那么我们该如何将本地的tag推送到远程库呢?
6、git push 远程库名 标签名
推送单个标签
7、git push 远程库名 --tags
推送所有标签
好了,常用的这些应该够用了,祝大家工作愉快!