1.Git概述
Git是一个免费、开源的分布式版本控制系统,可以快速高效地处理从小型到大型的各种项目。
1.1何为版本控制
版本控制其实是一种记录文件内容变化,以便将来查阅特定版本修订情况的系统。
版本控制最重要的就是可以记录文件修改历史记录,从而让用户能够查看历史版本,方便版本切换。
eg:公司服务器有一代码如下:
{ aaa bbb ccc ddd }
程序员A将该代码下载到本地后,为了增添功能,将其修改为:
{ aaa bbb222 ccc ddd }
程序员B将该代码下载到本地后,为了解决bug,将其修改为:
{ aaa bbb ccc ddd444 }
若程序员A先提交,程序员B后提交,则程序员B的代码会覆盖程序员A的代码。这时就需要一个专业的版本控制工具,合并两个人的代码。
1.2版本控制工具
集中式版本控制工具
集中化的版本控制系统诸如CVS、SVN等,都有一个单一的集中管理的服务器,保存所有文件的修订版本,而协同工作的人都通过客户端链接到这台服务器,取出最新的文件或者提交更新。
这种做法的好处是:每个人都能在一定程度上看到项目中的其他人正在做什么,而管理员也可以轻松掌握每个开发者的权限,并且管理一个集中化的版本控制系统,要远比在各个客户端上维护本地数据库来的更容易。
然而,这样做的缺点是:如果中央服务器宕机,那么在这期间,谁都无法提交更新,也就无法协同工作。
分布式版本控制工具
像Git这种分布式版本控制工具,客户端提取的不是最新版本的文件快照,而是把代码仓库完整地镜像下来(本地库)。这一任何一处协同工作用的文件发生故障,事后都可以用其他客户端的本地仓库进行恢复。因为每个客户端的每一次文件提取操作,都是对整个文件仓库的完整备份。
当一个客户端完成对项目的修改后,可以上传至远程代码托管中心。
1.3Git工作机制
首先分为三个区:工作区、暂存区、本地库。
工作区:本地代码所在磁盘目录,即存放代码的地方。
git add
暂存区:把工作区的代码添加到暂存区,才能让Git追踪到。暂存区也有临时存储代码的作用,删除暂存区的代码,是不会有历史版本记录信息的,因为并没有提交到本地库。
git commit
本地库:一旦暂存区的代码提交到本地库后,就会生成对应的历史版本,这时代码已经删不掉了。最后可以从本地库推送到远程库。
git push
1.4Git和代码托管中心
代码托管中心是基于网络服务器的远程代码仓库,一般简称为远程库。
局域网: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 版本号 | 版本穿梭 |
签名的作用是区分不同操作者身份。用户的签名信息在每一个版本的提交信息中可以看到,以此确认本次提交是谁做的。
这里设置用户签名和将来登录GitHub或其他代码托管中心的账号没有任何关系。
C:\Users\86173\git.config文件中存放用户签名。
2.1初始化本地库
打开git-bash界面,输入git init,即可初始化本地库。
2.2查看本地库状态
2.3添加暂存区
当一个文件只存在工作区,未被添加到暂存区时,此文件名被标记为红色,代表Git还没有追踪该文件。
当该文件被添加到暂存区后,Git就追踪到了这个文件。
此时暂存区中的文件是可以删掉的,当然,删掉之后工作区的文件依旧存在。
git rm --cached 文件名 //从暂存区中删除文件
2.4提交本地库
版本号为:1296182.
2.5查看历史记录
git log 查看详细的版本历史记录 ,可以看到完整的版本号。
2.6修改文件
当修改文件后,再次查看本地库状态,会发现一点小变化。
这次修改后,Git没有追踪到,需要再次加入暂存区,然后提交本地库。这时是第二次提交。
Git是按照行维护文件的,而第二次修改文件时,只改了txt文件中的第一行,所以Git提示为”
1 insertion(+), 1 deletion(-)“,表示把修改之前的old行删掉,新增修改之后的new行。
第二次查看版本记录信息,又发现一点小变化。
2.7版本穿梭
版本穿梭就是通过版本号查看指定的版本。当版本发生变化后,就可以查看该版本对应的文件。
二号版本(edef6b4):
当穿梭回一号版本(1296180)后,就能查看到原文件:
要实现这件事,只需:
(第一次穿梭输入了第二版本的版本号,相当于没有穿梭,有点尴尬)
穿梭回一号版本后,head指向了master,说明此时在master分支上,可以通过E:\GitSpace\Git-demo1\.git目录中的HEAD文件查看到
同时E:\GitSpace\Git-demo1\.git\refs\heads目录下的master文件中存放着一号版本的完整版本号
两者结合表示此时head指针指向了master分支,而master分支又指向了一号版本。
3.Git分支操作
git branch -v | 查看分支 |
git branch 分支名 | 创建分支 |
git checkout 分支名 | 切换分支 |
git merge 分支名 | 把指定的分支合并到当前分支上 |
3.1什么是分支
在版本控制工具中,同时推进多个任务,为每个任务创建相应的单独分支。使用分支意味着程序员可以把自己的工作从开发主线上分离开来,开发自己分支的时候不会影响主线分支的运行。一个分支就相当于一个单独的副本。
3.2创建分支
(由前文可知,创建hot-fix分支前master指向一号版本)
未创建hot-fix分支时,只能查看到master分支;创建hot-fix分支后就可以同时查看到两个分支了,此时依然在master分支上。
当master分支穿梭回二号版本后,可以看到两个分支此时指向不同的版本。
3.3切换分支
切换到hot-fix后,hello.txt文件也变成了一号版本
此时在hot-fix上对文件做修改:
然后提交本地库。
提交本地库后,HEAD指针指向hot-fix分支,hot-fix分支指向了hot-fix修改版本。
3.4合并分支--正常合并
合并后,hello.txi文件发生了一点小变化:
3.5合并分支--冲突合并
冲突产生的原因:合并分支时,两个分支对同一个文件的同一个位置有两套完全不同的修改,Git无法决定使用哪一个,必须人为决定新代码内容。
4.GitHub操作
4.1创建远程仓库
4.2远程仓库操作
git remote -v | 查看当前所有远程地址别名 |
git remote add 别名 远程地址 | 起别名 |
git push 别名(地址) 分支 | 推送本地分支上的内容到远程仓库 |
git clone 远程地址 | 将远程仓库的内容克隆到本地 |
git pull 远程库地址别名(https链接或ssh协议) 远程分支名 | 将远程仓库对于分支最新内容拉下来后与当前本地分支直接合并 |
4.2.1创捷别名,远程地址是远程仓库中的HTTPS
4.2.2推送本地分支上的内容到远程仓库(此过程可能较慢,因为网速原因),如果失败就多来几次。
(失败了好多次,终于成功了)。 推送完成后可以发现远程仓库不再是空荡荡的了。
4.2.3将远程仓库对于分支最新内容拉下来后与当前本地分支直接合并。之所以拉取,是为了保证本地库的文件和远程库的文件同步。拉取后会自动提交本地库。
4.2.4将远程仓库的内容克隆到本地。clone会自动拉取代码,然后初始化本地仓库,最后创建别名(origin)。