版本管理工具应该是每个程序员必备的。 我接触git有一年多的时间了,在期间也踩过无数的坑,做过无数的傻事。 同时,也有一些的小朋友经常问我一些基本的git使用方法,而市面上一些git教程要么不是太精细了,要么就是片断的知识,难以形成完整的知识体系。 我这里知识做一个基本的入门讲解,后续会跟上写一些进阶。 如有纰漏希望大家不吝指出。
git的历史
话说在很久很久以前。。。
未完待续~
大家自行google吧。
为什么使用git
其实,一开始笨宝宝并不想使用git。是因为组长要求学习,然后就逼不得已学了下(当时很菜)。 但没想到的是,这一段的学习真的省了我很多的功夫,让我后面少了很多时间再额外的学习git. 我们通常使用git主要是对于代码版本的更新。 比如,你写了一个轮播,一开始只是很简单的那种,只有图片的切换。但后面你的leader需要你加几个功能,在没有git的情况下,当然没什么问题啦,直接加。 但后来你的leader觉得这个功能是个鸡肋,决定cut掉。 呵呵,你的下场就是慢慢的去删你改动的代码吧。 但是如果你使用了git,只需要回退版本就over. 这就是git的部分功能吧,当然git的功能真的很多,待我慢慢介绍。
git基本原理
先说一下git的分工吧。
首先git分为这4个部分:
1. workspace: 工作区
2. Index/ Storage: 暂存区
3. repository: 仓库区(就是你的本地文件夹)
4. remote: 远程仓库
所有我们涉及git的命令都是围绕着这4个命令。仓库区就是你在本地建的文件夹,以.git为根目录的所有文件构成你的仓库区。 remote就是你放在远程仓库备份文件。 而Index/Storage和workspace等介绍完add和commit命令之后再说。
git新建仓库
我们要做的第一件事就是无中生有,首先建一个git仓库,这里其实有两种方法,一种是使用git init ,另外一种是使用clone。我们分开讲解。
(本人倾向于直接clone,因为。。。简单啊!!!)
使用git init创建git仓库.
git init; //创建一个.git文件
这样就算你已经创建了一个git仓库了。
或者,更直接的,创建一个文件夹,该文件夹会直接放入.git
git init myGit;
可以ls -a查看,会发现多出来的.git文件。
不过说实话,这样做对于实际项目来说并没有什么卵用,因为你的项目要不就是放在github上,要不就是自己搭建的gitlab里面。 这样做的话,你还需要将你的项目在放过去,特麻烦,比较直接的办法就是直接使用第二种方法克隆。
使用clone创建的你的仓库
首先在远程创建的你仓库,比如在github上面。我这里以一个实例来介绍吧。
打开你的github账号,然后新建一个仓库。
然后,你就已经创建了一个仓库~
你会看见一下界面
复制一下地址就可以了。
然后回到本地,在你想克隆的文件夹下,打开你的terminator。使用一下命令:
git clone https://github.com/xxxxx;
clone后面跟你的仓库地址就可以了。
到这里你的仓库就已经建好了。
现在我们要开始写项目了,所以就会涉及到版本的更新和回退。
提交版本
这里提交版本就那几个命令,但是,它还有一起其他的附加功能。
首先,我们如果想提交的话,需要告诉,仓库--who am I?
即,需要使用git config设置你的身份信息. 因为Commit信息栏需要你的信息。我们通常只需要设置我们的名字和邮箱即可。 格式为:
git config user.name "jimmy"
git config user.email "[email protected]"
当然,这个设置只针对于你当前的git仓库,如果你想一劳永逸的话,只需要在哪里加上。 --global 参数即可。
git config --global user.name "jimmy"
git config --global user.email "[email protected]"
这个就会在全局中设置你的基本信息,以后clone仓库后既不需要配置你的name & email。
然后我们就可以正式的提交文件了。 这里有个点需要注意。 你创建仓库的时候回默认创建 一个主分支即origin master 分支。我们先偷个懒,不涉及其他分支。
当你,修改完文件之后,使用一下命令:
git add .; //添加所有文件到暂存区
git commit -m"xxx"; //添加改动文件到工作区
git push origin master; //提交到远程仓库
//此时这里会要求你输账号和密码,就是你github的账号和密码啦
如果你账户和密码输入正确那么恭喜你已经成功了。
好,现在来说一下详细语法
git add之暂存区相关
git add 是将本地文件放到暂存区,后面表示你要添加的文件。
git add a.js
如果,你想全部添加(这应该是应用最多的),你可以使用
git add .;
//或者
git add -A;
这两个命令都是一样的效果。
为了查看我们提交缓存的效果,我们可以使用git status来查看,还有哪些文件没有添加。
git status;
如果有的话,他会输出这样的信息。
嫌信息太多,没事,我们可以在后面加一个 "-s"(simple)参数,来简化输出信息。
git status -s;
好了,查看完毕,如果有没有添加的我们在git add .一遍就over了。
对了,忘了说了,git status只针对文件层面的,即,他不会深入的去管你是否某个文件内容的改动。 所以,单单使用git status -s; 不能完全的检查出信息(老子早就想吐槽了,tm就不能用一个命令吗?)。 git diff就是用来检测是否存在还未放在暂存区的改动文件。
git diff;
如果有的话,你会看见以下相似的内容。
“+++”就是表示有改动文件。
当然git diff还有其他的参数,--cached,--stat... 我艹,我特么就没怎么用。 而且这些理解起来都是有害无益的,回过头来,你可能连git diff都忘记是干什么的啦。 所以,推荐,只需要掌握git diff和git status -s来查看文件信息即可。
git commit之工作区相关
git add . 已经把文件放到暂存区了,那么我们还需要将暂存区文件放到工作区,这样才可以放到远端。使用的命令就是:
git commit -m "xxx"
其中-m “xxx” 是用来表示添加的注释,这个其实非常重要,想想你的老板让你删功能的表情吧,我觉得你每次写注释的时候,还是尽量写清楚。 不要这样 -m "asdfdsf" 或者 -m "123123"; (卧槽,保证你后你会找哭的).
git reset 放弃暂存
这种情况一般用在... 其实,我也不知道什么时候会用它。 他的主要的作用就是 将暂存区的文件给你清除,防止你把他给commit. 如果你已经使用了commit. 这个reset就没有什么卵用了。
最经常的使用就是使用
git reset HEAD -- filename
将你已放入暂存区的文件移除。
ex:
git reset HEAD -- fuck.js
git commit -m "no-fuck "
这样fuck.js就不会和"no-fuck"版本一起提交了。
git rm 彻底弃疗
这就是git让你傻逼的另外的一个命令。 他和reset是一样的效果,都会删除暂存区文件。 但是,有个区别是,reset是把文件恢复到我们没有add之前的状态,而rm会彻底的删除该文件。(算了,请不要回头看了,太揪心了)。 其实,我们使用它的时候,主要是他有这样一个特性。
即,他会在移除暂存区的同时删除该文件(永久删除!!!). 就是防止你万一把文件删除了,但是你却呵呵的以为他真的删除了(其实暂存区还有),然后直接commit了。对不起,我宣布你的死亡。 这时候,远端的文件却还在,而你却没了。这是引起撕逼的一大起因,因为后台那边有bug而你这里没有(呵呵呵~). 所以,如果你想删除文件的话,请使用git rm filename;
git rm b.js
完美加分。
git push 提交你的杰作
开篇已经说过了,使用
git add . ;
git commit -m"xx";
git push origin master;
完成一个版本的提交(其他的都是辅助). 最后我们来看一下git push. 这个命令的操作,是从工作区,将你的文件上传的remote仓库。使用的基本方法就是:
git push origin branchName
在git push 后面加上你要提交的分支名。 不过通常都是origin master.(我们这里还没有涉及到分支)。
另外如果闲太麻烦了,可以省略branchName直接提交
git push origin
这样做的效果取决于你选择的提交模式。一种是simple,一种是mathcing. 如果为simple的话,则会直接提交当前分支名。 如果为matching的话,则会提交当前仓库下所有的分支。
//选择matching模式
$ git config --global push.default matching
# 或者
//选择simple模式
$ git config --global push.default simple
ok~ 另外,更懒的方式就是使用
git push
这样,也可以做到提交分支,但前提是你的远程仓库只有一个。
好~ 现在我们已经基本学会创建仓库,add,commit,提交。 这一系列的提交过程。但是我们不能光交不取呀。 如果,后台也更新了,这时候我们就需要重新更新一遍(pull).
这里来说一下,拉取系列命令:
git fetch repositoryName branchName
git merge repositoryName branchName
fetch是从remote拉取更新数据到本地,merge是合并更新数据。 不过,这个使用度并不高(本人的频率). 我通常喜欢的命令是
git pull repositoryName branchName
也就是说pull 相当于 fetch + merge. 虽然很多地方说分开好,分开好,这样更清晰,没错,显示的信息是比直接使用pull多一点。 但是,使用了这么多次的pull我也没见我的仓库出什么bug. 相反,我觉得这样符合我懒的个性。 这里,只是个人观点,如果大家有不同的看法,这当然更好。
这里,还有一个更简便的方法,如果你想更新的是该仓库下的所有分支,那么可以不加branchName
git pull repositoryName
//实例
git pull origin
然后,他会将远端上各个分支的更新信息加载过来,并执行merge操作。
恩,到这,git基本操作也讲解完成了。这只是git最基本的使用,我们还未讲解他真正的功能,比如,branch操作,版本回退,远端库的操作等等。 但一切复杂的事情都是由简单组合起来的,这里仅仅只是叫你一个人用git。下一篇,我会对分支的操作,多人协作进行简单的介绍。最后再说一句: 最好的学习方法就是实践。
ending~