爆玩GIT
认识GIT
git是一个开源的分布式(远程和客户端都保存有所有版本,而集中式仅远程有所有版本记录)的版本控制软件,高效进行版本管理。
git主要是在本地项目目录下生成.git文件夹,存储各种修改记录和版本,如果想要远程共享或协同开发,就需要用到远程代码托管平台(如阿里云,github,gitlab等)
GIT操作(本地)
git init 创建.git文件夹
git status 查看当前git状态(红色代表被修改过或未添加至版本库,绿色代表版本库暂存状态)
git add "文件名" 添加当前目录下所有文件到版本库
git commit -m "本次提交描述" 对当前版本添加进行描述,并将暂存区文件提交到版本库的分支
- git config --local user.name 'lamb 提交用户
- git config --local user.email 'lamb@example.com' 提交用户邮箱地址
git log 查看历史版本记录
git reflog 回滚后git log不好使了,需要git reflog查看历史所有版本
修复bug的两种方式:
方案1 stash
git stash 将正在开发且未完成的内容临时存储于某个地方
git status 工作区回到当前版本未做任何操作前
紧急修复bug => git status => git add . => git commit -m "紧急修复"
git stash pop 将未完成的那部分代码拿出来继续开发(可能出现冲突)
冲突:如果紧急修复bug的代码和临时存放区代码有重合部分,则可能出现冲突 。自行解决冲突,提交。
常用命令: git stash 将当前工作区所有修改过的内容存储到某个地方,将工作区还原到当前版本未修改过的状态
git stash list 查看临时存储地的所有记录
git stash clear 清空临时存储地记录
git stash pop 将第一个记录从“临时存放区域”拿到工作区(可能出现冲突)
git stash apply 将某个编号的文件从“临时存放区域”拿到工作区(可能出现冲突)
git stash drop 将某个编号的文件从“临时存储区域”删除
方案2 branch
branch成为分支,默认仅有一个master 分支
一般开发新功能流程:
git branch dev 创建一个名为dev的分支
git checkout dev 切换到dev分支
开发功能
git status 查看状态
git add . 将修改过的文件添加到版本库的暂存区
git commit -m "新功能开发完毕" 将暂存区的内容提交到当前所在分支,即dev分支
git checkout master 切换回master分支
git merge dev 将dev分支内容合并到master分支
流程增强版:
git branch(当前在master分支) =>
git branch dev(创建dev分支,用于开发新功能) =>
git checkout dev(切换到dev分支) =>
开发新功能(开发到一半,需紧急修复bug) =>
git add . => git commit -m "新功能开发一半" =>
git checkout master(切换到master分支) =>
git branch bug(创建bug分支) =>
git checkout bug(切换到bug分支) =>
修改bug =>
git add . (提交修复结果) =>
git commit -m "紧急修复bug" =>
git checkout master(切换到master分支) =>
git merge bug(将bug分支合并到master分支,表示bug修复完毕,可以上线) =>
git checkout dev(切换到dev分支,继续开发新功能) =>
继续开发 =>
git add .(新功能开发完成,添加到暂存区)=>
git commit -m "新功能继续开发完成" (提交功能到dev分支)=>
git checkout master(切换到master分支) =>
git merge dev(将dev分支合并到master分支)
branch相关常用命令:
git branch 查看所有分支名称
git branch "分支名称" 创建分支
git checkout "分支名称" 切换分支
git branch -m "分支名称" 创建并切换到指定分支
git branch -d "分支名称" 删除指定分支
git merge "分支名称" 将指定分支合并到当前所在分支
GIT操作(代码托管github)
基于github代码托管步骤:
- 注册github
- 创建仓库,即获得URL代指该仓库
- git可以使用该url向远程推送版本信息或获取版本信息
将本地代码推送至远程(家):
git remote add origin http://github.com/lamb/lalala.git #为远程地址起一个别名origin
git push origin master #将本地master分支内容以及版本信息推送到github指定仓库
git push origin dev #将本地dev分支内容以及版本信息推送到github指定仓库
将远程代码下载到本地开发(公司):
git clone http://github.com/lamb/lalala.git #将项目从github上获取
git branch #默认获取到的只有master分支
git branch dev origin/dev #创建dev分支并和远程dev分支同步
git checkout dev #切换到dev分支
继续开发新功能
git add . #添加文件到版本库暂存区
git commit -m "公司新功能一" #提交新功能到版本库分支
git push origin dev #将dev分支内容推送至远程托管仓库的dev分支
回到家:
git checkout dev #切换到dev分支
git pull origin dev #从远程github上获取dev分支最新内容,并合并到本地
继续开发新功能
git add . => git commit -m "家里开发功能一"
来到公司:
git checkout dev => git fetch origin dev(从github仓库获取dev分支最新内容到版本库的分支) => git merge origin/dev(将版本库的分支内容合并到工作区) => 继续开发新功能 => git add . => git commit -m "....."
注:git和github结合可以做到避免电脑损坏造成项目丢失和多地开发问题,上文中git pull origin "分支名称" 等同于 git fetch origin "分支名称" + git merge origin/分支名称
GITHUB(多人协同开发)
- 合作:将其他用户添加至仓库合作者中之后,该用户就可以向当前仓库提交代码
- 组织:创建一个组织,然后可以在该组织下创建多个项目,组内成员可以向组内所有项目提交代码,也可以对某个项目指定合作者
协同开发流程
- 创建程序
- 用户A创建项目,提交到github
- 用户B克隆项目
- 用户C克隆项目
- 开发功能
- 用户A开发功能1
- 用户B开发功能2
- 用户C开发功能3
- 提交
- 用户A提交功能1,并push
- 用户B提交功能2,将无法push,因为github上已经有其他人提交的新代码
- 从github上获取最新代码,并合并到本地,提交
- 方法1:git pull origin master => git push origin master(日志记录会有分叉)
- 方法2:git fetch origin master => git merge origin/master => git push origin master(日志记录会有分叉)
- 方法3:git fetch origin master => git rebase origin/master => git push origin master(日志记录干净整洁)
- 从github上获取最新代码,并合并到本地,提交
- 用户C提交功能3,无法push,无法提交,因为github上已经有其他人提交的新代码
- 从github上获取最新代码,并合并到本地,提交
- 获取最新代码
- 用户A获取最新代码
- 用户B获取最新代码
- 用户C获取最新代码
GITHUB(为别人贡献代码)
- 找到项目,fork一下,代码就会保存到自己的代码仓库
- 从自己仓库获取代码,并进行编辑提交
- 创建并提交一个pull request,等待同意,若同意,就提交成功
配置文件:
- 系统配置:/private/etc/gitconfig
- 用户配置:~/.gitconfig
- 项目配置:.git/config
用户凭证(解决频繁授权问题):
- 私钥
- ssh-keygen -t rsa(创建一对秘钥)
- id_rsa.pub(即公钥,拷贝到github)
- 注:git@github.com:lamb/xxx.git
- 密码
- Https访问git时,避免每次操作需要输入用户名和密码,可以在配置文件中添加如下配置项:
[credential]
helper = store/cache/第三方
store:
表示将用户名和密码保存在硬盘上
第一次输入过用户名和密码之后,用户名和密码就会保存在当前用户根目录的 .git-credentials 文件中,内容格式为:https://用户名:密码@github.com自动添加配置命令:git config credential.helper store
cache:
表示将用户名和密码保存在缓存中
第一次输入过用户名和密码之后,用户名和密码就会保存在缓存中,默认超时时间是 900 秒,缓存相关文件保存在当前用户根目录的 git-credential-cache 中
自动添加配置命令:
git config credential.helper cache
git config credential.helper 'cache --timeout=300'相关操作:
清除缓存:git credential-cache exit
指定超时:
[credential]
helper = cache --timeout=300
注意:
这种方式需要使用GIt中 https://github.com/WuPeiqi/xxxx.git 格式地址。
指定用户名和密码: https://用户名:密码@github.com/wupeiqi/xxx.git
- Https访问git时,避免每次操作需要输入用户名和密码,可以在配置文件中添加如下配置项: