简介:那个对
Git
的理解,是我用自己的话语结合故事进行阐述,可能理解的不到位,有些错误还请多多包含!说句实话:我就只会用Git
的三板斧(add,commit,push
),对于Git
也只停留在字面上,往后如有更深的领悟也会与各位一同分享
如何理解版本控制(9-0.00.00)
- 这里还是通过讲故事进行阐述。你们班最近要做一个实验,写一份C语言实验报告交给实验室的老师
- 张三写实验报告很积极,不到一天就完成了,蹦蹦跳跳的去找老师评测,老师指出了许多错误并让张三回去仔细修改
- 张三很听话,前前后后找了老师好几次,也修改了很多次。只不过老师最后直接来了一句:张三你这改的实验报告还不如第一次,直接交第一次的实验报告算了
- 张三一听这话人麻了,回到宿舍开始想,第一次的实验报告是怎么写的
- 李四看到了张三的经历,吸取了教训,在每一次改实验报告时都会将原来的那份实验报告备份一份并命名
V1,V2…
,再去修改实验报告 - 其实李四所做的工作就是版本控制
- 写实验报告和写C语言代码是一回事,改实验报告和改C语言代码是一回事,既然能将实验报告多版本控制起来,那也能将C语言程序多版本控制起来
- 为啥要多版本控制起来呢?就是为了应对善变的甲方,比如要张三和李四改实验报告的老师就相当于产品经理/项目经理,张三和李四就相当于程序员
Git 的理解
咱们现在基本上是一个人在单打独斗,而在企业开发中,一个项目需要多个人合作完成,所以就需要一个集中式的工具将所有人写的代码进行各种合并,这就是
Git
所要做的工作
- 故事继续,李四为了帮助全校的同学免受老师的折磨,就在表白墙声称可以在自己电脑上新键
data
目录帮助同学们进行实验报告管理
- 那李四就每天在搞这些事情,这是不是太麻烦了。因为我的电脑只能我自己去访问啊!这样哪个同学想要哪个版本还得给我发微信,我还得将该版本给发过去
- 李四就想那可不可以买一个云服务器了,我在云服务器上去新建同学们的个人仓库,这样每一个同学都能自主地进行访问,下载它们想要的版本
- 李四直接将D盘下
data
目录下仓库文件推送云服务器上,将云服务器上的仓库称为远端仓库
,将李四D盘中的仓库称为本地仓库
- 那现在就又有问题:李四一想,万一我在本地没及时
push
到云服务器上,电脑丢了咋办(数据安全
)? - 而且谁说实验报告只能一个人去写呢?可能10个人都对某一个实验报告感兴趣,想一起写咋办(
协作开发
) - 李四就开发了一款程序
x.exe
,可以直接在本地将实验报告进行管理,再将本地仓库直接push
到云服务器上的远端仓库 - 那李四又想到,我现在开发了程序,也不需要自己去管理了,那只要让同学们下载这个程序,他们自己就能新建本地仓库去管理版本,再推送到远端(
可以保护数据
) - 为了能够更⽅便我们管理这些不同版本的⽂件,便有了
版本控制器
。所谓的版本控制器,就是能让你了解到⼀个⽂件的历史,以及它的发展过程的系统。 - 通俗的讲就是⼀个可以记录⼯程的每⼀次改动和版本迭代的⼀个管理系统,同时也⽅便多⼈协同作业,⽬前最主流的版本控制器就是
Git
Gi
t 可以控制电脑上所有格式的⽂件,例如doc、excel、dwg、dgn、rvt
等等。对于我们开发⼈员来说,Git
最重要的就是可以帮助我们管理软件开发项⽬中的源代码文件
- 其实故事讲到这里
Git
是什么,基本已经很清晰了,Git
就是一个底层版本管理器软件 - 此时可能会有人存在新需求:不只写C语言实验报告啊!可能还要写物理实验报告等其它内容也要进行多版本管理
- 那每一个用户要去建立不同的仓库进行管理不同的内容,那就需要把这些仓库一并推送到远端(
那每一个人都需要在云服务器上登录/注册
),这样才能将用户的多个本地仓库推送到远端的指定用户下 - 那越来越多的用户都有这样的需求,此时这个云服务器就衍生成了一个基于
gitee 或 github
的网站或者平台
这个
git
可以作为客户端使用,也可以作为服务器使用。它能在Window
上运行,也能在云服务器下运行,这样就能让客户端的git
和云服务器上的git
进行数据同步(一个运行在windows
版本,一个运行在Linux
版本,通过这两个git
之间的网络通信,可以实现数据的打包和同步),可以实现下面的需求
Git 的历史
- 同⽣活中的许多伟⼤事物⼀样,
Git
诞⽣于⼀个极富纷争⼤举创新的年代 Linux
内核开源项⽬有着为数众多的参与者,绝⼤多数的Linux
内核维护⼯作都花在了提交补丁和保存归档的繁琐事务上(1991−2002年间)- 到 2002 年,整个项⽬组开始启⽤⼀个专有的分布式版本控制系统
BitKeeper
来管理和维护代码。到了 2005 年,开发BitKeeper
的商业公司同 Linux 内核开源社区的合作关系结束,他们收回了 Linux内核社区免费使⽤BitKeeper
的权⼒ - 这就迫使
Linux
开源社区(特别是Linux
的缔造者Linus Torvalds
)基于使⽤BitKeeper
时的经验教训,开发出⾃⼰的版本系统 - 他们对新的系统制订了若⼲⽬标:速度,简单的设计,对⾮线性开发模式的强⼒⽀持(允许成千上万个并⾏开发的分⽀),完全分布式,有能⼒⾼效管理类似
Linux
内核⼀样的超⼤规模项⽬(速度和数据量) - ⾃诞⽣于 2005 年以来,
Git
⽇臻成熟完善,在⾼度易⽤的同时,仍然保留着初期设定的⽬标。 它的速度⻜快,极其适合管理⼤项⽬,有着令⼈难以置信的⾮线性分⽀管理系统
具体操作和用法
1. 先要去gitee
上新建一个仓库,第一次使用需要在gitee
上注册
2. 复制https
或命令,将远端的仓库拉取到本地
进入该目录仓库
3. 显示出隐藏的本地仓库,重点关注.git
目录与.gitignore
普通文件
tree .git
,在这个目录下会将各版本具体的修改数据保存在特定目录下(一般是objects
目录下)- 假如咱们修改一份代码的源文件,之前是说会对这份源文件拷贝一份作为V1版本,实际上
git
进行多版本控制中,也就是提交的时候,只会提交变化的部分 - 比如说你有100行代码,今天把这第100行代码给删了,并不是将这100行代码和99行代码这两份内容全部保存起来,实际上它只需要去记录删除了100行代码这样的字符串,并且将100行代码也添加到后面
- 这样就将变化的部分给记录下来了,未来你想要去恢复的话,就会将删除更改为添加,反向操作一下就能将代码恢复上来
4. 在该目录下去创建一个普通文件(test.c
),不过该文件并没有被本地仓库管理起来,只有将test.c
添加到本地仓库.git
中,这个时候 git push
才会将该文件推送到远端
那
test.c
文件是如何添加到本地仓库.git
中的呢?可以通过命令:git add test.c
,想要添加某一后缀所有的文件,add
后可以跟通配符 + 文件后缀,比如:*.c
只不过这个
add
添加test.c
也不是直接添加到.git
本地仓库中,而是先添加到一个临时的暂存区中这样做的好处就是:这个暂存区可以多次添加,就可以将多次添加算作一次,提交到
.git
仓库中,就是多次add
,只需要一次提交
如果不想要提交
test.c
这个文件就使用这个命令:git reset HEAD test.c
通过这个命令可看到当前本地仓库所对应的状态:
git status
要将暂存区的文件一次性的提交到
.git
仓库上要使用该命令:git commit -m "新增的两个源文件"
。要带上选项m
,说明提交的日志信息这个日志信息必须填写清楚,你这次提交的核心工作是做了什么,是修正了野指针错误,还是修正异常处理问题,不能随便去胡写,都是有记录的
首次使用:需要
git
输入username, email
(这个可以直接在你gitee
仓库克隆/下载
处复制命令)
通过命令:
git log
,可以去查看提交信息
最后一步输入命令:
git push
,将本地仓库与远端仓库进行同步。这里要特别注意:是输入登录gitee
的账号和密码
5. 如果你一不小心将目录仓库给删除掉,可以重新将远端的文件给拉取下来
6. git
的三板斧(git add,git commit,git push
),再加两个git log
,git status
。从现在开始要到gitee
上进行代码的维护,后面重装系统的时候,就能直接将gitee
上的远端仓库拉取下来,就能直接恢复了本地仓库中的所有文件
补充细节
1. git 命令行的安装
输入命令:
git --version
,能打印出版本信息则说明你已经安装了git
,没安装输入下面的命令即可
sudo yum install git
2. git
进行版本管理,只进行管理源文件(也就是.h,.cpp,.c
文件),其它啥杂七杂八的文件不要拿去管理
3. .gitignore
:需要忽略的特定后缀的文件列表
- 也就是有某些特定后缀的文件如果在
.gitignore
这个配置信息里,那对应的三板斧命令add,commit,push
压根不会搭理这些文件(严格来讲是add
会忽略,只要add
添加到暂存区,就畅通无阻)
- 这里我可以去创建两个文件(
aaa.obj,bbb.txt
)验证一下,去.gitignore
文件中把后缀.txt
给加上(已经存在就不用添加了)
4. 如何将远端仓库拉取到你Windows
本地
你可以在终端进行上面同样的命令行操作,也可以使用
TortoiseGit
这个小乌龟软件进行拉取(这个小乌龟软件后续也会出安装和用法教程)
这样就会存在两个平台
Windows
和Linux
在同一个账号下进行改代码,写代码。可以将这两个平台当作程序员A与程序员B他们两个会将自己写的代码推送到
gitee
的远端仓库,这样就会存在一个问题,另一个提交了(假设这里A提交了代码), B想再去提交的话就提交不了这个程序员B并不知道A提交了,就直接提交,一提就冲突了,是因为B这个本地仓库与远端仓库并没有做一个同步,如果B是
Linux
平台就输入命令:git pull
。同步之后再去push
如果B是
Windows
平台用小乌龟的话,就点击下面的pull
,再重新push
即可
远端仓库相比较于任何人都是最新的,为什么要存在冲突啊?就是为了提醒本地用户,你要和远端仓库进行同步了