GitHub 是一个面向开源及私有软件项目的托管平台, 由于用户人群中多但是男女比例严重失调, 在程序届被戏称全球最大同性交友网站. 当年 Linux 系统横空出世, 盛况空前, 越来越多的程序猿加入到开发维护大军中, 如此庞大的项目体量没有一个好的项目托管平台怎么行, 于是 Linux 的创始人 Linus 大牛花了两周的时间自己用 C 语言编写了一个分布式版本控制系统, 就是 Git, 然后 Git 就迅速成为最流行的分布式版本控制系统, 在 2008 年, GitHub 网站上线了, 它为开源项目免费提供 Git 存储, 就在去年以 75 亿美金的价格被微软爸爸收购了 (来自贫穷的凝视).
现在 VS Code 中内置 Git, 配置一下文件路径和默认打开方式就可以直接在 VS Code 中进行 Git 操作, 十分方便快捷.
全球很多顶级的科技公司都将自己的项目贡献到 GitHub 上, 同时我们也可以在上面找到许多非常优秀的开源项目. 感谢 GitHub 让我们可以在一个开放畅通的互联网世界任意驰骋, 现在 GitHub 已经成了产品开发过程中的门面担当, 很多企业在面试的时候都会要求应试者提供下 GitHub 账户, 一个出色的 GitHub 账号肯定会为你在求职中增色不少.
简单介绍了 GitHub 的诞生和历史, 接下来就为大家讲解一下, 如何使用操作.
这里是 Git 的官方网站, 涵盖了非常全面的 Git 文档:
https://git-scm.com/
市面上有很多 Git 教程, 也有相关书籍, 通常都是很厚一本, 如果你是初学者, 推荐廖雪峰老师的 Git 教程, 基本功能都有涵盖, 由浅入深, 可以让你快速上手使用. 这篇文章就是基于他的教程, 按照我自己的使用习惯, 从一个新手角度再重新整理, 认真学习后每个人都会有不同的收获, 找到适合自己的就好.
1, 安装 Git
首先需要在自己的电脑上本地安装 Git,Mac 系统自带 Git,Windows 系统需要下载安装一下, 过程很简单方便, 这里就不赘述了, 针对各个不同系统的具体安装方法请参考廖雪峰老师的博客:
https://www.liaoxuefeng.com/wiki/896043488029600/896067074338496
2, 注册 GitHub 账户
在 GitHub 网站填写用户名, 邮箱, 密码注册个人账户.
注册成功之后你就会进入到 GitHub 主页, 上方是导航栏, 下方从左到右依次是:
仓库: 你创建的所有仓库会在这里显示
时间线: 你关注的人的一些活动, 比如说他创建了新的仓库, 或者 star,fork 了某些项目等等这些操作就会显示在这里, 类似微博动态.
发现新仓库: 这里会给推荐一些标星比较高的优秀项目, 类似于热门微博.
简单介绍下头部导航栏的各个模块:
LOGO: 点击进入 GitHub 首页
搜索框: 搜索用户或者项目
Pull requestes: 查看推送请求信息
Issues: 查看问题推送信息
Marketplace: 这里提供最新的软件, 是代码软件集市
Explore: 介绍 GitHub 上的热门软件
3, 在本地配置 GitHub 账户
安装 Git 完成之后, 在命令行输入:
- $ Git config --global user.name "你的 Github 用户名"
- $ Git config --global user.email "你的 Github 注册邮箱"
来配置你自己的 GitHub 用户名和 Email 地址
4, 创建 SSH Key 密钥
GitHub 需要通过 SSH 协议来确认内容是你推送的, 不然任何人都可以往你的仓库中提交修改, 就很危险了. 使用多台电脑开发就要配置多个 SSH Key, 通过 SSH key 来确保你能把内容推送到你本人的仓库中.
首先在本地找到. SSH 目录, Mac 用户使用快捷键: shift+command+G 输入~/.SSH 快速查找. 查看目录下有没有 id_rsa(私钥) 和 id_rsa.pub(公钥) 这两个文件, 如果没有, 可以在终端中运行 SSH-keygen -t rsa -C "你的 github 邮箱" 来生成 SSH Key.
进入 GitHub 网站在右上角点击个人头像, 在下方找到 Settings, 在左侧第六个选项中找到 SSH and GPG Keys, 点击 New SSH key, 将你的 id_rsa.pub 里的内容粘贴到 Key 中, 填上任意的 Title, 保存, 此时你就可以在本地向远程 GitHub 仓库推送内容.
5, 将本地仓库 Repository 同步到远程
(1) 初始化一个 Git 仓库: Git init
执行完这条命令后当前目录下会多一个. Git 目录, 这个目录是 Git 来跟踪管理版本库的, 千万不要把它删除, 看不到这个文件的修改一下自己的文件项, 打开显示隐藏文件.
(2) 把文件添加到仓库命令:
Git add 文件名 将指定文件添加到暂存区, 多个文件之间用空格隔开
Git add /Git add -A/Git add --all 将工作区内容全部加入暂存区 (包括新增, 修改, 删除文件操作)
Git add . 将当前目录下的所有内容全部加入暂存区 (包括新增, 修改文件操作)
执行完添加操作, 没有任何显示就对了, 在使用 Git 的过程中牢记: 没有消息就是好消息, 只有出错的时候它才会给你报错的提示信息.
这条命令可以反复多次使用, 将你需要添加的文件都提交到暂存区, 然后执行一次 Git commit 就可以将多次提交到暂存区的文件一次性提交到当前分支.
(3) 把文件提交到当前分支
Git commit -m "提交说明"
Git status 查看当前工作区的提交状态. 全部提交后显示:
nothing to commit, working tree clean
Git diff 查看修改的内容. 会比对暂存区和工作区的文件内容.
(4) 推送到远程仓库
首先新建一个远程仓库, 在 GitHub 主页右上角点击加号, 选择第一个选项 new repository, 填写 Repository name 仓库名, Description 描述, 选择 public 属性, 勾选 Initial this repository with a README 会自动生成一个 Markdown 格式的 README 文档. 这样我们就在远程创建好了一个 Git 仓库. 目前 GitHub 上创建公开仓库是免费的, 所有人都可以看到仓库中的内容, 如果想创建私人仓库是收费的, 它鼓励大家开源.
创建好仓库之后他分三种情况给出不同提示:
在本地新建仓库, 并推送内容到远程仓库
我们只需要按照如下指令, 依次执行:
echo "# Git-Test-Demo">> README.md 新建一个 README 文件并写入内容
Git init 生成. Git 版本库
Git add README.md 将当前工作区的文件提交到暂存区
Git commit -m "first commit" 将暂存区的内容提交到当前分支
Git remote add origin Git@GitHub.com:Hanxueqing/Git-Test-Demo.Git 在本地关联远程库
这里你可以选择使用 HTTPS 连接或者 SSH 连接, 使用 HTTPS 连接时每次推送都会要求有密码验证, 相对来说比较安全, 缺点是速度慢. 如果使用 SSH 连接, 第一次使用 Git 的 clone 或者 push 命令连接 GitHub 时, 会得到一个警告:
- The authenticity of host 'github.com (xx.xx.xx.xx)' can't be established.
- RSA key fingerprint is xx.xx.xx.xx.xx.
- Are you sure you want to continue connecting (yes/no)?
输入 yes 即可
Git 会输出一个警告, 告诉你已经把 GitHub 的 Key 添加到本机的一个信任列表里了:
Warning: Permanently added 'github.com' (RSA) to the list of known hosts.
这个警告只会出现一次, 后面的操作就不会有任何警告了.
Git push -u origin master 将当前分支推送到 origin 主机的对应分支.
由于远程库是空的, 我们第一次推送 master 分支时, 加上了 - u 参数, 将本地的 master 分支推送到 origin 主机, 同时指定 origin 为默认主机, 在以后的推送或者拉取时就可以简化命令, 不加任何参数直接使用 Git push 来推送了.
如果本地已有仓库, 想的内容快速推送到当前仓库, 只需要执行如下两条指令:
- Git remote add origin Git@GitHub.com:Hanxueqing/Git-Test-Demo.Git
- Git push -u origin master
你也可以从其他版本控制系统如 Subversion, Mercurial, or TFS project 中导入仓库
由于我一开始新建仓库的时候勾选了自动生成 README 文档, 而我本地的文件中又不存在这个文档, 所以向远程仓库 push 的时候会报错, 提示:
- error: failed to push some refs to 'git@github.com:Hanxueqing/Maoyan-API.git'
- hint: Updates were rejected because the tip of your current branch is behind
- hint: its remote counterpart. Integrate the remote changes (e.g.
- hint: 'git pull ...') before pushing again.
- hint: See the 'Note about fast-forwards' in 'git push --help' for details.
原因是自己当前版本低于远程仓库版本, 可以在 push 之前先将远程仓库 pull 到本地, 执行 Git pull origin master 命令, 再执行 Git push -u origin master 命令推送到远程仓库.
或者新创建一个分支 Git branch 分支名, 然后 push 到这个新分支上去 Git push -u origin 分支名.
这里我就直接使用了强制 push 的方法: Git push -u origin master -f, 但是它会覆盖远程的文件, 一般不建议使用, 尤其是多人开发的时候.
在本地执行完以上操作后就可以终端中出现提交成功的命令.
此时我们在 GitHub 账户上进入之前创建的仓库会发现, 所有工作区的文件已经在远程同步上传好了.
简单讲解一下仓库中各个模块的功能:
Watch: 类似于关注, watch 了某个项目之后, 以后只要这个项目有任何更新, 你都会收到通知提醒.
Star: 类似于点赞, 在 GitHub 上获得标星可比在社交网络中困难多了, 一般能获得 1000+star 的项目就已经非常不错了. 前一阵子在开发圈大火的 996icu 项目目前标星已经达到了 245k.
Fork: 将这个仓库的项目创建一个分支, 添加到自己的仓库中, 你就可以在原有仓库的基础上自己开发, 等功能完善后再发起 pull request 请求与原仓库合并分支, 将功能进行整合.
Code: 显示该仓库的文件列表.
Issues: 主要用于 BUG 报告, 功能添加, 方向性讨论等, 类似于一个讨论区留言板功能, 将 BUG 以 Issues 的形式进行管理, 解决掉后可以手动关闭 Issues.
Pull request: 查看并管理别人发来的 pull request 请求.
Projects: 这是一个很强大的项目管理模式, 可以将你的 issues 更好地进行管理, 有人利用 Project+Issues 在 GitHub 上编写技术博客.
感兴趣的可以关注下:
https://github.com/johnnian/Blog
Wiki:Wiki 是一种比 html 语法更简单的页面描述功能. 常用于记录开发者之间应该共享的信息或软件文档.
Security: 安全警告
Insights: 显示仓库的活动信息, 检测开发进度
Settings: 设置, 在这里可以对当前仓库进行设置, 例如仓库名更改, 描述信息更改, 以及删除当前仓库, 不过这个操作比较危险, 它会让你输入当前仓库名称进行二次确认, 如果是仓库中有内容还会让你输入账户和密码再次进行确认, 安全等级非常高.
commits: 提交日志
branches: 分支管理
releases: 发行版本管理
contributors: 参与开发的人员
Branch:master : 切换分支, 显示不同分支下的文件列表
New pull request : 向原有仓库发起合并请求
Create new file : 创建新文件
Upload files : 上传文件
Find files : 查找文件
Clone or download : 提供克隆, 下载的 https 协议或者 SSH 协议
接下来介绍一些 Git 的常用基本操作, 方便后续使用.
撤销修改
这里我们得先明确几个概念: 工作区, 暂存区, 当前分支, 远程仓库
工作区: 我们自己电脑里的文件目录
暂存区:.Git 目录中的 stage 文件, 暂时存放我们对于文件的修改, Git add 就是把文件添加到暂存区.
当前分支: Git 为我们自动创建一个 master 主分支, Git commit 就是把文件修改提交到当前分支.
远程仓库: 我们一开始创建的 Repository,Git push 就是把所有修改推送到远程仓库.
撤销工作区的修改 (此时你只是修改了文件, 但是还没有进行任何 Git 操作):Git checkout -- file
撤销暂存区的修改 (此时你不仅修改了文件, 还 Git add 将修改添加到了暂存区):Git reset HEAD <file> 再执行 Git checkout -- file
撤销提交到分支的修改 (此时你不仅修改了文件, 还 Git add 将修改添加到了暂存区, 同时 Git commit 提交到了当前分支): 进行接下来要讲到的版本回退操作
版本切换
如果你向当前的仓库中多次提交了修改文件, 可以使用 Git log 查看完整的提交日志, commit 后面的一大串数字就是版本号, Git 通过让内部 HEAD 指针指向特定版本号来实现版本的回退与前进.
image
如果你多次提交, 有一长串的提交日志, 不想显示 Author 和 Date, 只需要第一行数据可以运行 Git log --pretty=oneline
如果你觉得 commitId 太长, 只想保留几位有效数字, 可以运行 Git log --oneline --graph
回退命令: Git reset --hard commit_id 可以回退到指定版本
Git reset --hard HEAD^ HEAD 指向的是当前版本, HEAD 就是上一个版本, 上上个版本就是 HEAD^, 如果回退到更早期的版本可以写成 HEAD - 数字 (回退到之前的多少个版本)
前进命令: 执行过版本回退命令后再执行 Git log 会发现此版本之后更新的版本不见了, 此时也不用惊慌, 它并没有被删除或者覆盖, Git 提供了一个命令: Git reflog 来记录你的每一次命令, 只要找到你想恢复文件的 commit id, 再执行 Git reset --hard commit_id 就可以来到指定版本了.
文件删除
(1) 你在工作区删除了某一个文件, 想同步修改到远程仓库.
Git status 查看当前状态, 显示当前工作区中该文件已被删除, 使用 Git rm 文件名命令将版本库中的该文件删除, 然后 Git commit 上传到当前分支.
(2) 你在工作区误删除了某一个文件, 想从远程仓库将该文件恢复回来.(前提是你在工作区删除的这个文件之前已经提交过版本库)
Git checkout -- 文件名
Git checkout 其实是用版本库里的文件替换工作区的文件, 无论工作区是修改还是删除文件, 都可以一键还原, 但是你只能恢复文件到版本库中的最新版本, 如果你在提交版本库后又做了一些修改但是没有及时提交, Git 不会自动帮你记录这些修改.
分支操作
首先我们来理解一下分支的概念, 之前已经提到过 Git 会为我们自动创建一个 master 主分支, 但是在多人项目开发的时候, 我们不能所有人都往主分支上提交修改, 那样存在很大的安全隐患, 这时候 Git 鼓励我们使用分支完成任务, HEAD 指针指向当前分支, 每个人往自己的分支上提交文件, 互不干扰, 平时自己开发项目时也可以使用分支来管理不同功能模块, 最后使用合并分支命令, 将文件整合到一起, 这和直接在 master 分支上工作效果是一样的, 但过程更安全.
也就是说, 在实际开发中, master 分支应该是非常稳定的, 仅用来发布新版本, 平时不能在上面操作, 具体的操作我们可以在 dev 上进行, 把每个人的分支合并到 dev 分支上, 在版本发布的时候再把 dev 的分支合并到 master 上.
创建分支
Git checkout -b 分支名
Git checkout 命令加上 - b 参数表示创建并切换, 相当于以下两条命令:
$ Git branch 分支名创建分支
$ Git checkout 分支名切换分支
将本地创建的分支推送到远程
Git push origin 分支名
查看分支
Git branch 命令会列出所有分支, 当前分支前面会标一个 * 号.
Git branch -r 查看远程分支
Git branch -a 查看所有分支
合并分支
Git merge 分支名 (注: 合并前要切回要并入的分支, 不能在当前分支下进行合并)
删除分支
Git branch -d 分支名
Git branch -D 分支名强行删除一个没有被合并过的分支, 默认情况下是不允许删除没有被合并过的分支的.
克隆远程仓库
Git clone 仓库地址仓库首页可以找到仓库地址, 通过 clone 命令克隆到本地.
关于 GitHub 的使用就简单介绍到这里, 但是它的功能远不止于此, 知乎上有个回答, 如何有效的使用 GitHub, 有人用它放简历, 写博客, 写书, 看资讯, 有人把它当朋友圈, 微博, 跟技术大牛互动, 把链接贴上来, 有兴趣的可以关注看看:
https://www.zhihu.com/question/21248859
总之, 它就像一个宝藏, 永远有闪光点和值得学习的地方有待于我们去发掘.
来源: http://www.jianshu.com/p/9b307f575243