我给我讲 GIT,并成功把我得罪了
工作中如何使用 GIT 开发项目?(看到最后更精彩)
注意:如果你熟悉 Linux 操作系统,那么这篇文章阅读速度会加倍
另外:如果你熟悉 SVN,那么 Git 只是一个更高级的版本管理工具而已
But:如果你不熟悉 Linux,也不知道 SVN,那么没关系,至少你使用过云盘来管理你日常的文件。
如果你连云盘都没用过。那么你还是早点回火星吧,地球很危险的。
为啥需要版本管理?
假设:
下周就要做年终工作汇报了,你打算今天把 PPT 做完。
反反复复用了一上午的时间,总算是完成了一半。
中午吃饭的时候,你依然在思考后半部分该怎么完成。
然后你突然间觉得,上午的方案有些问题,还需要再改一改下午 5 点 20 分.....
在你反复阅读自己的方案后, 仍然觉得,还是上午的方案更好
可这个时候麻烦来了
, 上午的方案早就被改的面目全非了
当时写的话术,使用的图片动画等等,都已经被你删除了
想用Ctrl + Z
解决? 可惜 PPT 最多只支持 150 次操作回退,默认设置好像只有 80 次
这个时候,是不是特别想来一瓶后悔药?
朋友,是时候了解一下 X 度云盘会员了。不要 998! 不要 998! ,只要 96 元,就可享受包年服务
好了,刚才是个玩笑 , 但 X 度云盘真的有记录文件版本的功能
因此,我们认为,一个好用的云盘软件,应该具备以下几个功能:
用户 A 和 B 之间能够方便的进行文件共享
用户 A 和 B 可以修改同一个文件,云盘能够及时解决冲突问题
用户 A 对文件的修改提交后会同步给用户 B
所有用户对文件的每一次提交都会有记录保存,操作失误时,可以还原之前的版本
版本管理 , 不正是因此而得名么?
SVN 的优势
在使用 git 之前,你必须了解一下 SVN
说起来,SVN 可是曾经风靡全球的版本管理工具
SVN 软件的使用,确实非常简单
它有两个安装包
第二个安装包是服务器端,也就是说,你可以通过安装这个服务器端的软件,很轻易的在公司内部搭建一个 SVN 服务器
这样大家就可以在公司内网进行文件或是 代码的共享了
程序员在写代码时,经常需要协同开发(多个人维护一个项目)
SVN 带来的方便,自然不言而喻,几乎所有的主流开发工具,都会配有 SVN 的插件
SVN 的具体用法,这里不再详细描述。请读者自行百度
有了 SVN,为什么会出现 Git?
git 这个软件的作者,是大名鼎鼎的 Linus(Linux 系统内核的发明人,编程界神话级的程序员)
不得不说,git 这个软件,在易用性上,跟 SVN 差了不是一个数量级
但毕竟是专门给程序员用的,谁还考虑用户体验??
由于 linus 严重的个人兴趣倾向,他非常不喜欢文件集中式的管理
于是 git 软件打一开始就是分布式的
简单的说:就是任何人都可以向任何人的电脑上提交代码,任何人也可以从任何人的电脑上下载代码,任何人都可以被看作服务器端
再加上 linus 这种崇尚命令行主导一切的思维,git 这个软件,打一开始就没有图形界面
所以使用 git 的时候,特别有种当黑客的感觉,有木有?
尽管,git 率先发明了分支的设计,但是,这糟糕的用户体验,并没能使它在全球范围迅速流行起来,直到 github
的出现.....
git 和 github 是啥关系?
github, 这个被大家戏称为全球最大的同性交友网站
它是如何崛起的呢?
github 网站提供了如下的服务:
你可以到这个网站注册一个账号
通过这个账号,你可以建立自己的仓库
使用你本地的 git 软件将你的代码提交到 github 服务器
如果你的同事也注册了 github 账号,那你可以一键转载分享给他
github 上面的项目都是可以公开分享给其他人看的
我们不提供交友,只能提供代码分享及管理
你可以看到,github 给我们带来了两个巨大的好处
第一
github 让我们似乎又回到了 SVN 的服务器时代,方便。
第二
全世界所有知名的开源代码,都提交到了 github 上面并公开,这样一来,所有人都可以向这个开源项目提交自己的修改建议
它带动了 git 软件的流行,这就是今天你不得不学 git 的原因
git 到底咋用?
首先,下个一个 git 软件 https://git-scm.com/downloads
,并安装
在 github 上,建立一个空的project
建好项目后,会看到项目的地址
现在,把项目的下载地址复制好了
找到一个合适的目录,例如 E 盘,在该目录下点击右键选择git bash here
输入命令 git clone https://github.com/ay8yt/teach.git
项目就会自动下载,这时 E 盘会多出一个teach
目录
好了,你现在可以打开你的开发工具,到这个目录下,编写你的代码了
项目写完了,咋提交呢?
在命令行使用 cd teach
,进入 teach 目录
输入命令: git add -A
, 将所有文件添加至缓存区,准备提交
然后,输入 git commit -m '这里可以做一些描述,本次做了哪些修改'
提交成功!
可能还需要一些准备工作
如果你第一次使用 git,提交时,系统会提示你先设置用户信息,那我们就设置一下:
git config --global user.email "随便邮箱"
git config --global user.name "随便用户名"
另外,由于项目通常是多人开发,你必须建立一个自己的分支
我知道你一定想问
, 啥是分支? 。。。。。这个说来有点话长了
假设张三和李四要共同开发一个项目
虽然,他们俩负责的是不同的模块
但是
,张三的模块如果出了 BUG 或者错误,会导致李四的项目也无法启动
为了避免冲突和互相干扰
张三和李四在开发之前,都把项目进行了一次克隆拷贝
接下来,他们分别在自己克隆的副本上进行修改和提交
接下来,张三就可以在自己的副本上进行修改和提交,和李四不会产生任何冲突
这就是 分支
的概念了
当然,张三的所有操作都是在自己的电脑本地进行的
如果本地电脑出了问题,本地记录的版本依然会全部丢失
所以,张三可以把自己本地的全部版本都推送到远程 github 服务器上
同样,李四也可以把自己本地的全部版本都推送到远程 github 服务器上
这时,我们查看github远程,会发现变成了这样:
这样一来,我们不仅把所有人的版本做了记录,而且整个开发过程中,张三和李四没有任何交集,也不会产生任何冲突
怎么样?有没有感觉这个分支的发明特别的帅气?
尽管 SVN 后来也迅速的推出了分支的功能,但它没有一个像 github 这么流行并统一的服务器。
github 不仅提供了代码的托管,现在已经演变成了全球最大的代码分享社区
并在 2018 年 6 月份,以 75 亿美元的价格,卖给了微软
留给 SVN 的,只有一首《凉凉》
了解了基本原理,还是得学学具体如何使用
第一个我: 哎, 在工作中如何使用 GIT 开发项目?
第二个我: 你就不会说个 hello,你好吗?或者,请问~之类的话吗?
第一个我: 我发现你事儿挺多的!
第二个我: 请 ~ 把你的问题具体化好吗?
第一个我: 那,这位(伪)大神,进入公司后怎么把 gibhub 上新建的项目 down 下来?
第二个我: 请不要称呼我大神,我只是比你强很多,虽然我也有那么一瞬间觉得自己确实是个大神
第一个我: 是哪些瞬间让你误会了自己呢?
第二个我: 喝醉的瞬间,清醒过来就好了! 好了回答你的问题,
如果你还有这样的疑问,显然你没有好好听课,因为上面已经讲过了。
算了,再说一次,下不为例。git clone https://github.com/ay8yt/teach.git
第一个我: 怎么在本地克隆一个副本,也就是创建一个分支?
第二个我: 使用 branch 命令。git branch yintao01
第一个我: 怎么进入这个分支呢?
第二个我: git checkout yintao01
好了,你现在应该能很明显的看到,你已经切换到了自己的分支,接下来的所有操作,都在这个副本上进行。
第一个我: 写了一部分功能,想保存一个版本,怎么做?
第二个我: 第一步,git add -A
, 所有文件提交到缓存区
第一个我: 等等! 我有些文件不想提交,例如 node_modules 文件夹,怎么忽略它?
第二个我: 你要在项目的根目录下,创建一个叫做.gitignore
的文件,内容如下:
第一个我: 可是我刚才已经把不需要的文件提交到缓存区了,怎么撤销?
第二个我: 很简单,重置一下,git reset
,然后就可以提交了。
第一个我: 等等!我想在正式提交之前,先查看一下,都有哪些文件提交到了缓存区?
第二个我: 你 TM 事儿真多!好吧,你可以使用git status
命令查看,都做了哪些改动,以及所有文件的状态。
第一个我: 好了,那正式提交是不是 commit 命令?
第二个我: 没错!使用git commit -m '这里一定要把做了什么修改写清楚'
第一个我: 每次提交一个版本都得写啊? 那多麻烦? 不写清楚行吗?
第二个我: 你可以试试,把你肠子悔青。
第一个我: 刚提交完,就后悔了,感觉提交错了,想撤销这次提交,或覆盖这次提交,怎么做?
第二个我: 版本管理的好处,就是允许你后悔,首先你把错误的内容先修复好
然后再次 add 添加缓存,但这次提交时,注意使用git commit --amend -m '刚才的提交就覆盖了'
第一个我: 我想直接还原到上一个版本,怎么做?
第二个我: 使用git reset head^
第一个我: 我想直接还原到前两个版本,怎么做?
第二个我: 使用git reset head^^
第一个我: 那还原到前 N 个版本呢?
第二个我: git reset head^^^^^^^^^^...
第一个我: 你逗我呢? 这么麻烦?
第二个我: 没开玩笑,就是这样,当然你可以指定版本号直接还原
git reset --hard 7e2ec0f51e9ae2e7cbc7c4deca18b77b242148d6
第一个我: 版本号是个哈希值? 这么长咋记得住?
第二个我: 你可以用git log
查看所有版本
第一个我: 我查了,可是每个版本都改了什么看不到啊,这 aaaaa,bbbb,cccc,dddd 都是什么鬼?
第二个我: 这不都是你自己提交时写的注释么? 不认真写注释的下场就是这样。活该。
另外,任何时候写代码,一定要想清楚了,测试通过了再提交,这是程序员的基本素质。
回滚操作虽然好用,但它不应该成为你的日常命令。如果一个程序员把各种回滚操作用的特别熟
通常表明他的代码水平不怎么样。
第一个我: 我看你用的就挺熟的呀
第二个我: 滚~~~~~~
第一个我: 如果本地我已经测试完并提交了,怎么推送到远程 github 上面?
第二个我: 为了方便做远程推送,通常我们会给远程仓库地址做个快捷方式。
git remote add miaodong https://git.oschina.net/ay8yt/test.git
这个miaodong
就是快捷名称,接下来你提交时,就可以这样写:
git push -u miaodong yintao01
这句话的意思就是把 yintao01 这个分支推送到 miaodong 这个仓库地址
-u
的意思就是把 yintao01 设为默认分支
下次再推送,就可以直接写git push miaodong
第一个我: 我的模块已经开发完成,并测试通过,也推送到了 github 上,怎么把我的分支合并回主分支
第二个我: 在 github 上合并分支非常简单,找到 Pull request,自己看说明去吧
第一个我: 就这?我都会!
第二个我: 有种你别跑!!!
评论