Git分布式版本控制工具
1 | #常用命令汇总 |
Git分布式版本控制工具
1、目标
- 了解Git基本概念
- 能够概述git工作流程
- 能够使用Git常用命令
- 熟悉Git代码托管服务
- 能够使用idea操作git
2、概述
2.1、开发中的实际场景
- 场景一:备份 小明负责的模块就要完成了,就在即将Release之前的一瞬间,电脑突然蓝屏,硬盘光荣牺牲!几个月来的努力付之东流。
- 场景二:代码还原 这个项目中需要一个很复杂的功能,老王摸索了一个星期终于有眉目了,可是这被改得面目全非的代码已经回不到从前了。什么地方能买到哆啦A梦的时光机啊?
- 场景三:协同开发 小刚和小强先后从文件服务器上下载了同一个文件:
Analysis.java。小刚在Analysis.java文件中的第30行声明了一个方法,叫count(),先保存到了文件服务器上;小强在Analysis.java文件中的第50行声明了一个方法,叫sum(),也随后保存到了文件服务器上,于是,count()方法就只存在于小刚的记忆中了。 - 场景四:追溯问题代码的编写人和编写时间 老王是另一位项目经理,每次因为项目进度挨骂之后,他都不知道该扣哪个程序员的工资!就拿这次来说吧,有个Bug调试了30多个小时才知道是因为相关属性没有在应用初始化时赋值!可是二胖、王东、刘流和正经牛都不承认是自己干的。
2.2、版本控制器的方式
a、集中式版本控制工具
集中式版本控制工具,版本库是集中存放在中央服务器的,团队里每个人工作时从中央服务器下载代码,必须联网才能工作(局域网或互联网),个人修改后提交到中央版本库。
- 举例:SVN和CVS
b、分布式版本控制工具
分布式版本控制系统没有“中央服务器”,每个人的电脑上都是一个完整的版本库,工作时无需联网。多人协作只需要各自将修改推送给对方,就能互相看到对方的修改。
- 举例:Git
2.3、SVN
原讲义此处为SVN集中式架构示意图,无独立图片资源
2.4、Git
Git是分布式的,不需要中心服务器,每台电脑拥有的内容都是一致的。我们使用中心服务器仅仅是为了方便交换大家的修改,服务器的地位和每个人的PC相同,只是作为不关机的交换节点存在。
git是一个开源的分布式版本控制系统,可以高效、高速地处理从很小到非常大的项目版本管理。Git是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的开放源码版本控制软件。
Git诞生于2005年:此前Linux内核社区使用BitKeeper进行版本管理,2005年双方合作终止,Linus Torvalds基于使用BitKeeper的经验,开发了全新的分布式版本控制系统Git,并制定了系统目标:
- 速度快
- 简单的设计
- 对非线性开发模式的强力支持(允许成千上万个并行开发的分支)
- 完全分布式
- 有能力高效管理类似 Linux 内核一样的超大规模项目(速度和数据量)
原讲义此处为Git分布式架构示意图,标注有“共享版本库/远程仓库、PULL、PUSH、Clone、本地仓库、开发人员、Commit”等内容,无独立图片资源
2.5、Git工作流程图
原讲义此处为Git工作流程示意图,展示工作区、暂存区、本地仓库、远程仓库的状态流转,无独立图片资源
核心命令说明:
- clone(克隆):从远程仓库中克隆代码到本地仓库
- checkout(检出):从本地仓库中检出一个仓库分支然后进行修订
- add(添加):在提交前先将代码提交到暂存区
- commit(提交):提交到本地仓库,本地仓库中保存修改的各个历史版本
- fetch(抓取):从远程库抓取到本地仓库,不进行任何的合并动作,日常使用较少
- pull(拉取):从远程库拉到本地库,自动进行合并(merge)并更新到工作区,等同于
fetch+merge - push(推送):修改完成后,将代码推送到远程仓库,和团队成员共享
3、Git安装与常用命令
本教程的git命令均在Git Bash中演示,提前说明常用基础Linux命令:
ls/ll:查看当前目录cat:查看文件内容touch:创建文件vi:vi编辑器(仅用于演示,可替换为记事本、VS Code等其他编辑器)
3.1、 Git环境配置
3.1.1 下载与安装
- 官方下载地址:https://git-scm.com/download
- 下载后得到安装包(例如
Git-2.20.1-64-bit.exe),双击按向导完成安装 - 验证安装:在任意文件夹右键,出现
Git GUI Here和Git Bash Here选项即为安装成功
备注:
- Git GUI:Git官方提供的图形界面工具
- Git Bash:Git提供的命令行工具
安装完成后,第一步需要配置用户名称和邮箱地址——每次Git提交都会携带该用户信息,用于标识提交人。
3.1.2 基本配置
- 打开Git Bash
- 设置用户信息
1 | git config --global user.name "itcast" |
- 查看配置信息
1 | git config --global user.name |
3.1.3 为常用指令配置别名(可选)
部分常用命令参数繁多,可通过配置别名简化输入。
- 创建配置文件 Windows系统无法直接创建点开头的文件,可在Git Bash中执行:
1 | touch ~/.bashrc |
- 编辑
.bashrc文件,添加别名规则
1 | # 用于输出精简的git提交日志 |
- 执行命令使配置立即生效
1 | source ~/.bashrc |
3.1.4 解决GitBash乱码问题
- 执行Git全局配置命令
1 | git config --global core.quotepath false |
- 编辑Git安装目录下的
etc/bash.bashrc文件,在末尾添加两行
1 | export LANG="zh_CN.UTF-8" |
3.2、获取本地仓库
要使用Git管理代码,首先需要创建本地仓库:
- 在电脑任意位置创建一个空文件夹(例如
git-test) - 进入文件夹,右键打开Git Bash
- 执行初始化命令
1 | git init |
- 初始化成功后,文件夹内会生成隐藏的
.git目录,该目录即为Git的本地仓库数据
操作示例:
1 | $ git init |
3.3、基础操作指令
Git工作目录中,文件的修改(新增、删除、更新)存在不同状态,通过Git命令可以在状态间流转。
原讲义此处为文件状态流转示意图,展示工作区、暂存区、本地仓库的状态转换关系,无独立图片资源
核心状态转换命令:
git add:工作区 → 暂存区git commit:暂存区 → 本地仓库
3.3.1、查看修改的状态(status)
- 作用:查看工作区、暂存区的文件修改状态
- 命令:
1 | git status |
3.3.2、添加工作区到暂存区(add)
- 作用:将单个或多个文件的修改添加到暂存区
- 命令:
1 | # 添加单个文件 |
3.3.3、提交暂存区到本地仓库(commit)
- 作用:将暂存区的内容提交到本地仓库的当前分支,生成永久提交记录
- 命令:
1 | git commit -m '提交注释内容' |
3.3.4、查看提交日志(log)
前文配置的git-log别名即为精简日志命令,也可手动添加参数使用。
- 作用:查看分支的提交历史记录
- 命令:
1 | git log [可选参数] |
- 常用参数:
--all:显示所有分支的提交--pretty=oneline:将每条提交信息显示为一行--abbrev-commit:简化显示commit ID--graph:以图形化形式显示分支合并关系
3.3.5、版本回退
- 作用:切换到指定的历史提交版本
- 命令:
1 | git reset --hard commitID |
1 | git reset HEAD~1 本地分支回退,不会影响远程 |
| 命令 | 是否删除历史提交 | 能否直接 push 远程 | 适用场景 |
|---|---|---|---|
| git reset HEAD~1 | 本地删除原有提交 | 已推送则不能直接 push,强制推送有风险 | 提交仅存在本地,未推远程 |
| git revert HEAD | 保留原提交,新增反向提交 | 可正常 push,无风险 | 提交已推送到远程 / 多人协作公共分支 |
commitID可通过git log或git-log查看
查看已删除的提交记录: 使用
git reflog命令,可以查看所有操作记录(包括已被回退删除的提交)
3.3.6、添加文件至忽略列表
部分文件无需纳入Git管理(例如编译产物、日志文件、本地配置文件等),可通过.gitignore文件配置忽略规则。
在工作目录创建名为.gitignore的文件(文件名固定),写入需要忽略的文件模式,示例:
1 | # 忽略所有.a后缀的文件 |
练习:基础操作
1 | ##################### 仓库初始化 |
3.4、分支
几乎所有版本控制系统都支持分支。使用分支可以将开发工作从主线上分离,在独立分支上开发新功能、修复Bug,避免影响主线代码。
3.4.1、查看本地分支
1 | git branch |
3.4.2、创建本地分支
1 | git branch 分支名 |
3.4.4、切换分支(checkout)
1 | # 切换到已存在的分支 |

相对引用最多的就是移动分支。可以直接使用 -f 选项让分支指向另一个提交。例如:
1 | git branch -f main HEAD~3 |
上面的命令会将 main 分支强制指向 HEAD 的第 3 级 parent 提交。
3.4.6、合并分支(merge)
将目标分支的提交合并到当前分支:
1 | git merge 分支名称 |
3.4.7、删除分支
注意:不能删除当前所在的分支,需先切换到其他分支再执行删除
1 | # 常规删除:会检查分支是否已合并,未合并则拒绝删除 |
3.4.8、解决冲突
当两个分支同时修改了同一个文件的同一行代码,合并时会产生冲突,需要手动解决。
解决步骤:
- 打开冲突文件,编辑冲突内容,保留最终需要的代码
- 将解决完冲突的文件重新加入暂存区(
git add) - 提交到仓库完成合并(
git commit)
冲突文件的标记格式:
1 | <<<<<<< HEAD |
操作示例:
1 | $ git merge dev |
3.4.9、开发中分支使用原则与流程
实际项目开发中,通常会划分不同职能的分支,遵循标准的分支管理流程:
- master(生产)分支:线上主分支,对应正式运行的代码,中小规模项目直接作为线上分支。
- develop(开发)分支:从master创建,作为开发团队的主开发分支,日常开发都在此分支进行;阶段开发完成后,合并到master分支准备上线。
- feature/xxxx 功能分支:从develop创建,用于并行开发不同期上线的功能,功能开发完成后合并回develop分支。
- hotfix/xxxx 修复分支:从master派生,用于紧急修复线上Bug,修复完成后需要同时合并到master、develop等分支。
除此之外还有test(测试)分支、pre(预上线)分支等,根据项目规模按需使用。
原讲义此处为分支流转生命周期示意图,无独立图片资源
练习:分支操作
1 | ########################### 创建并切换分支 |
4、 Git远程仓库
4.1、 常用的代码托管服务
Git仓库分为本地仓库和远程仓库,我们可以借助第三方代码托管平台搭建远程仓库,主流平台有:
- GitHub:地址 https://github.com/ ,全球最大的开源代码托管平台,仅支持Git格式,开源项目免费使用。
- 码云(Gitee):地址 https://gitee.com/ ,国内的代码托管平台,服务器在国内,访问速度更快,支持私有仓库。
- GitLab:地址 https://about.gitlab.com/ ,开源的仓库管理系统,通常用于企业、学校内部搭建私有Git私服。
4.2、 注册码云
使用码云服务需要先注册账号,注册地址:https://gitee.com/signup
原讲义此处为码云注册页面示意图,无独立图片资源
4.3、 创建远程仓库
创建步骤:
- 登录码云,点击右上角「+」→「新建仓库」
- 填写仓库名称,仓库路径会自动生成
- 填写仓库介绍(非必填)
- 选择仓库权限:公开/私有(私有仓库免费版最多支持5人协作)
- 不要勾选「使用Readme文件初始化这个仓库」等初始化选项
- 点击「创建」完成仓库建立
创建完成后,在仓库页面选择「SSH」方式,即可获取远程仓库地址,格式例如:git@gitee.com:用户名/git_test.git
原讲义此处为码云创建仓库页面、仓库地址页面示意图,无独立图片资源
4.4、配置SSH公钥
使用SSH方式访问远程仓库,需要配置SSH公钥实现免密登录。
- 生成SSH公钥 打开Git Bash,执行命令,连续按三次回车即可:
1 | ssh-keygen -t rsa |
如果本地已有公钥,会自动覆盖。
- 获取公钥内容
1 | cat ~/.ssh/id_rsa.pub |
复制输出的全部公钥内容。
- 码云添加公钥
- 进入码云「设置」→「SSH公钥」页面
- 填写公钥标题(自定义)
- 将复制的公钥内容粘贴到公钥输入框
- 点击「确定」完成添加
- 验证配置是否成功
1 | ssh -T git@gitee.com |
提示欢迎信息即为配置成功。
原讲义此处为码云SSH公钥配置页面示意图,无独立图片资源
4.5、操作远程仓库
4.5.1、添加远程仓库
先有本地仓库,再关联已创建的远程仓库:
- 命令格式:
1 | git remote add <远端名称> <仓库路径> |
- 远端名称默认叫
origin,可自定义 - 仓库路径即远程仓库的SSH/HTTPS地址
- 示例:
1 | git remote add origin git@gitee.com:czbk_zhang_meng/git_test.git |
4.5.2、查看远程仓库
1 | git remote |
4.5.3、推送到远程仓库
将本地分支的提交推送到远程仓库:
- 命令格式:
1 | git push [-f] [--set-upstream] [远端名称] [本地分支名][:远端分支名] |
- 常用用法:
1 | # 本地分支和远程分支同名时,可简写 |
- 分支建立关联后,后续推送可直接简写为:
1 | git push |
操作示例:
1 | $ git push --set-upstream origin master |
4.5.4、 查看分支关联关系
查看本地分支与远程分支的跟踪关系:
1 | git branch -vv |
4.5.5、从远程仓库克隆
已有远程仓库时,直接克隆到本地生成完整的本地仓库:
- 命令格式:
1 | git clone <仓库路径> [本地目录名] |
- 本地目录名可省略,省略后自动使用仓库名作为目录名
操作示例:
1 | $ git clone https://gitee.com/czbk_zhang_meng/git_test.git |
4.5.6、从远程仓库中抓取和拉取
- 抓取(fetch) 将远程仓库的更新下载到本地,但不会自动合并,需要手动执行merge操作。
1 | # 抓取指定远程的指定分支 |
- 拉取(pull) 将远程仓库的更新下载到本地,并自动合并到当前分支,等同于
fetch + merge。
1 | # 拉取指定远程的指定分支 |
操作示例:
- 仓库A提交修改并推送到远程
1 | touch file05.txt |
- 仓库B拉取远程更新
1 | $ git pull |
4.5.7、解决远程合并冲突
多人协作时,A、B两人同时修改了同一个文件的同一行,A先推送到远程,B推送时会失败。
解决流程:
- B先执行
git pull拉取远程最新代码 - 本地自动合并失败,产生冲突
- B手动解决本地冲突,add后commit提交
- 再次执行
git push推送到远程
远程冲突的解决方式和本地分支冲突完全一致。
原讲义此处为远程冲突解决流程示意图,无独立图片资源
练习:远程仓库操作
1 | ########################## 1. 本地仓库推送远程 |
5、在Idea中使用Git
5.1、在Idea中配置Git
IntelliJ IDEA会自动识别默认路径的Git,如果修改了Git安装路径,需要手动配置:
- 打开
File → Settings设置窗口 - 找到
Version Control → Git选项 - 在
Path to Git executable中选择Git安装目录下的git.exe - 点击
Test按钮,提示执行成功即配置完成
原讲义此处为IDEA Git配置页面示意图,无独立图片资源
5.2、在Idea中操作Git
场景:本地已有一个非Git管理的项目,需要上传到码云远程仓库,实现团队协作。
5.2.1、创建项目远程仓库(参照4.3)
在码云创建对应项目的仓库,例如springmvc_demo,不要勾选任何初始化选项,创建后复制仓库地址。
原讲义此处为码云创建项目仓库页面示意图,无独立图片资源
5.2.2、初始化本地仓库
- 在IDEA中打开目标项目
- 顶部菜单选择
VCS → Import into Version Control → Create Git Repository - 选择当前项目根目录作为仓库目录,点击OK
- 将准备好的
.gitignore文件放入项目根目录
原讲义此处为IDEA初始化Git仓库操作示意图,无独立图片资源
5.2.3、设置远程仓库
- 顶部菜单选择
Git → Remotes - 点击「+」添加远程仓库
- 填写名称(默认origin)和远程仓库URL
- 点击OK确认
原讲义此处为IDEA设置远程仓库操作示意图,无独立图片资源
5.2.4、提交到本地仓库
- 点击顶部工具栏的提交按钮,或使用快捷键
Ctrl+K - 在弹出的
Commit Changes窗口中,勾选所有需要提交的文件 - 在提交信息输入框填写提交说明,例如
init: 初始化项目基础结构 - 点击
Commit按钮完成本地提交
原讲义此处为IDEA提交代码窗口示意图,无独立图片资源
5.2.6、推送到远程仓库
- 顶部菜单选择
Git → Push,或使用快捷键Ctrl+Shift+K - 在推送窗口确认提交内容和目标分支
- 点击
Push按钮完成推送
原讲义此处为IDEA推送代码操作示意图,无独立图片资源
5.2.7、克隆远程仓库到本地
- 打开IDEA欢迎页,选择
Get from VCS - 在URL中填写远程仓库地址
- 选择本地存放项目的目录
- 点击
Clone按钮完成克隆
原讲义此处为IDEA克隆仓库窗口示意图,无独立图片资源
5.2.8、创建分支
方式一:快捷分支按钮
- 点击IDEA右下角的当前分支名称
- 选择
New Branch - 输入新分支名称,点击确认,自动创建并切换到新分支
方式二:从提交记录创建
- 打开Git日志窗口(
Git → Show History) - 右键选中目标提交记录,选择
New Branch - 输入分支名称,点击确认
原讲义此处为IDEA创建分支操作示意图,无独立图片资源
5.2.9、切换分支及其他分支操作
点击IDEA右下角的分支名称,弹出分支菜单:
- 切换分支:在本地分支列表选择目标分支,点击
Checkout - 合并分支:选择要合并的分支,点击
Merge into Current - 重命名分支:选择分支,点击
Rename - 删除分支:选择分支,点击
Delete
原讲义此处为IDEA分支操作菜单示意图,无独立图片资源
5.2.11、解决冲突
执行pull或merge操作发生冲突时,IDEA会弹出冲突解决窗口:
Accept Yours:保留本地分支的修改,丢弃对方修改Accept Theirs:保留对方分支的修改,丢弃本地修改- 手动编辑:在代码区直接修改,保留最终需要的内容
冲突解决完成后,文件会自动加入暂存区,提交后即可完成合并,后续正常推送即可。
原讲义此处为IDEA冲突解决窗口示意图,无独立图片资源
5.3、IDEA常用GIT操作入口
- 顶部快捷工具栏:更新(pull)、提交(commit)、推送(push)、分支切换、日志查看,满足日常开发需求
- 右键Git菜单:在项目文件/目录上右键选择
Git,可执行add、revert、compare with history等操作 - 顶部VCS菜单:包含所有Git操作的完整入口
原讲义此处为IDEA Git操作入口示意图,无独立图片资源
5.4、团队协作综合场景
练习场景:组长搭建项目仓库,组员协同开发
- 组长基于本地项目创建本地仓库,创建远程仓库,将项目推送到远程
- 所有组员从远程仓库克隆项目到本地,获得完整的开发副本
- 组员A修改代码,提交本地后推送到远程;组员B执行pull即可获取最新代码
- 组员A和组员B同时修改同一文件同一行,先后推送时后者会失败
- 解决:后推送的组员先pull拉取最新代码,本地解决冲突,提交后再推送
原讲义此处为团队协作流程示意图,无独立图片资源
附:几条铁令
- 切换分支前,先提交本地的修改
- 代码及时提交,提交过的代码就不会丢失
- 遇到任何问题都不要删除.git目录,第一时间找协助人员
附:疑难问题解决
1. Windows下看不到隐藏文件(.bashrc、.gitignore)
打开文件资源管理器,点击顶部「查看」选项卡,勾选「隐藏的项目」即可显示。
2. Windows下无法创建点开头的文件(.gitignore/.bashrc)
在目标目录打开Git Bash,使用touch命令创建:
1 | # 创建.gitignore |
附:IDEA集成GitBash作为Terminal
- 打开
File → Settings → Tools → Terminal - 将
Shell path修改为Git Bash的路径,例如C:\Program Files\Git\bin\bash.exe - 点击OK保存,重启Terminal即可使用Git Bash
原讲义此处为IDEA Terminal配置页面示意图,无独立图片资源
说明
原讲义中的图片均为操作界面示意图与流程图,本次整理已完整保留对应文字说明与操作步骤;你可直接将以上内容复制保存为.md文件使用。
需要我帮你补充Git常用命令速查表,或者补充更多分支管理的最佳实践吗?






