1.理解什么是github
Github是分布式管理工具,每个人电脑都有一份完整的版本库,所以修改可以在本地进行,不必联网。Github有一个充当中央服务器的电脑,用于伙伴们对一个项目交换修改,如果没有中央服务器,就只能在同事之间的两台个人电脑之间交换修改。
2.安装git(windows)
Git最初是运行在linux和unix平台上的,所以要在windows上运行必须模拟linux和unix环境。Cygwin译为小型的UNIX模拟环境,牛人将模拟环境和Git打包生成msysgit(windows版的git)。https://git-for-windows.github.io=>按默认选项安装即可。
注意:分布式管理器需要自报家门:
$ git config --global user.name "Your Name"
$ git config --global user.email "email@example.com"
3.本地仓库与远程仓库进行连接SSH密钥认证机制
在个人电脑上生成密钥对,id_rsa(私钥)和id_rsa.pub(公钥存储在github远程端)。原理是,个人电脑发出请求(如登录),远程托管服务器收到请求并在宿主目录下寻找公钥,检测是否合法,合法就加密一随机数,发送给客户端,客户端用私钥进行解密再发送回服务器,服务器经过比较便可完成认证。
生成密钥对:
$ ssh-keygen -t rsa -C "youremail@example.com"
一路回车,其中,-t 指定ssh类型,-C添加一个新注释,最后将id_rsa.pub的内容copy到github服务器上.
4.本地仓库如何与远程仓库同步
- 第一种情况:本地仓库和远程仓库都已经建好,只需要关联一下就行
- 第二种情况:远程仓库已经建好,本地仓库还没有,只需要克隆至本地就行
如何建立本地仓库:
1. 选择一个合适的地方,创建一个空目,进入目录,显示当前目录
$ mkdir gitStudy
$ cd gitStudy
$ pwd
2. 通过git init命令把这个目录变成Git可以管理的仓库,成功后会有.git隐藏目录,可以查看隐藏文件
$ git init
$ ls -ah
如何建立远程仓库:
1. 进入github官网,登录new一个repository就ok,最好远程和本地名字一致
关联两者:
$ git remote add origin git@github.com:kingbosser/gitStudy.git
克隆仓库:
$ git clone git@github.com:kingbosser/webTools.git
默认情况下只会克隆远程库的master分支,如果要克隆dev或其他分支至本地
$ git checkout -b dev origin/dev
5.如何管理自己的本地仓库
为了理解,我们将本地仓库管理过程比喻为你家承包了几百亩地,种植 不同的水果,终于到了丰收的季节,父亲联系了一位批发商来取货。一辆大货车停在路边,便开始采摘水果了,每个人一个背篓进入果场采摘,装满了便出林卸在货车上,货车装满,便运往公司。
本地仓库管理也如此,在地里(工作区)每一次摘了一个水果放进背篓(暂存区)代表一次git add操作,装满后卸在货车上(master分支,可以有很多分支)代表一次git commit操作,货车装满后运往公司(origin master)代表一次git push操作。整个流程就算完毕。接下来介绍仓库管理常规操作
$ git status
//查看版本库状态,有无修改$ git diff
//查看具体修改细节$ git add
//提交至暂存区$ git commit -m
“注释文字” //提交至本地分支$ git log
//查看提交日志时光机
- 返回到以前版本
HEAD代表最新版本,HEAD^代表上一个版本,HEAD^^代表上上个版本,HEAD~100代表上第100个版本。
$ git reset --hard HEAD^
//回到上一个版本
$ git reset --hard 3782132
//回到指定版本,3782132代表版本commit id前几位- 穿梭到未来版本
穿梭到未来版本必须通过版本号,版本号不易记住,可以查看版本号
$ git relog
//查看每一次commit操作id
$ git reset --hard 127182
//跳转到未来的指定版本撤销修改分为三种情况
- 丢弃工作区的修改
$ git checkout -- filename
//撤销工作区的全部修改,如果没有add至暂存区,则回来版本库原样,如果已经add至暂存区,则回到暂存区的状态。- 丢弃暂存区的修改
$ git reset HEAD filename
//撤销暂存区的所有修改,回到工作区状态- 丢弃分支的修改
使用版本回退
删除文件
手动删除或这使用命令
$ rm filename
确实要删:$ git rm file name
犯傻误删:$ git checkout -- filename
6.分支管理
- 创建新分支
$ git branch dev
//创建dev分支
$ git checkout -b dev
//创建并切换到dev分支
$ git branch
//查看所有分支,带*的为当前分支
$ git checkout dev
//切换到dev分支
$ git merge dev
//合并dev分支到master分支
$ git branch -d dev
//删除dev分支
$ git branch -D dev
//强行删除dev分支
- 冲突管理
当合并分支时,如果提示有冲突,则需手动清除冲突,然后再add+commit,最后删除dev分支。合并分支默认以Fast-forward形式,这种形式下删除分支会丢掉分支信息,看不出之前做过合并;若禁用Fast-forward形式,会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息。
$ git merge --no-ff- -m "注释性文字" dev
//禁用Fast-forward
$ git log --graph (--pretty=oneline --abbrev-commit)
//查看合并分支图
最佳实践:master是最稳定的,只有发布稳定版本的时候才更新。工作统一在dev分支上,每个人有自己的个人分支
- 现场保存和恢复
$ git stash
//保存现场
$ git stash list
//查看现场保存目录列表
$ git stash apply
//恢复现场,stash内容不删除
$ git stash drop
//删除stash内容
$ git stash pop
//恢复现场并删除stash内容
- 多人协作
$ git remote
//查看远程库信息
$ git remote -v
//查看远程库详细信息
本地新建的分支如果不推送到远程,对其他人就是不可见的;
$ git push origin branch-name
//从本地推送分支
如果推送失败,先用git pull抓取远程的新提交;
$ git pull
//抓取远程新提交
$ git checkout -b branch-name origin/branch-name
//在本地创建和远程分支对应的分支,本地和远程分支的名称最好一致;
$ git branch --set-upstream branch-name origin/branch-name
//建立本地分支和远程分支的关联.从远程抓取分支,使用git pull,如果有冲突,要先处理冲突
7.标签管理
标签(tag)是一个版本的快照,虽然说存在commit id,但是很难记,tag是一个有意义的名字,方便记忆,与commit绑定在一起,tag是静态的,不能移动,commit可以移动。
- 创建标签
$ git tag v1.0
//切换到目的分支上,默认为最新commit打标签
$ git tag
//查看所有标签
$ git tag v1.0 commit-id
//给指定commit打标签
$ git show v1.0
//查看指定tag信息
$ git tag -a v0.1 -m "说明性文字" commit-id
//添加带说明的标签
$ git tag -s <tagname> -m "说明性文字"
//PGP签名标签名,tag采用PGP签名,必须首先安装gpg(GnuPG),如果没有找到gpg,或者没有gpg密钥对,就会报错。 - 推送和删除标签
$ git push origin v1.0
//推送标签、
$ git push origin --tags
//一次性推送所有标签
$ git tag -d <tagname>
//删除本地标签
$ git push origin :refs/tags/<tagname>
//删除远程标签
8.参与开源项目
访问开源项目点“Fork”在自己的账号下克隆了一个仓库,然后从自己的账号下clone。如果修复项目的一个bug,或者新增一个功能,立刻就可以开始干活,干完后,往自己的仓库推送。如果你希望bootstrap的官方库能接受你的修改,你就可以在GitHub上发起一个pull request。当然,对方是否接受你的pull request就不一定了。
9.更多配置
- 忽略文件
编写.gitignore文件,在这里都有https://github.com/github/gitignore
如果想提交被忽略的文件,可以强制提交或者查看.gitignore文件明细
git add -f filename
//强制提交文件
git check-ignore -v filename
//查看文件在何处被忽略 配置别名
$ git config --global alias.st status
//st代表status
$ git config --global alias.co checkout
//co代表checkout
$ git config --global alias.ci commit
//ci代表commit
$ git config --global alias.br branch
//br代表branch
$ git config --global alias.unstage 'reset HEAD'
//unstage代表reset HEAD
$ git config --global alias.last 'log -1'
//last代表log -1最新提交查看配置文件:每个仓库的Git配置文件都放在.git/config文件中,别名就在[alias]后面,要删除别名,直接把对应的行删掉即可
cat .git/config