什么是git
Git是一个分布式的版本控制的软件
- 分布式:
- 文件夹拷贝
- 本地版本控制
- 集中式版本控制
- 分布式版本控制
- 版本控制:毕业论文,写文案,需要反复修改和保留原始数据,代码也是。
- 软件:不必多说
##为什么要做版本控制
保留之前的版本,便于回滚修改。
git安装
https://git-scm.com/book/zh/v2/起步-安装-Git
git的三个区域
工作区
暂存区:git add,从工作区到暂存
版本库:commit,从暂存到版本库
代码管理过程
电脑上安装git之后,
Git进行版本控制需要如下步骤:
进入要管理的文件夹
执行初始化命令,给git提权
bashgit init #初始化后会出现一个.git存储一切与git有关的相关配置文件,存储所有git相关的配置,和全部的版本信息等。
查看管理目录下文件状态
bashgit status #注:已经通过 git add <文件名>管理起来的文件为绿色,还未add的文件为红色
将文件提交到暂存区(把代码管理起来)
bashgit add <文件名> # 将当前所有文件都管理起来 git add .
匹配个人信息:用户名,邮箱(最开始要)
bashgit config --global user.email "you@example.com" git config --global user.name "Your name"
将代码从暂存区提交到版本库,生成版本及版本信息
bash# m是message的缩写 git commit -m '描述信息' #此时再查看文件,什么都没有,因为已经生成了一个版本 git status
查看当前所有的版本记录
bashgit log # 以图形化显示提交记录 git log --graph # 图形化展示简洁版记录 git log --graph --pretty=format:"%h %s"

回滚
- 回滚到之前的版本
#彻底回滚
# --hard 此模式会永久丢失所有未提交到版本库的代码,包括工作区,暂存区的全部未提交代码,谨慎使用!!!
git reset --hard <版本号>
- 回滚到当前版本之后的版本
#如果回滚到之前的版本后,使用git log 是无法查看当前版本之后的版本号的,
#此时使用如下命令,查看全部版本号,ref 是 reference 的缩写
git reflog
#回滚
git reset --hard <版本号>
回滚的各种模式
具体哪滚到哪,看下面的图
基本就checkout
和 --hard
用的多。
#彻底回滚,
#--hard回永久丢失所有未提交到版本库的代码,包括工作区,暂存区的全部未提交代码,使用前记得搞一个新的分支,把代码备份,然后再--hard彻底回滚!!!
git reset --hard <版本号>
#回滚到修改后,提交前的状态
git reset --mixed <版本号>
#将尚未提交的代码回滚到修改之前的状态
git checkout -- <文件名>
git checkout -- index.html #注意:--前后都有空格,不然报错
#从暂存区回滚到工作区
git reset HEAD -- <文件名>
git reset HEAD -- index.html
#从版本库回滚到暂存取
git reset --soft <版本号>

版本控制的原理
- 就是一个像快照一样的东西
- 每一版本只保存相较于上一个版本变化或新增的部分,生成一个commit对象
- 在各个commit对象之间,有一个指针,将所有的commit对象连接起来,如上图
- 然后回滚版本的时候,就找到对应的commit对象,及根据指针找到所有之前的commit对象
- 就实现了版本控制
分支
分支可以给使用者提供多个环境,意味着可以将正在写的代码和主线分隔开,以免影响主线代码。
分支命令
查看当前分支
bashgit branch
创建分支
bashgit branch <分支名字>
切换分支
bashgit checkout <分支名字>
分支合并
可能产生冲突,如下图约饭的部分,产生冲突后只能手动解决,解决后再次提交
产生冲突的部分会同时出现在文件里,如下图。
bashgit merge <要合并的分支> # 比如说把develop的分支merge到自己的分支 # 先 git checkout sunminghong # git merge develop # 不要搞反了
删除分支
bashgit branch -d <分支名字>
工作流
开发规范:至少要有两条工作流,main里只放稳定版代码,别瞎搞!!!
推代码的流程
创建个仓库
把本地代码推到运程仓库
- 初始化本地仓库:
bashgit init
- 添加远程连接,连接到仓库:
bash# 给仓库起个别名origin git remote add origin <你的仓库URL>
- 添加文件到暂存区:
git add .
- 生成版本信息,并提交到版本库
bashgit commit -m "版本信息"
- 推送到远程仓库:
bash# 一次推送全部分支到仓库origin git push --all origin # -u 会设置origin为默认仓库,下次push时直接 git push 就可以了 git push -u <仓库别名> <分支名字> #举个例子 git push -u origin main
拉代码的流程
- 克隆远程仓库代码
git clone <仓库URL>
- 拉代码
git pull
合并产生冲突的解决方案

- 会显示哪个文件有冲突
- 手动解决
Rebase变基
- 团队协作时,你的大多数提交版本,对于别人来说并不重要,别人只需要最终的结果
- rebase可以将多个提交记录整合为一个
- 但如果已经push到仓库了,不建议使用Rebase
- 两种合并方式,如下
# 从最新版本开始合并之前的n条记录
rebase -i Head~n
#从最新版本到写入的版本合并
rebase -i <版本号>
- 合并后,输出如下

将上述花圈的位置pick改为s
- s的意思是将v4合并到上一版本v3,将v3合并到上一版本v2
然后
:wq!
保存再修改上图画圈位置的描述信息,完成
如果已经提交到仓库了,不建议Rebase,在本地可以搞
Rebase用法二
春生在公司写的代码只提交到了版本库,忘记推到远程仓库了
春生回家后又写了别的功能的代码,推到了远程仓库
第二天去公司要拉代码,但如果使用
git pull
会产生分叉此时可以如下操作,就不会产生分叉
bash# git pull origin dev = git fetch origin dev + git merge git fetch origin dev # 把代码拉到版本库 git rebase origin/dev #从代码库合并到工作区
使用Beyond Compare解决冲突
- 下载Beyond Compare
- 在git 中配置
git config --local merge.tool bc3
git config --local mergetool.path '/usr/local/bin/bcomp'
git config --local mergetool.keepBackup false
- 使用Beyond Compare解决冲突,输入如下命令,软件就会自动启动,如下图
git mergetool

多人协同开发git flow工作流(分支)
- 每一个人有一个自己的分支,在自己的分支上写代码
- 每个人的分支是从dev分支拆分出来的

线上代码出bug了,怎么处理
- 创建一个临时分支,比如叫bug,用于修复bug
- 修复好后,合并回main分支,并删除临时分支bug
多人协同开发之创建初始项目和版本
创建项目仓库
给成员们授权(两种方式)
方式一:
- 点进项目
- settings -> collaborates,如下图,邀请成员即可
方式二
创建一个组织
在组织里创建项目仓库
使用tag,代替版本号,进行版本管理
在commit 版本信息之后打tag
- bash
# 在本地给刚刚commit的版本,打tag信息,v1.0,-a 是annotated tag 的缩写,打标签的意思 git tag -a v1.0 -m '版本信息' # 举个例子 git tag -a v1.0 -m '第一版' # 删除tag信息 git tag -d v1.0 # 提交到远程仓库 git push origin --tags #从远程仓库拉代码 git pull origin --tags # 切换到版本 git checkout v.10 #clone 版本代码 git clone -b v1.0 地址
开发完成后需要做code review
给分支配置,发起请求,同意后才可以合并
Review没问题之后,才合并到dev分支
通过创建pull request 来做code review
进入项目仓库 -> protect this branch
往下拉,在Rules里选择 require a pull request before merging
如何发起一个合并请求
- 点击pull request
- 点击new pull request
- 选择要合并的两个分支
- 点击view pull request
- 点击merge pull request

组长做code review
Pull request 的地方会有提示,有人发起了merge 请求,如下图
点进去后,files changed处可以review code
没问题后,merge pull request,允许合并
くすくくすく
查看有没有大文件被追踪
git rev-list --objects --all | grep "$(git verify-pack -v .git/objects/pack/*.idx | sort -k 3 -n | tail -10 | awk '{print $1}')"