入门
什么是git
git 是一个分布式版本控制软件
- 版本控制:类似于毕业论文,文案等,需要反复修改和保留原历史数据。
- 分布式
- 文件夹拷贝
- 本地版本控制
- 集中式版本控制
- 分布式版本控制
版本控制
保留之前的所有版本,方便回滚和修改
安装git
官方安装步骤
基本步骤
初始化
想要让 git 对一个目录进行版本控制需要的步骤:
- 进入要管理的文件夹
- 执行初始化命令:
git init
- 查看管理目录下的文件状态
git status #新增的文件和修改但未提交的文件显示红色
- 管理指定文件(红色文件变绿)
git add 文件名 git add . #管理目录下所有文件
- 个人信息配置:用户名,邮箱
-
- 用于记录是谁生成了版本
- 执行一次即可
git config --global user.email "xxxxx" git config --global user.anme "xxxxx"
- 生成版本:提交
git commit -m '描述信息'
- 查看版本记录
git log git log --graph //以图表形式显示 //格式化图表方式显示,格式化内容是哈希值和记录 git log --graph --pretty=format:"%h &s"
扩展新功能
git add
git commit -m '我干了啥'
回滚
撤销
- 先使用
git reflog
查看包含回滚的日志信息,使用其中的版本号 - 再使用
git reset --hard +版本号
命令总结
branch
分支概念
分支可以给使用者提供多个环境,用于把当前工作从开发主线上分离出来,而不影响主线。
场景:多人合作开发不同分支再合并 / 开发其他功能时紧急修复master主分区BUG
使用分支
- 查看目前所在分支:
git branch
- 创建分支:
git branch 分支名
- 切换分支:
git checkout 分支名
- 创建并切换到分支:
git checkout -b 分支名
- 创建并切换到分支:
- 合并其他分支到当前分支:
git merge 要合并过来的分支
- 要切换分支后再合并
- 可能产生冲突,需要手动解决
- 删除分支:
git branch -d xxx
工作流
分支至少要有两个
- master 主分支:只用保留正式,稳定的版本
- dev(开发) 分支:代码都在这儿写
github
push
上传代码到github
- 给远程仓库起别名
git romote add origin 远程仓库地址
- 向远程推送代码
git push -u 分支名称 #-u默认向master分支提交 git push #按照上次-u指定的分支自动提交 git push origin dev #手动指定提交的分支
clone
在别的电脑上下载代码
- 克隆远程仓库代码
git clone 远程仓库地址
- 更新远程仓库的部分代码到本地
git pull origin dev
场景实战
- 在公司新电脑上下载代码
git clone 远程仓库地址 git checkout 分支 #切换分支
- 下载完代码后继续开发
- 切换到dev分支进行开发
git checkout dev
- 把master分支合并到dev(仅一次)保证dev代码是master中最新的
git merge master
- 修改代码
- 提交代码
git add . git commit -m '今天干了啥' git push origin dev
- 下班回家继续写代码
- 切换到dev分支进行开发
git checkout dev
- 代码从远程仓库拉下来
git pull origin dev
- 继续开发
- 提交代码
git add . git commit -m '回家干了啥' git push origin dev
- 到公司继续开发
- 切换到dev分支
git checkout dev
- 拉最新的代码(无需clone,只需要pull获取最新的即可)
git pull prigin dev
- 继续开发
- 提交代码
- 开发完毕要上线
- 将dev分支合并到master, 进行上线
git checkout master git merge dev git push origin master
- 把dev分支也推送到远程保存代码
git checkout dev git merge master git push origin dev
偶然事件
公司开发了一半的功能忘记提交代码
#代码写了一半
git add .
git commit -m '忘记提交到云端'
git push ..... #忘记push了
回家又开发了新代码后提交了
#写了其他代码
git add .
git commit -m '在家写了其他代码'
git push origin dev
到公司再次拉的时候会进行合并,合并时如果有共同修改的代码就会发生冲突
git pull origin dev
CONFLICT(content): Merge conflict in xxxx(冲突的文件)
冲突的代码两个记录都会保存下来, 需要手动解决冲突,解决完后继续开发
代码开发完
git add.
git commit -m '合并后开发完毕'
git push origin dev
命令总结
git pull拆分
git pull origin dev //远程仓库到工作区
相当于:
git fetch origin dev //从远程仓库拉到本地版本库
git merge origin/dev //通过版本库更新到工作区
rebase变基
使git的提交记录变得简洁,不分叉
整合记录
很多时候中间的提交记录对别人是没有意义的, 因此把多个提交记录整合成一个记录
git rebase -i + 版本号 //把最新的版本到指定版本号版本中间的记录进行合并
git rebase -i HEAD~xxx //把最新的版本往前xxx个版本之间的记录进行合并
出现的配置文本中,把版本号前的Pick改成需要的命令,并保存
如s :把本版本提交记录合并到上一个版本
保存后可以修改合并后的提交信息
注意: 不要合并已经push到仓库的版本的记录,和本地不一致造成麻烦
记录归并
把不同分支的提交合并
- 切回到dev分支
git checkout dev
- 把master分支内容合并到dev, 并且代码也会拉下来
git rebase master
- 切换回master分支, 把 dev 合并回来
git checkout master get merge dev
解决合并时分叉
从远程拉回有差异的代码时, 不使用 git pull , 将其拆成 fetch 和 merge,
其中 merge 时使用记录归并的方式
git fetch origin dev
git rebase origin/dev
rebase产生冲突
若 rebase 时产生冲突
-
- 解决冲突 : git add ..
-
- 解决后继续: git rebase --continue
byond compare 快速解决冲突
- 在git中配置bc作为解决冲突的工具
git config --local(只对当前项目有效) merge.tool bc //bc 是给byond compare起名字 git config --local mergetool.path '/xxx/xx/xx' //byond compare 安装目录 git config --local mergetool.keepBackup false //让bc 不保留原文件备份
- 应用 bc 解决冲突
git mergetool
多人协同开发
gitflow 工作流
github 中的实践
创建仓库
两种形式:合作者和组织
合作者
将用户添加到仓库合作者中,用户就能向仓库提交代码
通常个人使用此方式
组织
将成员邀请加入组织,组织下可以创建多个仓库,组织成员可以向组织下的仓库提交代码
通常企业使用此方式
基于Tag管理
使用版本的哈希值过于繁琐,因此使用正常人对版本的理解
- 创建本地tag信息
git tag -a v1.0 -m '版本介绍'
- 删除tag
git tag -d v1.0
- 本地tag信息推送到远程
git push origin --tags
- 更新本地tag版本信息
git pull origin --tags
- 切换tag
git checkout v1.0
- 下载指定tag的代码
git clone -b v0.1 远程地址
邀请成员
进入组织
- 默认只有读权限
成为项目合作者
- 具有修改权限
成员开发
- 代码下载下来
git clone xxxx地址 cd ..目录 git checkout dev #切换到dev分支 git checkout -b 斗地主 #在dev上创建自己的功能分支
- coding......
- 提交代码
git add . git commit -m '斗地主开发完成' git push origin 斗地主
code review
使用github中的 pull request实现
配置
设置代码review之后才能合并到dev分支
成员提交 code review 申请
组长做review
提测上线(预发布)
- 基于 dev 分支 创建release分支
git checkout dev git checkout -b release
- 开始测试等操作
- 合并到master
使用pull request合并 或 本地将release合并到master分支
- 在master分支打 tag
git tag -a v2 -m '第二版斗地主功能' git push origin --tags
- 运维人员下载代码进行上线
git clone -b v2 地址
开源项目贡献代码
- fork源代码,源码拷贝到自己的仓库
- 在自己的仓库进行修改代码
- 按照以前的流程:
cd ... #指定目录 git clone xxx #下载下来
- 修改代码
- 提交到自己仓库
git add . git commit -m '改了BUG' git push origin master
- 按照以前的流程:
- 给源代码作者提交 pull request 申请
- 对方就会进行审核
其他
git配置文件
项目配置文件
项目/.git/config
git config --local user.name '小明'
git config --local user.email '[email protected]'
全局配置文件
~/.gitconfig
git config --global user.name '小明'
git config --global user.email '[email protected]'
系统配置
需要root权限,用的少
/etc/.gitconfig
git config --system user.name '小明'
git config --system user.email '[email protected]'
应用场景
常用的配置
git免密登录
URL中实现
原来的地址:https://github.com/WuPeiqi/dbhot.git
修改成免密登录地址:https://用户名:密码@github.com/WuPeiqi/dbhot.git
git romote add origin https://用户名:密码@github.com/WuPeiqi/dbhot.git
git push origin master
SSH实现
企业用的多
- 生成公钥和私钥
ssh-keygen
- 默认放在 /.ssh 目录下
- id_rsa.pub是公钥
- id_rsa私钥
- 拷贝公钥内容,设置到github
- 在git本地配置ssh地址
git remote add prigin xxx(ssh协议地址)
- 以后直接使用
git自动管理凭证
本地用的多
git忽略文件
让git不去管理当前目录下的某些文件
- 创建一个.gitignore文件
- 在里里面直接写忽略的文件名
- 或者使用通配符,子目录,正则等
- *.h
- !a.h
- files/
- *.py[a|b|c]
任务管理相关
issues
相当于是个讨论问题,反馈BUG,指定问题的类型,还能指派问题给谁
wiki
项目文档