Git使用心得
一 Git是什么
Git是目前世界上最先进的分布式版本控制系统。
工作原理 / 流程:
- Workspace:工作区
- Index / Stage:暂存区
- Repository:仓库区(或本地仓库)
- Remote:远程仓库
二 Git与SVN区别
SVN是集中式版本控制系统,版本库是集中放在中央服务器的,而干活的时候,用的都是自己的电脑,所以首先要从中央服务器哪里得到最新的版本,然后干活,干完后,需要把自己做完的活推送到中央服务器。集中式版本控制系统是必须联网才能工作,如果在局域网还可以,带宽够大,速度够快,如果在互联网下,如果网速慢的话,就纳闷了。
Git是分布式版本控制系统,那么它就没有中央服务器的,每个人的电脑就是一个完整的版本库,这样,工作的时候就不需要联网了,因为版本都是在自己的电脑上。既然每个人的电脑都有一个完整的版本库,那多个人如何协作呢?比如说自己在电脑上改了文件A,其他人也在电脑上改了文件A,这时,你们两之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。
三 Git操作
1 创建版本库
这里我在windows下操作,先下载git一步步安装即可,这里我已经安装好了就不展示,简单在桌面创建一个空文件夹repo,实验结束删除。
通过git bash打开控制台,使用命令 git init 把这个目录变成git可以管理的仓库,如下:
这时候当前目录下会多了一个.git的目录,这个目录是Git来跟踪管理版本的,没事千万不要手动乱改这个目录里面的文件,否则,会把git仓库给破坏了。如下:
我在版本库目录下新建一个记事本文件 readme.txt 内容如下:operation_11
第一步:使用命令 git add readme.txt添加到暂存区里面去。即将readme.txt文件交给git去管理(监控文件改变),此时还未将readme.txt文件加入到版本库
第二步:用命令 git commit告诉Git,把文件提交到仓库,生产第一代的版本库
现在我们已经提交了一个readme.txt文件了,我们下面可以通过命令git status来查看是否文件在第一代的版本上有修改,这里是没有
说明没有任何文件未提交,但是我现在继续来改下readme.txt内容,比如我在下面添加一行operation_22,继续使用git status来查看下结果
上面的命令告诉我们 readme.txt文件已被修改,但是未被提交的修改。即未添加到版本控制里面
git diff readme.txt 查看文件变化得地方
我们继续将文件提交到版本库,交给git帮我们管理
下面我们在在文件中添加operation_33添加到版本控制中,
git log –-pretty=oneline 来查看已有的版本,这里我们看到三次提交
那么当我们不想要readme.txt文件中含有operation_33时,我们需要使用到版本回退
git reset --hard 版本id 跳到指定的版本,这里我们跳到第二个版本,并查看版本
我们已经到第二个版本里面,且readme文件里面有没有了operation_33
那么此我们又想回到第三个版本怎么办
使用git log --pretty=oneline 产看不到第三个版本的id号,我们需要使用git reflog 获取版本号,并将版本切换到第三个版本,此时readme文件里面的operation_33又回来了
2 工作区与暂存区的区别
工作区即我们使用git init命令初始化的文件夹,我们可以在里面进行各种操作,我们通过git add将文件添加到暂存区,使用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支上,这里只有一个分支master,工作中我们会有很多的分支,debug,dev,master,product等分支
3 Git撤销修改
比如我在readme文件中添加一个operation_44,但还未提交,此时我想将版本回退怎么办
方法一:直接去手动删除
方法二:git reset --hard HEAD 版本号 直接回退
方法三:git checkout -- readme.txt
注意:当我们没有将使用add命令将文件添加到暂存区的时候,我们直接回退到与版本库一致,当我们使用add后再进行修改我们回退到与add后的内容
4 远程仓库:
我们这里使用码云(速度快),这里我们注册好后设置ssh密钥,这样提交的时候就不用输入密码了,这里我们已近设置好了,就直接拿来用。
我们在码云上面,新建一个仓库。然后将本地库与远程仓库进行关联使用如下命令
git remote add origin https://gitee.com/qz_zhang05/repo
然后使用push命令将本地当前分支推送到远端的master分支,因为我这里创建的远程仓库是空的,不需要先拉去直接push成功
git push -u origin master
然后我们去码云仓库看即可看到本地内容同步完成
这时候我们在本地的仓库就可以向远端仓库推送了
我们如何从码云上拉取项目?在我们有权限的时候,直接使用
git clone 码云地址
我们在本地桌面新建文件夹test 并在里面打开git bash 控制台 使用git clone https://gitee.com/qz_zhang05/repo.git 即可拉取
5 分支:
git中我们可以有多个分支,head指向当前分支
git checkout -b 分支名, 新建分支并将head切换到该分支
git branch 查看所有分支
git checkout 分支名 切换分支
当前分支为dev 标识为绿色,前面有星号。
我们在dev分支上readme文件中添加 operation_44 并提交版本控制
再切换回master分支使用cat查看readme文件可以发现是没有operation_44的
此时我们想将dev分支内容与master分支合并怎么办?
git merge dev 当前分支合并dev
使用cat查看readme文件,可以发现operation_44
合并完成我们可以删除dev分支了
git branch -d dev
查看分支
git branch
但是合并分支不总是一帆风顺,如果出现冲突怎么办?
我们新建分支dev并在readme上面添加operation_55 提交版本控制
回到master分支再readme文件上面田间operation_66提交版本控制
现在我们在master分支上合并dev分支
Git用<<<<<<<,=======,>>>>>>>标记出不同分支的内容,其中<<<HEAD是指主分支修改的内容,>>>>>dev 是指dev上修改的内容,
我们将冲突部分的内容进行修改,并重新add,提交版本即可解决冲突
6 多人协作
当我们从远程仓库克隆的时候本实验中git将远程的master分支拉取下拉并与本地master分支相关联
远程仓库的默认名是origin
要查看远程库的信息 使用 git remote
要查看远程库的详细信息 使用 git remote –v
推送分支
git push origin 分支
将本地的当前分支(可以是master,dev等等),推送到远端的分支上面(这里的分支也可以是不同的分支)
我这里直接推送到master分支上面了
注意:团队合作时推送前一定要先拉去,否则会推送失败,如果有冲突,需要先合并冲突再重新推送
我们去码云看看,发现已经成功push上去了,文件内容也和本地一致了
注意:我们可以将本地的master分支,push到远端的未创建分支的。
团队和做我们最需要解决的问题是冲突,我们下面模拟解决冲突。
这里我们用自己的账号,在不同文件夹里面拉取项目并作修改后push到远程仓库,操作如下
此时我们取码云上面查看项目内容
可以看到已经同步上来了,此时我们在原来的项目桌面的repo文件夹中,修改代码并将代码提交版本库
接下来我们进行版本推送到远端仓库,由于会存在冲突我们需要先将远端仓库的内容拉去下来,在本地将冲突解决后再进行推送
注意:在实际开发中我们,在push前要养成先pull的习惯。
这里我们可以发现出现了冲突需要我们去手动解决我们去看看readme文件
我们在本地将冲突解决并提交新的版本,
此时我们再进行push
发现我们的push成功
我们再去码云看看
我们发现代码也成功push上来
至此我们可以在企业中进行实际的开发了,企业一般使用idea等继承工具,能更快捷,方便的尽心git的管理,
7 补充:
我们实际项目中会有许多的文件不需要push到远端的仓库,比如字节码文件等等,我们可以在git中添加.gitignore文件进行忽略,被忽略的文件在push时候就不会上传到远端仓库
忽略文件写法简单我们就不在这里进行展示了。
四 总结:
套用网上的一组图对git常用命令进行一个总结,git还有很多其他命令,但我们不知道的时候就去查,需要多使用才能熟悉