总结:本篇文章从初识GitHub、Git,实践GitHub的五种常用场景,分别是:git for windows安装,git配置,克隆远程代码到本地,上传本地代码到远程以及Git的常用指令。相信James已经尝到了Git的滋味。
Git是什么?是版本控制工具,是协同开发的利器。
“版本控制是一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统;对于软件开发领域来说,版本控制是最重要的一环。”
如何使用呢?首次接触Git时,James认为:大可不必去弄清楚Git的工作原理,只需要熟练掌握Git的几种应用场景即可。
其实James最先了解的是github。一些高端的开源项目都会发布到该平台,James很期待自己也能有所贡献和提高。提到github,主要提供基于git的版本托管服务平台(也就是远程端);Github上托管的所有项目代码都是基于Git来进行版本控制的,但Github的功能远不止于此(其他作用:以公开的方式存放文件,若隐私则需要收费;营销自己---博客或者简历存放等等)。因此,为了将github上的开源代码“克隆”到本地(即:James的电脑),需先在github上注册账号。
场景一:git for windows的安装
从标题即可看出,James使用的开发平台是Windows(具体是:Windows 7;James手上还没有什么银子!经过了半年工作,手上还是没多少钱...)。
git for windows下载:https://git-scm.com/ Windows平台下的最新版本是2.9.0 更新时间:2016/06/13。
相信大伙都精通软件安装,James也一样,一路next即可。
场景二:git相关配置
James暂时还不清楚为什么需要进行配置,但他会baidu和goole。
首当其冲的是:密钥
$ cd ~/.ssh 含义:切换目录到.ssh;~表示根目录,C:UserJames.ssh
没错,James就是使用命令行来进行操作的;James是处女座,内心深处有强烈的危机感(需要搞清楚每一步骤的具体含义和结果)。希望你也喜欢使用命令行!
如果提示:No such file or directory,说明是第一次使用git;也就是还没有生成相应的密钥;如果已经有文件,还会涉及到清理密钥的代码指令。
ssh-keygen -t rsa -C "zfengwust3054@163.com" // 填写注册github时的email
一直回车即可(中途会提示设置passphrase,暂时忽略吧),此时就会生成:C:UsersJames.ssh目录,新增两个文件:id_rsa和id_rsa.pub。
其次,需要本地生成的密钥提供给github(James认为,是一种访问匹配的过程)。
登录github,点击James的图片,点击Setting栏,找到SSH and GPG keys,点击new SSH key,将本地的生成的id_rsa.pub内容复制到key的部分中,执行Add SSH key即可。
经过以上多个步骤,James还需要测试密钥。
$ ssh -T git@github.com
如果提示以下内容时,输入yes即可。
The authenticity of host 'github.com (192.30.252.129)' can't be established. RSA key fingerprint is SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8. Are you sure you want to continue connecting (yes/no)? yes
这个时候就会出现令James欣喜的文字:
Hi ZHANGfeng-james! You've successfully authenticated, but GitHub does not provide shell access.
最后,还需要设置用户信息(不过James还不知道其中的缘由)
$ git config --global user.name "ZHANGfeng-james" // 填写github用户名 $ git config --global user.email "zfengwust3054@163.com" // 填写github注册时的email
场景三:克隆远程代码到本地
James尝试读懂开源框架的源代码,就以xUtils为例(最新的是xUtils3)吧!Search到“星星”数最多的那个xUtils,然后fork即可,相当于复制了一份源代码到自己的仓库中(新建了一个同名的仓库)。
步骤一:在本地新建和仓库名同名的文件目录
$ mkdir ~/xUtils
Linux的常用命令:新建文件夹——mkdir,James相信具有互联网思维的你,知道如何找到这些常用命令。
步骤二:进入到该文件目录,进行清理操作(为什么要清理?)
$ cd ~/xUtils
$ git init
可以看到提示信息:
Initialized empty Git repository in C:/Users/James/xUtils/.git/
步骤三:执行拷贝
$ git clone https://github.com/ZHANGfeng-james/xUtils.git
进入到你fork的仓库中,拷贝浏览器中的地址:https://github.com/ZHANGfeng-james/xUtils,并在其后添上.git即可。此外还有另外中方式:
$ git clone git@github:ZHANGfeng-james.com/xUtils.git
均可实现代码拷贝。
Cloning into 'xUtils'... remote: Counting objects: 7582, done. remote: Total 7582 (delta 0), reused 0 (delta 0), pack-reused 7582 Receiving objects: 100% (7582/7582), 15.49 MiB | 19.00 KiB/s, done. Resolving deltas: 100% (3242/3242), done. Checking connectivity... done.
看到以上信息,就说明已经将远程代码拷贝到本地了。
James成功了。
场景四:上传本地代码到远程
上传本地代码到远程(即github),是很常见的应用场景,James认为这个必须会。
首先在github上新建UploadDemo仓库(很显然,James觉得这是很基础的操作)。
其次在Git Bash中切换到本地项目(此时我新建项目文件:UploadDemo)的根目录,即类似于:C:UsersJamesUploadDemo目录,执行以下代码:
$ git init
将本地项目中的所有文件添加到仓库中,即需执行以下代码:
$ git add .
其中上述的:. ,代表的是项目根目录下的所有文件。但为什么会出现以下警告信息:
warning: LF will be replaced by CRLF in Picasso_project2/.gitignore.
James并不是很清楚。出现了很多文件信息,可能预示遍历了目录下的所有文件…
将add的文件commit到仓库中:
$ git commit -m "Picasso_project2" // 其中"Picasso_project2"是注释部分
最后,将本地仓库关联到github上:
$ git remote add origin git@github.com:ZHANGfeng-james/UploadDemo.git // 其后是github上对应项目的仓库地址
但此时出现以下错误:
fatal: remote origin already exists.
但这难不倒James,因为有baidu和google呀!
$ git pull origin master
James发现上述执行的代码中有关键线索:origin和master,而master恰好是github仓库的主分支。但此时James仍不知道为什么。
而后执行代码上传逻辑:
$ git push -u origin master
中途还弹出对话框,让James提供github的账号和密码。
此时,就完成了本地代码上传的功能:
场景四:Git Bash常用指令
git status // 查看当前仓库状态
该指令是最最常用的操作,相当于对之前的操作进行状态查询。
git init // 初始化当前路径所在的仓库
如果在本地新建了文件目录,但在Git看来还不是一个代码仓库,需要进行初始化,也就是需要用到上述指令。执行“git init”指令后,默认会生成一个主分支master,是实际开发正式环境下的分支,一般情况下不会在master分支中改动代码。
git add filename.txt // 添加filename.txt文件到缓冲区
该指令现将仓库的改动添加到Git的暂存区,临时保存改动。
git commit -m 'filename.txt commit'
该指令将暂存区的改动提交到仓库,也就是仓库记录了此次改动;其后的-m表示提交的信息:filename.txt commit。
git log // 输出commit记录
输出所有提交的commit。
git branch branchname // 新建branchname分支
分支branch的概念应用在团队协作上,个人工作在自己不同的分支branch上,对master分支不造成破坏且相互之间也不影响。
git branch // 查看仓库所有分支
输出结果中,有前置*的为当前所在分支,也就是说接下来的改动将会在该分支上进行,不会影响其他分支。
git checkout branchname // 切换到branchname分支
在切换之后的分支上进行操作。
git checkout -b branchname // 新建并切换到指定分支
该指令为以上两个指令的复合。
git branch -d branchname // 删除branchname分支
有新建分支指令,同样也有删除分支的指令。
git tag tag_content // 为当前代码设置标签
这篇文章写到这,后续还有更加深入的问题等待着James(前面好像还有问题没有解决哦!James童鞋没有忘记)