1.git与github
git是由Linux之父Linus运用c语言开发的一款分布式版本控制工具,支持Linux命令。github是全球最大的社交编程与代码托管网站,托管了数以百万的开源项目。
- 保存所有提交过的文件历史状态
- 将文件回退到任意历史版本
- 多人并行修改同一文件,并推送到服务器端
- 创建多条支线同时推进开发任务
- 邀请团队外的人员参与开发并进行审核
- 对团队成员进行权限限制
- 查看团队成员的修改内容、时间、日志
2.本地仓库操作
2.1 初始化 git init
生成.git文件夹(默认隐藏),文件夹中包含了配置文件等本地库相关的目录和文件,如config文件中包含用户签名等信息
2.2 设置签名
用户名和Email地址可随意,仅用于区分开发者身份
项目级别(仓库级别):
仅在当前本地仓库范围内有效
配置文件保存在该项目下.git文件夹中的config里
系统用户级别:
登录当前操作系统的用户范围
配置文件位于C:\Users\Administrator\.gitconfig 当二者用户签名都存在时,会优先使用项目级别的签名。
2.3 git本地操作
2.3.1 将文件加入暂存区\从暂存区去除
- 将文件加入暂存区 git add 文件名
- 将所有文件加入暂存区git add *
- 将文件从暂存区去除git rm --cached 文件名
- 查看当前状态git status
2.3.2 将文件提交到本地库
- 将文件快速提交到本地库 git commit -m "提交标识语句" 文件名
- 将文件提交到本地库 git commit 文件名 不使用快速提交会打开vim编辑器,要求添加提交标识语句
2.3.3 查看提交的日志
- 完整查看历史记录 git log
- 简洁版 git log --pretty=oneline
- 简洁版并缩短了哈希值 git log --oneline
- 在oneline基础上添加了回退版本指针需要移动的次数 git reflog
2.3.4 版本回退
- 基于索引值 git reset --hard 哈希值
- 基于^符号:只能后退 git reset --hard HEAD^ 一个^表示回退一个版本,n个^即回退n个版本
- 基于~符号:只能后退 git reset --hard HEAD~回退数
2.3.5 reset的参数
- --soft 仅在本地库移动 HEAD 指针,不修改工作区和暂存区内容,工作区和暂存区内容仍为版本回退前的内容,因为本地库和暂存区内容不同了,此时git status会提示有新内容可提交(不常用)
- --mixed 在本地库移动 HEAD 指针,同时暂存区也会回退到历史版本(不常用)
- --hard 在本地库移动 HEAD 指针,暂存区、工作区也会一同被重置回历史版本
2.3.6 文件删除与找回
文件删除同样需要git add添加和git commit提交,将删除记录提交到本地库,以备版本回退。
找回文件将版本回退到删除前的版本即可若删除文件后只添加到了缓存区,没有提交到本地库,此时本地库中是没有提交记录,但可以用 git reset --hard HEAD 命令将暂存区、工作区一起回退到没有删除文件和添加缓存的那个版本。
即:
- 删除操作已经提交到本地库 git reset --hard 哈希值
- 删除操作未提交到本地库 git reset --hard HEAD
2.3.7 文件比较
- 将工作区和暂存区的文件进行比较 git diff 文件名 若无文件名则将比较所有文件 删除内容将以红色表示,新增文件绿色标识
- 将工作区文件和历史版本进行比较 git diff 历史版本 文件名 eg:git diff HEAD new1.txt 和当前版本进行比较
eg:git diff HEAD^^ new1.txt 和上上个版本比较
eg:git diff 哈希值 new1.txt 和该哈希值对应的版本进行比较
2.4 分支
2.4.1 创建与切换分支
- 创建分支 git branch 分支名
- 切换分支 git checkout 分支名
- 这两个代码可以合并,创建并切换到新建的分支 git checkout -b 分支名
- 不能创建两个同名的分支,使用 git checkout -B 分支名 强制创建会重置原有的分支
- 查看所有分支 git branch -v
2.4.2 合并分支
1.先切换到需要待修改的分支上 git checkout 分支名
2.执行合并 git merge 有新内容的分支名
2.4.3 解决冲突
当两个分支同一文件同一内容进行了不同修改,git将提示自动合并失败,打开文件会标识出冲突位置和内容
git add 文件名
git commit -m “提交说明”
完成合并注意!!git commit 命令后不跟文件名,否则会提示合并状态下无法进行提交
2.5 创建标签
可以为github的项目添加标签,方便查找不同的版本。较为规范的版本格式应该为主版本号.次版本号.修订号各版本号应该依次递增,版本号递增应该遵循:
- 主版本号重大调整、大型不兼容的API修改
- 次版本号新增功能、小型功能性修改
- 修订号修复bug
- 每当次版本号递增时,修订号必须归零。每当主版本号递增时,次版本号和修订号必须归零
- 先行版本号可以标注在修订号之后,使用连接号再加上一连串以句点分隔的标识符来修饰,如:1.0.0-alpha.1、1.0.0-0.3.7、1.0.0-x.7.z.92
2.5.1 查看tag
查看已创建的标签
- 查看所有标签 git tag
- 查看指定版本的标签 git tag -l v1.1.*
- 显示tag信息 git show v1.1.1
2.5.2 创建tag
- 轻量级tag,无任何附带信息 git tag 标签名
- 附带说明的tag git tag -a 标签名 -m "说明"
- 带有签名的tag,需要GPG私钥 git tag -s 标签名 -m "说明"
2.5.3 删除tag
- 删除本地tag git tag -d 标签名
- 删除远程tag git push origin --delete 标签名
- 删除远程tag git push origin :refs/tags/标签名
2.5.4 验证tag
拥有GPG私钥时可以验证tag- 验证tag git tag -v 标签名
2.5.5 推送本地tag到远程仓库
- 推送指定tag git push 远程仓库别名 标签名
- 推送所有tag git push 远程仓库别名 --tags
3.远程仓库
3.1 push与clone
在github创建仓库,并复制仓库地址 git init 在本地初始化文件夹,建立本地仓库- 创建远程仓库别名 git remote add 别名 远程仓库地址(别名常用origin)
- 查看当前所有仓库别名 git remote -v
- 推到远程仓库 git push 别名 分支名
- 克隆到本地 git clone 远程仓库地址
3.2 拉取
- 拉取并直接合并git pull 别名 远程分支名
- 仅拉取远程库git fetch 别名 远程分支名
- 合并git merge 远程库地址别名 / 远程分支名
- 即 pull=fetch+merge
3.3 冲突解决
当团队不同成员对同一文件进行了修改,后push 的人会被要求将本地库更新到最新版本,需先 pull 到本地,而当拉取的远程库内容和本地库有冲突时,会直接进入待合并状态,需解决冲突位置。 即如果不是基于Github 远程库最新版本进行的修改,会无法进行push操作
4. 跨团队开发与fork操作
团队外的成员,可用 Github 中的 fork 将心仪的仓库复制一份到自己的仓库中,fork的仓库会保留来源。 在自己的仓库中编辑完后,可用 Github 中的 Pull requests 将修改提交给原作者。 原作者可通过 Merge pull request 合并代码,书写合并操作日志后 Confirm merge完成合并。
5. ssh免密登录设置
5.1 生成.ssh密钥目录
1.返回根目录cd ~
2.使用命令ssh-keygen -t rsa -C github账号生成.ssh密钥目录,密钥文件夹在win10中默认路径为C:\Users\当前登录win10的用户名\.ssh
3. 文件夹中默认生成 id_rsa 和 id_rsa.pub文件,使用命令cat id_rsa.p 或直接用记事本打开id_rsa.pub文件,复制内容
4. 打开github的头像→Settings→SSH and GPG keys 位置,New SSH Key 后进行粘贴
5.2 配置ssh
1.创建远程仓库别名 git remote 别名 远程仓库ssh
2.此时使用git remote -v 查看列表中将新增ssh地址,此时即可用push ssh别名 远程分支使用ssh进行操作。
6. Github常见报错
6.1 无法连接
fatal: unable to access 'https://github.com/xxxxx.git/'之类的错误
将链接中的https改为git