简单git多人协同

2023-05-16

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)

重点

  1. 无论是本地仓库还是远程仓库,接收到分支时都要合本地同名分支合并
  2. 分支合并需要处理冲突(可能没有冲突)

看到这里可能有个疑问,本地仓库和远程仓库有什么区别?
没有区别
(结构有区别,远程只有历史版本记录,相当于本地的.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(使用前将#替换为@)

简单git多人协同 的相关文章

随机推荐