目录
一. Git 概述
1.1 何为版本控制
1.2 为什么需要版本控制
1.3 版本控制工具
1.3.1 集中式版本控制工具
1.3.2 分布式版本控制系统
1.4 Git简介
1.5 Git工作机制
1.6 Git 和代码托管中心
1.6.1 局域网
1.6.2 互联网
二. Git 安装
三. Git 常用命令
3.1 设置用户签名
3.1.1 基本语法
3.1.2 说明
3.2 初始化本地库
3.2.1 基本语法
3.2.2 案例实操
3.3 查看本地库状态
3.3.1 基本语法
3.3.2 初次查看:工作区没有任何文件
3.3.3 新增文件 & 再次查看状态(检测到未追踪的文件)
3.4 添加暂存区
3.4.1 基本语法
3.4.2 查看状态(检测到暂存区有新文件)
3.5 提交本地库
3.5.1 基本语法
3.5.2 查看提交(没有文件需要提交)
3.6 修改文件
3.6.1 基本语法
编辑
3.7 历史版本(版本穿梭)
3.7.1 查看历史版本
编辑
3.7.2 版本穿梭
四. Git分支操作
4.1 什么是分支?
4.2 分支的好处
4.3 分支的操作
4.3.1 查看分支
①基本语法
②实操案例
4.3.2 创建分支
①基本语法
②实操案例
4.3.3 切换分支
①基本语法
②实操案例
4.3.4 修改分支
①基本语法:vim 文件名
②修改
③查看本地库状态(git status)
4.3.5 合并分支
①基本语法
②实操案例
4.3.6 产生冲突
①冲突产生的原因
②制造冲突
③产生冲突
④手动合并
4.3.7 解决冲突
①add(添加到暂存区)
②commit(执行提交)
4.3.8 删除分支
①基本语法
②删除本地分支
编辑
③删除远程分支
4.4 创建分支和切换分支图解
一. Git 概述
- Git是一个免费的、开源的分布式版本控制系统,可以快速高效地处理从小型到大型的各种项目。
- Git易于学习、占地面积小、性能极快。它具有廉价的本地库,方便的暂存区域和多个工作流分支等特性。其性能优于Subversion、CVS、Perforce和ClearCase等版本控制工具。
1.1 何为版本控制
- 版本控制是一种记录文件内容变化,以便将来查阅特定版本修订情况的系统。
- 版本控制其实最重要的是可以记录文件修改历史记录,从而让用户能够查看历史版本,方便版本切换。
1.2 为什么需要版本控制
- 从个人开发过渡到团队协作。
1.3 版本控制工具
1.3.1 集中式版本控制工具
CVS、SVN(Subversion)、VSS……
- 集中化的版本控制系统诸如CVS、SVN等,都有一个单一的集中管理的服务器,保存所有文件的修订版本,而协同工作的人们都通过客户端连接到这台服务器,取出最新的文件或者提交更新。多年以来这已经成为版本控制系统的标准做法。
优缺点:
- 优点:每个人都可以在一定程度上看到项目中的其他人正在做些什么。而管理员也可以轻松掌握每个开发者的权限,并且管理一个集中化的版本控制系统,要远比在各个客户端上维护本地数据库来的轻松容易。
- 缺点:中央服务器的单点故障期间,谁都无法提交更新,也就无法协同工作。
1.3.2 分布式版本控制系统
Git、Mercurial、Bazaar、Darcs……
- 像Git这种分布式版本控制工具,客户端提取的不是最新版本的文件快照,而是把代码仓库完整地镜像下来(本地库)。这样任何一处协同工作用的文件发生故障,事后都可以用其他客户端的本地仓库进行恢复。因为每个客户端的每一次文件提取操作,实际上都是一次对整个文件仓库的完整备份。
- 分布式的版本控制系统出现之后,解决了集中式版本控制系统的缺陷:
- 服务器断网的情况下也可以进行开发(因为版本控制是在本地进行)
- 每个客户端保存的也都是整个完整的项目(包含历史记录,更加安全)
1.4 Git简介
1.5 Git工作机制
- 工作区:代码存放的磁盘的目录位置
1.6 Git 和代码托管中心
代码托管中心是基于网络服务器的远程代码仓库,一般我们简单称为远程库。(从本地库推送(push)到远程库)
1.6.1 局域网
GitLab(基于局域网)
1.6.2 互联网
Github(基于外网)
Gitee码云(基于国内网站)
二. Git 安装
1.搜索git官网,会有最新版git下载链接Githttps://git-scm.com/
2.点击Download for Windows,进入如下界面中点击下载(自动下载与电脑位数匹配的程序)
3.下载之后双击安装
①GNU霸王条款,无脑同意next就行
②安装路径(最好放在没有中文且没有空格的路径里面)
③Git选项配置,推荐默认配置,直接next
④后面一直next就行了
4.如何看是否安装成功
- 右击桌面选择显示更多选项,有下面的选择则安装成功
三. Git 常用命令
命令名称 | 作用 |
---|---|
git config --global user.name 用户名 | 设置用户签名 |
git config --global user.email 邮箱 | 设置用户签名 |
git init | 初始化本地库 |
git status | 查看本地库状态 |
git add 文件名 | 添加到暂存区 |
git commit -m "日志信息" 文件名 | 提交到本地库 |
git reflog | 查看历史记录 |
git reset --hard 版本号 | 版本穿梭 |
3.1 设置用户签名
3.1.1 基本语法
git config --global user.name 用户名
git config --global user.email 邮箱
- 打开open git bash here
- 按照基本语法设置用户名和邮箱(实际和虚拟的皆行)
- 设置好了之后去c盘用户文件夹找到.gitconfig打开,显示你设置的用户名和邮箱即为成功。
3.1.2 说明
签名的作用是区分不同的操作者身份。用户的签名信息在每一个版本的提交信息中能够看到,以此确认本次提交是谁做的。Git首次安装必须设置一下用户签名,否则无法提交代码。
注意:这里设置的用户签名和邮箱与将来登录GitHub(或其他代码托管中心)的账号没有任何关系。
3.2 初始化本地库
3.2.1 基本语法
git init
3.2.2 案例实操
如图,初始化成功后该文件夹就会出现一个 .git 的文件夹。(如果没有,点击文件夹上方查看打开隐藏项目)
- Windows系统有D:、C:的盘符存在,所以在文件夹中进入git bush here比较好。
- git bash here界面里面的命令操作和Linus系统是一样的。
3.3 查看本地库状态
3.3.1 基本语法
git status
3.3.2 初次查看:工作区没有任何文件
- On branch master // 当前本地库位于分支master
- No commits yet //目前还没有提交过任何东西
- nothing to commit //没有东西可以提交
3.3.3 新增文件 & 再次查看状态(检测到未追踪的文件)
- untracker files //未被追踪的文件(只存在工作区域,git并未追踪 )
- 使用git add去追踪文件
3.4 添加暂存区
3.4.1 基本语法
git add name(这个name是你要添加的文件或者文件夹的名称)
3.4.2 查看状态(检测到暂存区有新文件)
文件从红色字体变成了绿色字体,说明git已经追踪(知道)了这个文件。
使用“git rm --cached 文件名”可以从暂存区删除你要删除的文件。
3.5 提交本地库
3.5.1 基本语法
git commit -m "日志信息" name(文件名)
3.5.2 查看提交(没有文件需要提交)
git bash窗口中第三行显示的就是你commit成功的状态,后面 test hello world 就是基本语法中的“日志信息”。
git bush窗口第四行提示:1个文件被改变,7行内容被插入。
3.6 修改文件
3.6.1 基本语法
- vim name(文件名)
- 也可以直接打开文件进行修改,不需要在 git bash here 窗口通过指令进行修改。
文件已被修改(相当于新文件),需要从工作区再次add到暂存区,并且需要commit。
3.7 历史版本(版本穿梭)
3.7.1 查看历史版本
- git reflog 查看版本信息
- git log 查看版本详细信息
3.7.2 版本穿梭
git reset --hard 版本号(上图中黄色的字符串就是版本号,分为详细版本号和精简版本号)
穿越之后,你的指针就指向你的穿越目标所对应的版本,并修改时从指针所指为基础开始修改。
附:cat 文件名——可以查看文件内容
四. Git分支操作
- 从右向左看!!!
4.1 什么是分支?
在版本控制过程中,同时推进多个任务,为每个任务,我们就可以创建每个人物的单独分支。使用分支意味着程序员可以把自己的工作从开发主线上分离开来,开发自己分支的时候,不会影响主线分支的运行。对于初学者而言,分支可以简单理解为副本,一个分支就是一个单独的副本。(分支底层其实也就是指针的运用)
4.2 分支的好处
同时并行推进多个功能开发,提高开发效率。
各个分支在开发过程中,如果某一个分支开发失败,不会对其他分支有任何影响。失败的分支删除重新开始即可。
4.3 分支的操作
命令名称 | 作用 |
git branch 分支名 | 创建分支 |
git branch -v | 查看分支 |
git checkout 分支名 | 切换分支 |
git merge 分支名 | 把指定的分支合并到当前分支上 |
4.3.1 查看分支
①基本语法
git branch -v
②实操案例
4.3.2 创建分支
①基本语法
git branch 分支名
②实操案例
(创建一个test分支,图中我的test分支有内容是因为他会把主分支master的内容复制了一份)
!git后面括号内有个蓝色的master,说明当前分支仍处于master分支
4.3.3 切换分支
①基本语法
git checkout 分支名
②实操案例
(括号内蓝色的分支为test)
4.3.4 修改分支
①基本语法:vim 文件名
②修改
细节讲解:Windows下 git commit 后会进入vim界面。 输入小写字母 i ,此时进入编辑模式,可以输入你想输入的内容。 按下 esc 键,此时退出编辑模式,输入英文语法下的冒号 : ,再输入 wq 即可保存退出。
- 可以看到我的代码已经经过了修改
③查看本地库状态(git status)
第一行on branch test说明此时不在主分支master上,然后修改过后并没有add、commit、push等行为,显示红色(具体细节往前翻至3.3、3.4、3.5)
add后
commit后并查看(cat)
4.3.5 合并分支
切换会原主线master发现并没有修改内容,仍然是原内容
①基本语法
git merge 分支名
②实操案例
(文件内容已修改,这里test分支是基于原master分支上进行修改,因此合并十分顺利,没有产生冲突,具体内容看下一小节)
4.3.6 产生冲突
①冲突产生的原因
合并分支时,两个分支在同一文件的同一个位置有两套完全不同的修改。Git无法替我们决定使用哪一个。必须人为决定新代码的内容。
②制造冲突
先修改master主线的内容
再修改test支线的代码内容
③产生冲突
(第二行显示冲突;第三行显示自动合并失败)
注意:下一行代码()中提示werging说明正在合并中
④手动合并
vim打开文件后
- <<<<<<< HEAD 表示当前分支
(这中间是当前分支的修改内容)
- ======= 分界线(楚河汉界)
(这中间是产生冲突的分支修改内容)
- >>>>>>> test 表示与主线产生冲突的分支
手动合并很简单啊,只需要把你想要留下的部分留下,不想要的删除,之后再把<<<<=====>>>>这些特殊符号删除即可(这里保持代码行数不变)
这里我删除了三条分界线,第一部分的return和第二部分的printf,然后esc,wq退出即可。
4.3.7 解决冲突
由4.3.6 手动合并之后,我们还需要两步操作(add、commit)
①add(添加到暂存区)
②commit(执行提交)
注意注意!!!
此时使用git commit命令时不能带文件名!!!
这里我尝试commit时加上了文件名,然后给git报错:不知道commit哪一个分支里面的demo.c
不带文件名之后成功合并,可以看下一行代码()中已经没有merging,而是master
!!!这时候的主线还在master上,所以手动合并的结果在master上显示,并不会在test中有所修改。
4.3.8 删除分支
注意:当你在你要删除的分支上的时候,git是不允许你去删除分支的!
①基本语法
// 删除本地分支 git branch -d localBranchName // 删除远程分支 git push origin --delete remoteBranchName
②删除本地分支
如果你还在一个分支上,那么 Git 是不允许你删除这个分支的。所以,请记得退出分支:
git checkout master
。通过
git branch -d <branch>
删除一个分支,比如:git branch -d fix/authentication
。当一个分支被推送并合并到远程分支后,
-d
才会本地删除该分支。如果一个分支还没有被推送或者合并,那么可以使用-D
强制删除它。
③删除远程分支
- 使用这个命令可以远程删除分支:
git push <remote> --delete <branch>
。- 比如:
git push origin --delete fix/authentication
,这个分支就被远程删除了。- 你也可以使用这行简短的命令来远程删除分支:
git push <remote> :<branch>
,比如:git push origin :fix/authentication
。- 如果你得到以下错误消息,可能是因为其他人已经删除了这个分支。
error: unable to push to unqualified destination: remoteBranchName The destination refspec neither matches an existing ref on the remote nor begins with refs/, and we are unable to guess a prefix based on the source ref. error: failed to push some refs to 'git@repository_name'
- 使用以下命令同步分支列表:
git fetch -p
-p
的意思是“精简”。这样,你的分支列表里就不会显示已远程被删除的分支了。
4.4 创建分支和切换分支图解
master
创建hot-fix(热修)分支【热修是常用分支名称,本人为了偷懒就写了一个test】
将hot-fix分支合并至master主线
总结:master、hot-fix其实都是指向具体版本记录的指针。当前所在的分支,其实是由HEAD决定的。所以创建分支的本质就是多创建一个指针。
HEAD如果指向master,那么我们就在master分支上;如果指向hot-fix,我们就在hot-fix分支上。(在.git里面找到HEAD文件可以查看当前指针所指向分支)
所以啊,所谓的切换分支,其实就是移动HEAD指针指向不同的地方。 (wok!真心累死我了,爆肝完第四章)