git知识点大全
git是什么?
- 分布式
- 版本控制
- 文件
- 本地 : 1个文件 —-> 保留
- 集中化版本控制(SVN) – 本地没有版本控制
- 分布式版本控制 – 本地版本控制,版本更新先提交到本地,然后提交到服务器
- 软件,安装在电脑中
安装git
安装git只能在本地自己做版本控制,如果要在云端,需要github仓库支持
版本控制步骤
- 进入要管理的文件夹
- 初始化(git init)
- 管理
- 生成版本
第一次提交过程
- git init //初始化项目目录,生成.git文件夹
- git status //检查目录中所有文件的状态
- git add . //将上一步标红的(未提交版本控制的文件)文件提交,再次执行git status可以看到上一次标红的文件全部变绿了,代表已经对这些文件进行了版本控制
- git commit -m ‘v1’ //将之前add的文件作为v1版本的内容进行提交
- git status //查看,提示On branch master nothing to commit working tree clean,没有可提交的文件
修改后第二次提交
- 这时候如果我对index.html的文件内容进行了修改,执行git status,它会将index.html与v1版本中的进行对比,发现不一样,标红
- 执行 git add index.html //添加修改修改后的index.html到暂存区
- 执行git commit -m ‘v2’ //新生成一个版本v2(包含修改过后的index.html)
- 执行git log 命令查看提交版本记录v1和v2
第一次执行git commit会提示让你配置用户信息(这个用户只是一个标识,而不是github账户名密码,随便填也可以,最好和github账号一致)
- git config –global user.email ‘your@example.com’
- git config –global user.name ‘your name’
- 按照步骤走了就可以
github和码云切换登录
github和码云的登录凭证存储在 控制面板\所有控制面板项\凭据管理器 ——-windows凭证
安装TortoiseGIT(git的gui界面)
- TortoiseGIT和TortoiseSVN不是一个东西
- SVN和GIT版本控制的区别?
- GIT分布式,SVN集中式
- GIT概念多,SVN简单易上手
- GIT分支廉价,SVN分支昂贵
- 安装包和中文包地址都在:https://tortoisegit.org/download/
- 安装完了以后要重启电脑,才能看到红绿图标
- 使用git作为版本控制软件的项目,受控文件是绿色,修改或者新增的文件是红色。和git status颜色显示一致
- 拉取pull
- 获取fetch
- 使用tortoisegit能够以图形界面方式进行代码clone、pull、push 、merge等等操作
- TortoiseGit 克隆项目时会自动设置origin为克隆地址,方便使用
- 码云可以创建发行版,发行版根据tag发行,v1.0 v2.0根据tag发行以后会将该版本的代码打包成一个压缩包,可以下载并部署。
- 码云可以部署master做简单网页预览,在服务–》gitee pages页面中可以部署,部署成功后会生成一个网址可供访问。这个网址不是跟随master分支随时变化的,需要手动更新一下
git三大区域
- 工作区
- 已管理
- 修改 —- 红色
- 新增 —- 红色
- 工作区执行git add将数据推向暂存区
- 暂存区 绿色
- 暂存区执行git commit -m ‘vname’将数据推向版本库
- 版本库


git pull origin dev 等价于 git fetch origin dev git merge origin/dev 两句语句
回滚
- 先执行git log获取要回滚版本的唯一id
- 执行 git reset –hard 版本号
- git reset –hard 478f849dac78a6a1b0ee17e86f42c81d52e20392 回滚到v1版本
这个时候执行git log只能看到v1版本,那么如果有一天想要恢复v3版本?该怎么做?
- 执行git reflog,可以查看更详细的版本更新记录
- 可以查看到v3版本的id,执行 git reset –hard c485caf即可回滚到v3
- 执行git log,可以看到版本v1 v2 v3都出现了,v3是当前的版本
- git checkout index.html,将从版本库中下载最新的index.html,覆盖本地
- v2版本相对v1版本只保留修改的或者新增的部分,不变的文件用指针指向v1
分支

git branch查看目前所处的分支 :输出结果是 主分支master,我们已经在主分支上开发到了v3版本
git branch dev,新增一个分支,分支名是dev
再次执行查看git branch所有分支,输出结果有一个master和一个dev,master分支高亮显示,表示当前是master分支
如果要跳到dev分支开发新功能,执行 git checkout dev 切换到dev分支
这时可以打开index.html编写dev分支的代码,如果要切换到master分支,必须要将修改后得的代码 git add 和git commit到版本库,否则不能切换,切换会有提示
执行git checkout master,跳转到主分支
这时如果(线上环境)主分支代码出现bug,需要紧急修改,再新增一个分支,执行git branch bug,分支名是bug
切换到bug分支
git checkout bug在bug分支中修改代码,解决bug解决完bug以后在bug分支执行 git add index.html git commit -m ‘resolve bug’,将解决后的代码保存到版本库,注意,此时代码仍然处于bug分支中,而不是主分支master中,要想解决线上bug(master分支),需要将bug分支合并到master分支中
切换到master分支(git checkout master) ,执行git merge bug,将bug分支与主分支master合并,合并完成后bug分支已经没用了,需要执行
git branch -d bug删除该分支
bug解决完毕以后,切换到dev分支继续开发新功能,新功能开发完毕以后 执行 git add和git commit添加到版本库,然后切换到master分支执行git merge dev进行合并
合并时由于bug分支和dev分支修改了同一处代码,导致冲突,需要打开该文件,手动修改冲突

- 修改完后,执行
git add index.htmlgit commit -m 'V final',将修改后的文件推送到版本库,此时已经解决冲突并且将dev分支成功合并到master分支
- 修改完后,执行
总结:以后开发新功能,必须新建一个分支开发。master分支一般就是项目上线环境,出bug的话就在master上新建一个分支进行修改,修改后合并到主分支中
git工作流
master相当于上线版本,只放开发测试好的稳定功能
dev分支上面写代码,开发新功能,功能通过测试后合并到master分支上
基于github做代码托管
上班第一天早上(家里)
注:2019年开始github私有仓库也不收费了。

创建好仓库以后,获得仓库的地址 https://github.com/Hexi1997/dbhot.git
执行
git remote add origin https://github.com/Hexi1997/dbhot.git 为这个仓库地址起一个别名,叫origin
执行git push -u origin master 将master分支推送到 github 仓库。如果是第一次推送,会让你登录github账号,登录即可
github现在默认分支是main,可能会造成一些问题,就是你更新了但是不能第一时间看到,需要手动切换到master分支才能看到
这里需要设置一次default branch为master,舒服了
以后推送都可以看到
执行 git push -u orgin dev将dev分支推送到远端
上班第一天白天(公司)
现在在家里将代码推送到服务器端,如果我上班了,换一台公司空白电脑,需要执行 git clone https://github.com/Hexi1997/dbhot.git 初次获取仓库代码,继续编写,在clone的文件夹中执行git branch发现只有master分支,其实不是这样的,dev分支也被clone下来了。可以执行 git checkout dev切换到dev分支
在公司里,要继续开发肯定是在dev分支上继续开发,之前在家里将dev分支merge到master分支,master分支是最新的代码,肯定是在最新的代码进行开发。需要将dev分支与master分支保持一致,在dev分支下执行 git merge master,继续在dev分支中开发即可
上班第一天下班前(公司)
公司下班时候,如果dev分支功能没有开发完毕,首先需要git add和git commit,将代码推送到本地版本库,然后需要代码推送到远程仓库dev分支中 git push -u origin dev
上班第一天下班后(家里)
继续在dev分支中开发,需要拉取dev中最新代码。执行 git pull origin dev即可
加班加点写代码,写完以后和下班前执行一样步骤 git add git commit git push,睡觉
上班第二天(公司)
继续在dev中开发,这次不能直接git clone,应该使用 git pull origin dev来拉取最新代码,然后再继续开发,下班前提交,如此往复
- https://www.cdnfine.com/a/news/mtbd/1229.html 解决github访问速度慢、pull push clone速度慢的一种解决办法。
- GitHub在国内访问速度慢的问题原因有很多,但最直接和最主要的原因是GitHub的分发加速网络的域名遭到dns污染 。为了解决这个问题可以通过ipaddress.com查询github.com的CDN节点ip,添加到host文件中。但是CDN节点ip是会变化的,有时候访问github慢可能是CDN节点变化了,需要重新按照上面链接的步骤执行
开发完毕要上线
- 切换到master分支,执行
git merge dev, 执行git push origin master将最新的master分支推送到远程。 - 切换到dev分支,执行
git merge master git push origin dev
突发事件
上班第三天下班前(公司)
白天在dev分支上继续开发新功能(index.html)中,只进行到50%。由于有急事,临走前只进行了git add和git commit,没有推送到远程仓库。
上班第三天下班后(家里)
事情解决后回到家中想继续开发新功能,执行git pull origin dev,发现没有白天写的代码。于是他进行了两步操作
* 凭借记忆在index.html中继续开发新功能
* 新增一个another.html写另一个功能
睡觉前他将所有新写的代码执行 git add / git commit , 然后执行git push origin dev将家中的代码推送到远程仓库
上班第四天白天(公司)
回到公司开始写代码之前第一步时拉取代码git pull origin dev,此时 新增的功能(another.html)和不冲突的代码会进行自动合并。但是index.html代码是冲突的,会提示conflict,需要手动编辑。

修改冲突后,继续在dev中开发,下班前执行git add / git commit , 最后执行git push origin dev 推送到远程仓库
上班第四天下班后(家里)
要继续开发,执行git pull origin dev获取最新代码即可
rebase应用场景(面试常问)
- rebase翻译过来就是变基
- rebase的作用是让代码的提交记录变得简洁
- 注意事项:
- 如果这条commit记录已经push到远程仓库了,最好不要将这条commit记录执行rebase,否则本地和远程版本库不一致,会很麻烦
场景一
如果某个大功能开发周期长,在dev分支提交commit了很多次,有很多记录。可以在push前通过rebase将多个提交记录整合成一个记录。
1 | 新建一个rebase文件夹测试 |
这个界面是vim编辑界面,让v2-v4之间如何合并
git 为我们提供了以下几个命令:
- pick:保留该commit(缩写:p)
- reword:保留该commit,但我需要修改该commit的注释(缩写:r)
- edit:保留该commit, 但我要停下来修改该提交(不仅仅修改注释)(缩写:e)
- squash:将该commit和前一个commit合并(缩写:s)
- fixup:将该commit和前一个commit合并,但我不要保留该提交的注释信息(缩写:f)
- exec:执行shell命令(缩写:x)
- drop:我要丢弃该commit(缩写:d)
根据我们的需求,我们将commit内容编辑如下(注意:
vim进入编辑是按键盘小写 i
vim编辑完后 按esc 后按住 shift和: 输入 wq表示保存并退出 。
然后弹出注释修改界面:
编辑完保存即可完成commit的合并了,执行git log可以查看最新的commit记录
是不是简洁了许多
场景二
将dev分支合并到主分支master

1 | 创建dev分支 |
使用merge方式
如果不用rebase,使用merge那么就是在master分支执行 git merge dev , 由于merge后会产生新版本,所以执行merge时会弹出vim框让你写新版本的注释,按照前面一样的编辑vim方法输入注释保存即可
执行git log –graph可以看到最新版本树,实际上使用merge仍然是两个分支
git log –graph –pretty=format:”%h %s”
使用rebase方式
1 | 由于之前dev分支的commit记录已经被merge。再在dev分支创建一个commit记录 |
这样就rebase完毕,执行 git log –graph可以看到最新的提交版本树状图,通过上面一段和下面一段的对比可以很明显的看到merge和rebase的区别,merge会分叉,rebase不会分叉
场景三
就是对应上面的突发事件:前一天晚上在公司忘了push,回家继续改然后push到远程仓库。第二天到公司先执行git pull 拉取代码,这时会进行merge操作。产生新的分支。如何解决这个问题呢?用rebase
前面说了
git pull origin dev 远程仓库 –>工作区
等价于
git fetch origin dev 远程仓库 –> 版本库
git merge origin/dev 版本库 –> 工作区
两句语句。所以在第二天工作的时候不用git pull拉取代码,而用
git fetch origin dev
git checkout dev
git rebase origin/dev origin/dev代表的是远程仓库的dev分支,将远程仓库的dev分支rebase到当前dev分支,即可获取最新代码。不会产生新的分支
- 执行git rebase产生冲突的时候?
- 手动解决冲突
- git add ….
- git rebase –continue
- 代码举例
还是继续用场景二的工程
1 | dev中修改1.py的值并commit |
beyond compare快速解决冲突
安装beyond compare,简称bc
给git配置bc4作为对比工具:可参考 https://segmentfault.com/a/1190000019606428?utm_source=tag-newest
应用beyond compare解决冲突
git mergetool ,会自动弹出bc4的对比界面,对比保存即可

解决冲突后仍然处于merging状态,那是因为没有git add和git commit
多人协同开发
gitflow工作流
项目经理也可以理解成小组长
这是一个正规的流程图,实际工作过程中往往不那么规范
在小公司,release阶段可能没有。
code review可能没有
实际案例
从头开始,新建一个项目,初始化代码和,在master提交一次到版本库。
1 | git init |
接下来要新建远程仓库地址来推送 ,有两种方式
第一种

1 | 然后执行如下代码推送main分支到远程仓库 |
推送成功以后,如果想让别人合作开发,需要如下图去邀请github账户,那么对方就是收到一条邮件,点击确认即可加入团队。
对方邮箱收到邀请
点击接受邀请即可
第二种
第一种方式不适用于公司,只适用于个人开发或者小团队开发
公司会先创建一个组织(类似部门),在组织里面再创建项目,让好多人都属于共同一个组织。协同开发
填写组织名 邮箱 组织属于
邀请用户,暂时可不邀请,之后再邀请
组织创建成功
在组织内新建一个仓库dbhot3(步骤同上面一样)
推送代码到远程仓库
1 | 然后执行如下代码推送main分支到远程仓库 |
github还有一个概念是team,一个team内有多个成员,属于一个团队。
team和项目都属于organization。team和项目是多对多的关系
题外话,现在区分版本号要么是用一长串的id,要么是用更新描述来区分,很不方便
所以引入tag概念,tag的命名一般是1.0.1之类
git tag是命令 1.0.1是版本号 -m后面是注释
打标签的操作发生在我们commit修改到本地仓库之后,push之前
1 | git tag -a 1.0.1 -m '第一次提交' |
推送标签到远程服务器
1 | 推送所有tag到远程服务器,普通的push不会推送tag,tag要单独推送git push origin --tags |
删除标签
1 | 删除本地标签git tag -d 1.0.1删除远程仓库标签git push origin:refs/tags/1.0.1 |
推送标签后再git中可以看到
现在完成了初始版本v1的内容推送。开始进行多人协同开发
第一步:明确关系
当前工程项目的创建者是 hexi1997,他拥有最高的权限
项目经理(hexi1997) – 负责项目任务分配 代码检查code review
程序员(hexixi2021) – 对应gitflow工作流图中 小弟A ,开发新功能
测试人员:由于没有那么多git账号,这里就用项目经理账号hexi1997进行测试,也是可以的
第二步:邀请成员
只需要邀请hexixi2021即可,hexixi2021同意即可加入
目前项目分支只有一个master,开发都是基于dev分支进行的,所以需要项目经理(hexi1997)创建一个dev分支并且推送到远程仓库
1 | 创建dev分支并且切换到dev分支git checkout -b dev推送dev分支到远程git push origin dev |
第三步:新成员在新分支开发新功能
hexixi2021用户入职第一天执行的操作
1 | 第一次需要clone仓库,将master分支和dev分支全部clone下来git clone https://github.com/hexi1990/dbhot3.gitcd dbhot3切换到dev分支git checkout dev在dev分支下新增一个分支(zjh)git checkout -b zjh新增一个zjh.html文件,用于开发功能Atouch zjh.htmlvim zjh.htmlgit add zjh.htmlgit commit -m 'zjh功能开发进度50%'执行git commit以后远程仓库中同步了一个分支zjh,回家 |
hexixi2021回家晚上继续开发
1 | 回家,首先拉取代码git pull origin dev继续编辑zjh.html,开发zjh功能vim zjh.html开发完成后推送到远程git add zjh.htmlgit commit -m 'zhj功能开发进度100%'git push origin zjh |
睡觉,第二天早上起来到公司上班,昨晚已经加班加点把zjh功能开发完毕,现在需要将zjh分支的代码合并到dev分支。因此找项目经理做code review,
第四步:code review
项目经理(小组长 hexi1997)如果想做code review,需要在github中先对dev分支进行规则设置(设置一次即可)

设置完成之后,hexixi2021需要到自己的github账户上去pull request

如此hexixi2021就已经提交code review请求完毕
项目经理 hexi1997登录github查看pull request可以看到刚刚发起的request,点击add your review执行code review
左边会罗列出zjh分支到master分支中的所有改变,如果全部确认无误后,点击 viewed代表已经做了code review
执行merge pull request命令,在远程仓库将zjh分支和合并到dev分支
如此,可以看到显示Merged,同时该request也会被关闭,注意下面有一个Delete branch分支,因为分支zjh已经开发完毕并且合并到dev分支,因此可以删除该分支,也可以不删
可以看到dev分支中已经包含zjh.html
项目经理在dev分支中执行 git pull origin dev 即可将远程仓库合并的代码更新到本地。
第五步:代码测试 、预发布(release)
项目经理hexi1997,操作生成一个release分支,并push到远程仓库,让测试员可以pull 并且进行测试,修改小bug(不能添加新功能)
1 | 切换到dev分支(重要)git checkout dev在dev分支中生成新分支release,专门用来做测试git checkout -b release将release分支推送到远程仓库,供测试人员测试git push origin release |
此时可以再安排一个人进行release分支代码测试和小bug修复,但是github账号有限,直接让项目经理(hexi1997 小组长)进行代码测试
1 | 切换到release分支git checkout release拉取最新代码git pull origin release |
在测试过程中如果代码没问题,没对release分支做修改,只需要将release分支合并到master分支上线即可。
在测试过程中如果代码有问题,release分支做了修改,需要将release分支合并master分支,同时也需要将release分支合并到dev分支。merge的操作通过github或者git命令都可以进行。
合并完成后需要将release分支删除
1 | 发现zjh.html有bug,解决该bugvim zjh.htmlgit add zjh.htmlgit commit -m 'release阶段发现zjh小Bug,已解决'切换到主分支git checkout main 将release分支合并到main分支git merge release打版本taggit tag -a v1.0.2 -m '新增扎金花功能'推送所有tag到远程服务器,普通的push不会推送tag,tag要单独推送git push origin --tags将main分支推送到远程仓库并且会被标记为v1.0.2git push origin main切换到dev分支git checkout dev将release分支合并到dev分支git merge release将dev分支push到远程仓库git push origin dev删除release分支git branch -d release |
给开源项目贡献代码
- 第一步:github上fork项目,别人的代码就进入了我的远程仓库
- 第二步:在本地git clone
- 修改代码,并git add / git commit
- 将修改的版本推送到远程仓库(git push)
- 在github上pull request,发起merge请求
配置文件存放的三个位置
1 | 配置信息存储在.git/config文件中,项目配置文件git config --local user.name ''git config --local user.email ''全局配置文件,存储在当前用户的home目录下gitconfig中(所有git项目目录通用)git config --global user.name ''git config --global user.email ''系统配置文件 /etc/.gitconfig ,需要有root权限git config --system user.name ''git config --system user.email '' |
优先级 项目>全局>系统
git免密登录
- 修改url
1 | 原来的地址 https://github.com/hexi1997/dbhot3.git修改的地址 https://用户名:密码@github.com/hexi1997/dbhot3.gitvim ./git/config修改配置 |
ssh实现(企业中使用较多)
git凭证管理(目前一般都是这样的)
gitignore忽略文件
让git不在管理指定文件/文件夹
1 | vim .gitignore 创建(如果没有)并编辑.gitignorea.py 排除a.pyb.py 排除b.py*.h 排除.h后缀名!a.h a.h仍然被管理files 排除files文件夹*.py[c|a|d] 排除.pyc .pya .pyd后缀名文件 |
一般可以github上搜索gitignore,根据语言选择即可
https://github.com/github/gitignore
任务管理相关
issues-
- bug管理
wiki
- 项目文档说明
github创建静态网页
略
码云
和github使用基本一致
不过码云个人私有仓库最多支持 5 人协作(如个人拥有多个私有仓库,所有协作人数总计不得超过 5 人)
github访问速度慢
码云部署静态服务很方便,点击服务–>git pages即可,例如 http://chen_hexi.gitee.io/dbhot/
删除分支命令
删除远程
1 | git push origin -d nav |
删除本地
1 | git branch -d nav |
补充知识
使用source tree图形化管理git分支
注意git reset –hard的使用,会覆盖本地未commit的代码
git submodules 子模块使用 https://zhuanlan.zhihu.com/p/97761640
子module通过设置.gitmodules来配置使用ssh,https://juejin.cn/post/6844904071757824007,ssh的clone和push成功率更高,https方式由于DNS污染成功率很低
Gitlab
一般是公司为了项目安全性部署在公司内网的git仓库。需要访问内网注册登录、生成ssh,其他使用与github基本一致。就是仓库不同而已。
https://www.jianshu.com/p/bf7b09e234c8

