Git与github
Git分布式版本控制工具
Git概述和基本使用
git分布式版本管理与svn(cvs)对比
-
类型:git是开源的分布式版本控制系统 ,svn是集中式版本控制系统
-
架构:git包括工作目录、暂存区、本地仓库和远程仓库。 svn包括工作目录和中央仓库
-
分支修改:git分支结构只要不提交合并到远程仓库,对其他共同开发者没有影响,svn只有一个目录,是完整目录,改变分支,其他共同开发者都会改变
-
分支匹配:git本地仓库分支和远程仓库分支可以自由匹配,svn是全局统一的
-
内部数据存储方式:git统一存储管理元数据,存放在项目根目录下.git文件里,svn是以文件的形式存放管理,与工作区文件存放在一起
-
git强调个体。速度快、灵活。公共服务器压力和数据量都不会太大,离线工作,svn只有一个单一的集中管理服务器,容易出现单点故障,容易负载过重
git特点
-
最优的存储能力
-
非凡的性能
-
开源的
-
很容易做备份
-
支持离线操作
-
很容易定制工作流程
使用git的web管理平台:github、coding、码云、gitlab(开放源代码,自带持续集成)、BitBucket、Gerrit、百度效率云等
git安装和使用
-
安装:在 https://git-scm.com/ 下载根据说明安装,或者下载免安装版本,配置git环境
-
git配置用户名和邮箱
$ git config --global user.name 'your_name' $ git config --global user.email 'your_email@domain.com' //除了设置global还可以设置--local、--system //local只对某个仓库生效 //global对当前用户所有仓库有效 //system对系统所有登录的用户有效 //显示config的配置加--list $ git config --list --local
-
git创建或初始化仓库
git init//把项目纳入git管理 git init filename//创建文件夹,并纳入git管理 git log //查看提交信息 cp ../exportapp/readme.md . //从exportapp目录下拷贝文件到当前仓库,需要加点 git add readme.md// 添加文件到暂存区
Git常用命令
git config --list --localgit init//把项目纳入git管理git init filename//创建文件夹,并纳入git管理git log //查看提交信息cp ../exportapp/readme.md . //从exportapp目录下拷贝文件到当前仓库,需要加点cp -r ../EclipseAdt/lib . //拷贝文件夹需要加上-rgit add readme.md// 添加文件到占存取git add index.html images //add命令后边可以跟多个文件和目录git status //查看当前工程状态git commit -m'Add readme' //将暂存区的代码提交到本地仓库(此时用户优先local然后global)ls -al//查看当前目录下文件vi index.html//使用vi编辑器编辑文件;按Esc输入冒号退出编辑git add -u //update,把所有被跟踪的文件一起添加到暂存区git rm index.html//删除暂存区指定文件 mv index.html index.htm(重命名三步,此命令执行后暂存区有两个文件)git mv index.htm index.html//重命名文件git log --oneline//简洁方式查看loggit log -n2 //查看最近两次(后面可以加--oneline)
git rm lib -r -f //git删除指定文件夹和其下所有文件
git branch -v//查看所有本地分支git branch命令git checkout -b temp e82c332(分支名)//用历史分支创建一个临时分支
git checkout master//切换分支
git merge temp//合并分支
git tag -a 53d3d6c -m 'my 53d3d6c tag'
git branch -d fix_readme/git branch -D fix_readme//删除分支
git commit -am'Add test'//把工作区直接创建到历史版本库,其实就是把addhe-m合并一句使用git log (--oneline) --all//log命令默认查看当前分支,查看所有添加allgit log --oneline --all (-n4) --graph//图形化查历史看关联或版本演进git help --web log//通过浏览器查看git指令
gitk //启动git图形化界面
git fetch origin master//代码拉取git pull origin master //拉取并合并两步
git remote add origin <address> //连接远程git push -u origin master //指定默认主机提交代码git push origin master
Gt图形化界面
5c86efabc4511 5c86efabc4511.git目录
-
HEAD:指明我们当前工作在哪个分支下
-
config:文件用户信息(name/email)的配置信息
-
res:包含分支和标签(关键版本添加tag)信息
-
tags:标签信息
-
objects:树结构信息,包含tree、blob
git核心对象:commit、tree、blob
5c86f6528e85b 5c86f6528e85b一个commit对应一颗树,即当前commit对应的视图,包含commit当时所有文件的快照,tree是树,可能对应的是一个文件夹,文件下可能也有树,也可能是一个blob(文件),blob和文件名没有关系,它看的是文件内容
Git探秘
Git使用和遇到的问题
-
git tag -a 53d3d6c -m 'branchAmey tag' //一个里程碑式的版本添加一个tag
-
数一数tree的个数
-
mkdir doc// 创建一个文件夹
-
echo "hello,word" > readme//创建readme,并写入内容
-
git add doc/git commit //把内容提交
-
find .git/objects -type f //查看objects下有几个对象
-
git cat-file -t 02fe07b//查看产生的object对象类型
-
git cat-file -p 02fe07b//查看产生的object对象内容
-
一个文件夹下一个文件提交产生四个对象,一个commit(tree)一个文件名(tree)一个内容(blob)一个文件夹(tree)
-
-
detached HEAD(分离头指针)--随意切换某个分支
-
本质上就是在没有分支的状态下工作,你做了很多变更直接切换了分支,变更可能会丢失
-
尝试性变更反而有好处
-
git branch fix_edit 3d4651d //对没有分支的commit在切换后创建分支
-
-
HEAD和branch
-
git checkout -b fix_readme master//创建并切换到新分支,HEAD指向也会变
-
git diff 3ff43d7d62cf 53d3d6c4e//比较两个分支的不同
-
git diff HEAD HEAD^1 //HEAD和父分支进行比对
-
-
commit的描述与合并
-
git commit --amend//修改刚提交的commit描述
-
git rebase -i e82c3322f6//变更某个历史commit描述.指定父commit,把pick改为r,然后修改
-
git rebase --abort//退出rebase状态
-
git rebase -i e82c3322f6//把子commit修改为s,表示合并到一个commit
-
git rebase --continue//rebase vi终断
-
git merge temp//合并分支
-
git commit -c commitID//当rebase -i错误时先add然后指定commit
-
-
git忽略文件
-
git备份
`哑协议传输进度不可见,智能协议传输速度比哑协议快 `
-
哑协议(/path/to/repo.git):本地协议、智能协议(file:///path/to/repo.git)、http/https协议、ssh协议
-
本地仓库备份和同步
-
git clone --bare /g/workcode/AndroidCode/will/.git ya.git //本地哑协议备份
-
git clone --bare file:///g/workcode/AndroidCode/will/.git zhineng.git //本地智能协议备份
-
git remote show| git remote show//查看远程关联
-
git remote add zhineng file:///g/workcode/AndroidCode/666-backup/zhineng.git// 远程关联本地仓库
-
git push --set-upstream zhineng dev // 新增本地更改提交到远程仓库
-
-
Git与github诞生
-
git 出现前
-
程序员之间协作编程方式少
-
即使有svn,与开源团队合作也要获得管理员许可才能ferk分支
-
许多时候批准过程比写代码时间还长
-
许多开源项目都受到权限问题以及其它一些低效率问题困扰
-
-
-
git诞生后
-
发展
-
开源领域经历文艺复兴
-
Linux受到追捧
-
第一个web2.0出现
-
开源项目的合作变的很容易
-
许多公司将项目迁移到开源服务器
-
-
不足
-
无法帮助开发人员寻找开源项目
-
开发的开源项目很难让他人知道
-
-
-
Github诞生与发展
-
让git更好用,让团队协作与编写软件变的轻松、安全,远程协作更方便
-
开源和寻找开源项目变得容易,互相学习鉴戒提升变的高效
-
2007-2011-代码协作与软件社交,用户突破100万,库存200万
-
2012-2015-从快速增长到无处不在,用户280万,库存460万
-
2015-2018-全球扩张,用户3千万,库存9千万
-
GitHub使用
注册帐号与配置
-
配置ssh公私钥
-
打开git bash,然后输入 ssh-keygen -t rsa -b 4096 -C "your_email@example.com",回车,出现下图配置成功
- 5c875f720927d 5c875f720927d
-
pwd//查看目录
-
ls -al //查看目录下文件
-
cat id_rsa.pub 打开公钥文件并复制
-
粘贴公钥到github sshKey,保存
创建Hello Word项目
-
在github创建新仓库,组织名为个人,仓库名是项目名,选择是否公开,选择编程语言自动添加git忽略文件,选择自动创建说明文件,选择公开声明自动创建LICENSE
-
git remote ssh连接,git fetch origin master拉取合并远程代码
-
git merge --allow-unrelated-histories githubWill/master//让没有关联的本地和远程分支合并
-
git push githubWill master//提交代码到远程仓库
-
git merge githubWill/feature/add_gitcommands //合并代码到远程仓库
-
不同的用户修改了文件,用户需要先拉取,在提交,然后合并
-
不同用户修改了同一个文件的名称,只需要把协商好的文件名提交,其它删除,其它用户修改了文件名,你只需要拉取代码就好,你修改文件内容git会自动识别
-
git push -f //命令强制提交,会替换远程仓库内容,包括提交记录
-
禁止向集成分支执行变更历史的操作
github搜索
-
搜索关键字+in:readme(>1000) 能搜索出更多项目
-
blog easily start in:readme stars:>5000:搜索容易使用的博客项目
-
help下搜索search查看搜索技巧