Git 实战
入门
什么是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 reset --hard 版本号(commit后的字符串)
撤销
- 先使用
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/devrebase产生冲突
若 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 'xxx@qq.com'全局配置文件
~/.gitconfig
git config --global user.name '小明'
git config --global user.email 'xxx@qq.com'系统配置
需要root权限,用的少
/etc/.gitconfig
git config --system user.name '小明'
git config --system user.email 'xxx@qq.com'应用场景
常用的配置

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 masterSSH实现
企业用的多
- 生成公钥和私钥
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
项目文档

git 场景案例实例
浙公网安备 33010602011771号