1、Git简介
1.1、Git是什么?
Git是一个免费的开源 分布式版本控制系统,旨在快速高效地处理从小型到大型项目的所有内容。
Git 易于学习, 占地面积小,具有闪电般的快速性能。它具有Subversion,CVS,Perforce和ClearCase之类的SCM工具,具有廉价的本地分支,方便的暂存区域和 多个工作流等功能。
1.2、Git有哪些优势?
官方的讲:
从一般开发者的角度来看,git有以下功能:
1、从服务器上克隆完整的Git仓库(包括代码和版本信息)到单机上。
2、在自己的机器上根据不同的开发目的,创建分支,修改代码。
3、在单机上自己创建的分支上提交代码。
4、在单机上合并分支。
5、把服务器上最新版的代码fetch下来,然后跟自己的主分支合并。
6、生成补丁(patch),把补丁发送给主开发者。
7、看主开发者的反馈,如果主开发者发现两个一般开发者之间有冲突(他们之间可以合作解决的冲突),就会要求他们先解决冲突,然后再由其中一个人提交。如果主开发者可以自己解决,或者没有冲突,就通过。
8、一般开发者之间解决冲突的方法,开发者之间可以使用pull 命令解决冲突,解决完冲突之后再向主开发者提交补丁。
我们自己讲:
- 大部分操作在本地完成,无需联网
- 保证了完整性
- 尽可能地添加数据,而不是修改或者删除数据
- 分支操作非常快捷、流畅
- 与Linux命令全面兼容(同一个爹)
2、安装Git
下载地址:Gei官方地址
下载慢的可以借鉴:淘宝Git镜像
安装目录:
Next:
注意:
3、Git结构
3.1、工作区
写代码;我们写代码的地方
3.2、暂存区
临时存储;打算提交的东西,但是暂时还没提交,暂时先存在这儿,后续可以提交到本地库,也可以撤回来
3.3、本地库
历史版本
3.4、如何使用
工作区 ----git add ----暂存区 ----git commit ----工作区
3.5、Git和托管中心
托管中心作用:维护远程库
- 局域网环境下
- GitLab服务器
- 外网环境下
- GitHub
- 码云
3.6、本地库和远程库
- 团队内部协作
- 跨团队协作
4、Git命令行操作
4.1、本地库操作
4.1.1、本地库初始化
创建项目:
#mkdir 项目名
mkdir HelloWord
命令:
git init
效果:
注意:
.git目录中存放的是本地库相关的子目录和文件,不要删除 ,也不要胡乱修改
4.1.1.1、设置签名
-
签名形式:
- 用户名:Tom
- Email地址:kjljd@qq.com -------------------------> 用户名和邮箱不用一致,邮箱错误也可以,不会发邮 件,仅仅是一个身份的代表,相当于id-
-
签名作用:
- 区分开发人员的身份
-
辨析:
- 这里的 签名用户名和Email、 和 登录远程库(代码托管中心)dd额账号和密码没有关系
设置签名命令:
- 项目级别/仓库级别:仅在当前本地库范围有效
#git config 用户名 密码 git config user.name tom_pro git config user.email goodMoring_pro@163.com
cat .git/config ---------------------->项目级别的信息保存目录
- 系统用户级别:登录当前操作系统的用户范围
#git config --global 用户名 密码 git config --global user.name tom_glo git config --global user.email goodMoring_glo@163.com
cd ~ cat .gitconfig ---------------------->系统级别的信息保存目录
- 优先级:
- 就近原则,项目级别>系统级别
示范:项目级别
示范:系统级别
4.1.2、全局相关设置
4.1.2.1、查看全局配置
git config --list
4.1.2.2、设置全局签名
git config --global user.name "输入你的用户名"
git config --global user.email "输入你的邮箱"
4.1.2.3、修改全局配置
git config --global --replace-all user.name "输入你的用户名"
git config --global --replace-all user.email "输入你的邮箱"
4.1.2、基本操作
4.1.2.1、查看的状态
git status
4.1.2.2、创建文件
#vim [File Name]
vim good.txt
创建文件后查看状态:
4.1.2.3、工作区添加到暂存区
#git add [File Name]
git add good.txt
添加后查看状态:
4.1.2.4、从缓存区撤回
#git rm --cached [File Name]
git rm --cached good.txt
4.1.2.5、暂存区提交到本地库
#第一种提交:git commit [File Name]
git commit good.txt
#常用提交:git commit -m "[commit message]" [File Name]
git commit -m "My second commit,modify good.txt" good.txt
提交之后查看:
4.1.2.6、修改文件后情况
添加到暂存区:
提交到本地库:
4.1.2.7、查看历史记录【版本】控制
历史记录直观感受:
git log
如果日志信息【版本】很多,会导致一屏放不下,使用下面的命令,会变得好一点
git log --pretty=oneline
git log --oneline ------------------>只显示历史版本
git reflog ------------------>显示所有版本
4.1.2.8、前进后退历史记录
4.1.2.8.1、基于索引值操作【推荐】
#git reset --hard [索引]
git reset --hard 51d4ed9
4.1.2.8.2、使用^符号
只能往后,不能往前,一个^符号,表示退一步
git reset --hard HEAD^
git reset --hard HEAD^^
git reset --hard HEAD^^^
……
git reset --hard HEAD^^^^…………^^
4.1.2.8.3、使用~符号
git reset --hard HEAD~3
git reset --hard HEAD~10 ---->相当于10和^符号
4.1.2.8.3.1、hard和soft和mixed参数对比
- –soft
- 仅仅在本地库移动HEAD指针
- –mixed
- 在本地库移动指针
- 重置缓存区
- –hard
- 本地库移动指针
- 重置缓存区
- 重置工作区
4.1.2.9、永久删除文件并找回
rm [File Name]
rm aaa.txt
版本回退,找回文件
4.1.2.10、文件比较
#git diff [File Name]--------------->将工作区的文件和暂存区的对应文件进行比较
git diff apple.txt
#git diff [本地库历史版本] [File Name]--------------->将工作区的文件和本地库历史记录进行比较
$ git diff HEAD^ apple.txt
4.1.3、分支管理
4.1.3.1、查看所有分支
git branch -v
4.1.3.2、创建分支
#git branch [分支]
git branch hot_fix
4.1.3.3、删除分支
#git branch -D [分支名]
git branch -D asd
4.1.3.4、切换分支
#git checkout [分支]
git checkout hot_fix
4.1.3.5、合并分支
合并之前:两条分支的版本都是一样的
现在,在hot_fix分支上模拟“修改,调试Debug完成后”,并且Add、commit到本地库之后,两条分支版本不同了。
现在就需要合并到一起,让主分支的版本也向前推进到Debug之后的版本。
合并分支:
第一步:切换到接受修改的分支(被合并,增加新内容)上
第二步:执行merge命令
#git merge [与那个分支合并:分支名] git merge hot_fix
4.1.3.6、解决冲突
场景:有可能某一个文件,在两条分支上,都做了修改,(也是在同一个位置修改),合并会产生冲突。
解决:
- 第一步:编辑文件,删除特殊符号
- 第二步:把文件修改到满意程度,保存退出
- 第三步:git add [文件名]
- 第四步:git commit -m “日志信息”
4.2、远程库操作
4.2.1、初始化本地库
4.2.2、创建远程库
登录GitHub,注意:创建远程库的名字,的时候,可以和本地库名字不同,这里方便演示,起名一致
4.2.3、查看本地库地址别名
git remote -v
4.2.4、在本地库创建远程库的别名(关联远程仓库)
#git remote add [别名] [地址]
git remote add HelloProject https://github.com/MissLi-1/HelloWord.git
4.2.5、推送操作
#git push [地址的别名] [那个分支]
git push HelloProject master
此时页面就会有:我们本地库刚才推送的文件
4.2.6、克隆远程库文件
#git clone [远程库地址] git clone https://github.com/MissLi-1/HelloWord.git
- 克隆OK好后,它会自己做好这些东西
- 完整的远程库下载到本地
- 创建远程地址别名
- 初始化本地库
4.2.7、邀请别人加入自己的团队
场景模拟:现在MissLi将HelloWord.txt做了修改,要push到远程库,因为没有加入到团队,无法push
注意:这里是在两个不同的账号下分别push,第一次从本地库推送到远程可是A的账户,B从A的远程账户下克隆出来项目,进而修改,修改之后推送到A的远程库的时候,由于A没有给B权限,(也就是不在同一个团队),因此本该无法push,会有一个登陆GitHub的过程。
但是我这儿,直接pushOK了。没有出现登陆,说明第二次Push,也就是B在Push的时候,用的是A的账户,导致GitHub认为,A自己从本地库推送项目到远程库,又从远程库克隆项目到本地。修改完成后又推送,这一系列过程都是A所为,因为推送的时候没有出现换账户的窗口,但是还推送成功。说明,有可能就是缓存等等……
查阅资料发现:
在这个页面你将会看到之前保存过的Git用户账号,在普通凭据标签下面,
以“git”开头的就是你git各个git远程仓库地址。选择你想要修改远程仓库的对应的条目,就可以在展开的页面进行修改和删除了。
这里确实有一个git开头的链接,用户和密码都是我第一次Push的时候登录的账号和密码。删除后,再次push就出现了登录提示,当然了push是false,因为B此时还没有权限
A邀请B加入团队
B接受邀请后
重新push
4.2.8、远程库拉取操作
A拉取下来的文件,他是远程库修改后的文件,但是并没有修改A的文件
#git fetch [别名 分支] git fetch hello master
发现并没有改变本地库内容,这时候需要切换到远程库分支
想要查看拉去下来的文件,需要先切换分支
好处:确认没有问题再合并
- pull操作相当于fetch+merge
- git fetch [远程库别名]+[远程库分支名]
- git merge [远程库别名/远程库分支名 ]
#不管会不会冲突,先合并再说 git pull hello master
4.2.9、团队协作冲突
修改同一个文件的同一个位置
A用户,在本地某一文件、某一位置修改了文件,并且优先于B用户推送到远程库。
此时B在不知情的情况下,也在同个文件、同个位置做了修改,也来推送到远程库
此时应该:
4.2.10、跨团队协作
情景:A公司的项目经理和B公司的项目经理一起完成一个工程。A经理创建了一个准备环境
B经理现在访问A经理所创建的远程库,并Fork一份到自己的远程库
B经理克隆到自己的本地库
现在B经理对"环境"项目做了自己的事
确定无误后,需要向A经理,发起请求合并
B 经理结束
A经理开始处理
审核代码:
当觉得没有问题的时候,就可以合并了
最后将远程库修改拉取到本地库
4.2.11、SSH免密登陆
- 进入家目录
$ cd ~
- 删除.ssh文件
$ rm -r .ssh/
- 运行命令生成.ssh密匙目录
$ ssh-keygen -t rsa -C 1260811995@qq.com
- 进入到.ssh目录查看文件列表
cd .ssh Is -IF
- 查看id_rsa.pub文件内容
$ cat id_rsa.pub
- 复制内容,黏贴在Settings----->SSH and GPG keys
- New SSH Key
- 输入复制的密匙信息
测试免密:
首先将修改的文件提交到本地仓库,这样就只剩下push到远程仓库。
4.2.12、删除本地库
4.2.12.1、取消本地目录下关联的远程库
4.2.12.2、删除.get文件
rm -rf .git