git学习
1.Git概述
Git是一个免费的、开源的分布式版本控制系统
,可以快速高效地处理从小型到大型的各种项目。Git易于学习,占地面积小,性能极快。它具有廉价的本地库、方便的暂存区域和多个工作流分支等特性,其性能优于Subversion、CVS、Perforce和ClearCase等版本工具。
版本控制
:是一种记录文件内容变化,以便将来查阅特定版本修订情况的系统。其最重要的是可以记录文件修改历史记录,从而让用户能够查看历史版本,方便版本切换。
集中式版本控制
:诸如CVS、SVN等,都有一个单一的集中管理的服务器,保存所有文件的修订版本,而协同工作的人们都通过客户端连接到这台服务器,取出最新的文件或者提交更新。
- 优点:每个人都可以在一定程度上看到项目中的其它人正在做些什么,而管理员也可以轻松掌握每个开发者的权限,并且管理一个集中化的版本控制系统,要远比在各个客户端上维护本地数据库来得轻松容易。
- 缺点:中央服务器的单点故障问题,如果服务器死机一小时,那么在这一小时内,谁都无法提交更新,也就无法协同工作。
分布式版本控制
:诸如Git、Mercurial等,客户端提取的不是最新版本的文件快照,而是把代码仓库完整地镜像下来(本地库),这样任何一处协同工作用的文件发送故障,事后都可以用其它客户端的本地仓库进行恢复。因为每个客户端的每一次文件提取操作,实际上都是一次对整个文件仓库的完整备份。
分布式版本控制系统解决了集中式版本控制系统的缺陷:
- 服务器断网的情况下也可以进行开发(因为版本控制是在本地进行的)
- 每个客户端保存的也都是整个完整的项目(包含历史记录,更加安全)
Git工作机制:
代码托管中心:是基于网络服务器的远程代码仓库,一般简单称为远程库
- 局域网:GitLab
- 互联网:GitHub(外网)、Gitee码云(国内网站)
2.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 版本号 | 版本穿梭 |
设置用户签名
基本语法:
git config --global user.name lxx
git config --global user.email 2235221711@qq.com
查看:在C:\Users\PC
目录下的文件.gitconfig
里面查看
作用:区分不同操作者身份,用户的签名信息在每一个版本的提交信息中能够看到,以此确认本次提交是谁做的(Git首次安装必须设置一下用户签名,否则无法提交代码)。
注意:这里设置的用户签名和将来登录Github(或其它代码托管中心)的账号没有任何关系。
本地库操作
1.初始化本地库
首先需要选择一个仓库目录,这里使用目录C:\study\git_study\git_demo
作为工作区
,在该目录下打开git bash。
基本语法:
git init
结果:在该目录下会生成一个.git文件夹
2.查看本地库状态
基本语法:
git status
解释:
On branch master
:当前本地库在master分支里面No commits yet
:当前没有提交过内容(还是空的git库)nothing to commit
:当前没有什么可以提交(因为当前还没有要提交的文件)
此时在该git_demo文件夹下添加hello.txt文件:
解释:
Untracked files
:表示未被追踪的文件(还没有将文件添加到暂存区)红色
标记:表示文件还没有添加到暂存区
3.将本地文件添加到暂存区
(git追踪文件)
基本语法:
git add 文件名
解释:
- 当前git已经追踪到了文件hello.txt,此时该文件只是存在于暂存区(还可以删除,无历史版本)
绿色
标识:表示文件已经被添加到暂存区
补充:将暂存区的文件删除,但该文件在工作区(git_demo目录下)还是存在的
git rm --cached 文件名
4.将暂存区的文件提交到本地库(可以形成一个历史版本)
基本语法:
git commit -m “日志信息”文件名
5.查看历史版本
基本语法(两种方式):
git reflog
git log
解释:git reflog查看到的是版本号的前7位,git log查看到的是完整的版本号、谁提交的该版本和提交时间
6.修改文件
操作1:修改文件hello.txt后再次查看本地库状态:
解释:会提示文件被修改了,此时是红色标记,说明修改的文件还没有添加到暂存区
操作2:将修改的hello.txt上传到暂存区,查看状态,并提交到本地库
操作3:查看历史版本
解释:工作区里面永远只会显示一个文件(版本),git底层是通过指针来控制各个版本的
7.版本穿梭
基本语法:
git reset --hard 版本号
解释:原来有三个版本,且指针是指向第三个版本的(工作区显示),现在通过第二个版本的版本号,将版本穿梭回了第二个版本,此时工作区显示的就是第二个版本的文件内容了。
补充:头指针(工作区能看到的内容)指向master分支,master分支指向当前版本号
在.git目录下面的HEAD文件里面的内容是:
ref: refs/heads/master
:表示指针指向的是master,当前是在master这个分支上
在.git\refs\heads目录下的master文件里面的内容是当前master指向的版本号(完整)
3.分支
在版本控制过程中,同时推进多个任务,为每个任务,可以创建每个任务的单独分支,使用分支意为着程序员可以把自己的工作从开发主线上分离开来,开发自己分支的时候,不会影响主线分支的运行。即当你文件里有内容时,如果这时你创建了一个副分支,那么在副分支下,你主分支里每个文件的内容,在副分支下都存在(相当于拷贝),但分支底层其实也就是指针的引用。
优点:
- 同时并行推进多个功能开发,提高开发效率
- 各个分支在开发过程中,如果某一个分支开发失败,不会对其他分支有任何影响,失败的分支删除重新开始即可。
分支操作
命令名称 | 作用 |
---|---|
git branch 分支名 | 创建分支 |
git branch -v | 查看分支 |
git checkout 分支名 | 切换分支 |
git merge 分支名 | 把指定的分支合并到当前分支上 |
1.查看分支
2.创建分支hot-fix
3.切换分支
4.合并操作
- 正常合并:master分支没有修改文件,而hot-fix分支对文件进行修改了,所以将hot-fix分支合并到master分支后,文件的内容是hot-fix分支文件的内容(修改的)。
- 冲突合并:当在主分支对某个文件hello.txt进行修改(如第一行)时,如果提交到了本地库,在副分支下是不会显示f1修改的内容(因为副分支之前已经创建过,相当于另一条分支了,如果是新创建一个分支,则该分支下会显示f1修改的内容),如果这时你在副分支下,对f1第一行也进行了修改,并且提交到了本地库,当回到主分支进行合并副分支时,就会出现合并冲突,此时只能手动改。
操作1:主分支和副分支分别修改同一个文件hello.txt,并且修改位置(修改的行)是一样的,又分别提交到本地库,在主分支上将副分支合并
操作2:手动打开hello.txt文件进行修改(不需要哪些内容,删除即可),修改完后进行保存
操作3:将hello.txt提交到本地库(使用git commit命令时不能带文件名了
)
注意:此时master分支下hello.txt文件是手动修改后的内容,而hot-fix副分支下的hello.txt文件还是之前的内容。因为合并只会修改主分支的内容,即只会修改合并的那个分支,被合并的分支不会被修改。
5.总结
master、hot-fix其实都是指向具体版本记录的指针,当前所在的分支是由HEAD决定的,所以创建分支
的本质就是多创建一个指针。
- HEAD如果指向master,那么此时就在master分支上
- HEAD如果指向hot-fix,那么此时就在hot-fix分支上
- 所以
切换分支
的本质就是移动HEAD指针
4.Git团队协作机制
1.团队内协作
- 电脑A初始化了一个本地库,通过
push
命令可以将自己本地库下面的代码推送到代码托管中心
,即产生一个远程库A - 电脑B可以通过
clone
命令将远程库A里面的代码克隆到自己的本地库 - 电脑B在本地库对克隆的代码进行修改后,通过
push
命令又推送到远程库A(前提:电脑A将电脑B拉进该项目的团队里面) - 电脑A就可以通过
pull
命令来拉取远程库A里面电脑B修改的代码,更新到自己的本地库(电脑B、远程库、电脑A的数据同步了)
2.跨团队协作
- 在代码托管中心,远程库B通过
fork
命令得到远程库A里面的代码 - 电脑B通过
clone
命令将远程库B里面的代码克隆到自己的本地库 - 电脑B在本地库对克隆的代码进行修改后,通过
push
命令推送到远程库B - 远程库B发一个拉取请求
Pull request
给远程库A - 远程库A收到请求,进行审核
- 审核成功,远程库B就通过命令
merge
命令将远程库A的代码合并过来 - 电脑B就可以通过
pull
命令来拉取合并后的远程库A的代码,更新到自己的本地库
5.远程库
常用命令
命令名称 | 作用 |
---|---|
git remote -v | 查看当前所有远程地址别名 |
git remote add 别名 远程库地址 | 给远程库起别名 |
git push 别名 分支 | 推送本地分支上的内容到远程库 |
git clone 远程地址 | 将远程库的内容克隆到本地 |
git pull 远程库地址别名 远程分支名 | 将远程库对于分支最新的内容拉下来后与当前本地分支直接合并 |
创建远程库&创建别名
1.登录github账号,点击右上角的+
,点击New repository
2.在新建远程库页面设置库名git-demo(在自己账号下不能重名),选择公开
3.进入远程库git-demo,复制远程库链接
4.创建别名
git remote -v
:查看当前所有远程地址别名git remote add 别名 远程地址
:为远程库创建别名,下面通过git-demo
为别名
解释:当创建好别名后,再查看当前所有远程库别名就会出现两个git-demo,因为该别名即可用拉取fetch
,也可用用来推送push
。
5.推送本地库
git push 别名 分支
:如果没有给远程库设置别名,也可以使用链接
6.拉取远程库到本地库
如果自己本地库推送到远程库后,远程库对文件进行了更新,现在将其拉取到本地库。
解释:拉取下来后,查看本地库状态是干净的,说明拉取动作(拉取到本地库的文件)会自动提交到本地库。最后结果就是本地库的代码和远程库的代码已经同步了