git网上的资料非常多,本文只希望能提供一个简单直观的使用教程,可能不严谨。
如果本文有任何问题,请及时指正。
git简介
本章介绍git的基本概念,了解git就可以跳过。
什么是git?
git是一个分布式版本控制系统
分布式:代码仓库分本地仓库和远程仓库
版本控制:可以保存历史版本
什么是仓库?
git版本控制的文件夹
简单地说git版本控制控制的是一个文件夹里的所有文件(除.gitignore排除的)
每个仓库里都有一个.git文件夹,历史版本存在这个文件夹中(.git中还有一些别的信息)
分布式?
和分布式对立的是中心化
除git外还有很多版本控制软件,很多是中心管理的
它们的本质区别就在于历史版本信息储存的位置
分布式管理:无论是本地仓库还是远程仓库都有历史版本的信息
中心管理:历史版本信息只存在一个地方(一般是服务器)
分布式的好处?
可能有些人会问,代码为什么要本地和远程都存,不浪费空间?
讲个经历:之前做一个团队项目,需要多人协同,正好来了个新人,他是git初学者。因为不熟练,一顿高级操作,然后发现push不上远程仓库,某度查到要git push -force,然后高兴地继续写他的代码……
不要效仿! 不要效仿! 不要效仿!
熟悉git操作的读者会觉得好笑,但这种事情我是碰到过几回了ㄟ( ▔, ▔ )ㄏ
如果没有看懂也不要紧,看完本文再回头看看这个故事应该会有更多体会。
言归正传,git的分布式的一个非常直观的好处就是代码在多个地方都有备份。
如果有团队成员对服务器仓库做了一些“高级”操作,或者服务器出了问题,那历史版本就直接没有了,这显然不是我们想要的,分布式管理有效避免了这个问题。
此外,git的分支管理也是分布式能成功的关键。
虽然大多版本控制软件都有分支管理,但git的分支管理是较高效的。
版本控制?
说个经历:一次在改代码,要替换一个变量名。全文替换(没开全字匹配),然后编译不通了。撤回最多20次,回不到之前的版本,那重做修改,也回不到新的版本(编辑器的问题),然后代码彻底废了。那个时候还没有分文件写代码的习惯。所以整个工程重写o(TヘTo)
总结:版本控制很重要,因为可能需要回退到某个历史版本
git支持在保存各分支的版本
分支管理?
分支管理是git的一个重要的功能
举个最简单的例子:(例子重要,最好仔细看)
一个代码仓库三人共用,其中有一行:
This is a test
A改写:This is a big test
B改写:This is a middle test
C改写:This is a small test
他们正巧同时提交
那git怎么办?服务器端代码是This is a test,这三个都要修改同一个地方,这就是冲突
git显然无法自动处理(如果自动处理可能变成This is a big teststt),那需要把三个人的修改都发给每个人吗?可以,但不好。
所以git的正常用法是每人建一个分支,上传前拉取主分支上的代码,在自己的分支上合并主分支上的代码,处理完冲突后再上传。那同时怎么办?其实不存在同时的说法,物理上一定会有一个上传先到达服务器,所以git先接受那个上传,然后提示其它人冲突,然后由其它人解决冲突。
如果没有分支管理,怎么拉取远程的代码,代码和本地冲突,拉取的代码存什么地方?有了分支,代码只要存在另一条分支。
至此,对git的简单介绍结束了,在理解了上面的例子后应该对下文的操作会有更深的理解。
git多人协同流程
git多人协同管理代码的流程是:
人:修改代码(1)->提交到本地分支B(2)->拉取远程分支A(3)->合并分支AB(4)->提交到远程分支A(5)
本地仓库:本地分支B接收提交(2)->拉取远程分支A并尝试合并到本地分支A(3)->合并本地分支AB(4)->提交分支A(5)
远程仓库:传出分支A(3)->接收分支A(5)->尝试合并接收的分支A和自己的分支A(6)
重点:
- 无论是本地仓库还是远程仓库,接收到分支时都要合本地同名分支合并
- 分支合并需要处理冲突(可能没有冲突)
看到这里可能有个疑问,本地仓库和远程仓库有什么区别?
没有区别
(结构有区别,远程只有历史版本记录,相当于本地的.git文件夹) 这不重要
分布式管理中,本地仓库和远程仓库都是仓库,所以处理方式是一样的。
总结
git多人协同流程是先管理本地仓库,再合并远程仓库,最后提交仓库。
git本地仓库管理
git本地仓库的功能就是接收提交、拉取远程分支、合并分支、接交分支
拉取远程分支、合并分支、接交分支都与远程仓库有关,所以如果只需要管理本地仓库,就只要接收提交、版本控制
提交
git add *
git commit -m "This is a commit"
简单地说就是两句话,或者说一句话
git commit -a -m "This is a commit"
解释一下git add *
将所有修改提交到缓存。*
可以是文件路径,那就是指定提交哪些文件的修改(如果没有修改不提交)。
git commit -m
是将缓存提交到仓库,并配上一段字符串。
git commit -a -m
就是将所有修改提交到仓库,并配上一段字符串。
版本控制
这里只说回退
git reset 哈希值
哈希值是一次提交的签名,可以通过git log
查看
回退后所有代码会回去过去的状态。
分支管理
创建分支A
git branch A
切换到分支A
git checkout A
查看所有分支
git branch
合并A分支到当前分支
git merge A
删除分支A
git branch -d A
冲突
git merge A
合并分支的时候常常碰到冲突
对文本文件,git会加上类似<<<<<<< HEAD
、>>>>>>> test-branch
的标记:
<<<<<<< HEAD
This is a small test
=======
This is a big test
>>>>>>> test-branch
这时候由修改者决定要怎么修改,最后删掉全部的<<<<<<< HEAD
、>>>>>>> test-branch
,只留想要的东西,比如我只想要This is a big test,那我应该改为:
This is a big test
其它的4行全删除。
对二进制文件,没有办法,只能保留一个。所以类似.docx的文件都不建议用git维护,但可以通过插件解决。
方法:
git checkout FILE --ours [ --theirs ]
–ours保留当前分支文件,–theirs保留合并分支的文件
git远程仓库管理
拉取(克隆)远程仓库
git clone 地址
拉取远程分支(和当前分支同名的分支)
git pull
上传(推)到远程(和当前分支同名的分支)
git push
最简单并不易出错的使用方法
git checkout 我的分支
git commit -a -m "This is a test"
git checkout master
git pull
git checkout 我的分支
git merge master
git checkout master
git merge 我的分支
git push
如果认真看完本文章应该对git有一些理解了,可以再回想一下git简介->分布式中的那个经历,是不是能理解了呢?
是不是也理解了分支管理的意义呢?
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)