Git 常用操作和远程仓库的管理 小白教程
一、安装 git
本文简单介绍 Git 的基本操作,适合刚接触的 Git 的小伙伴...我会列举一些常见问题以及解决方案,
毕竟我也是从问题堆里一路爬坑来的!反正有问题,找度娘,大部分问题都能在那找到解决方法!
这也是我自己给自己总结的一篇 Git 操作指南,方便随时复习!
如果想深入学习 Git,建议参阅官方文档 :
Git官方文档: https://git-scm.com/book/en/v2
Git的安装
关于 Git 的安装,网上有很多很详细的教程,就不在此赘述,一般来说,新手就默认一路 NEXT 安装即可!
Git官网下载地址:https://git-scm.com/downloads
目前已经更新到 2.37.1 版本
安装之后记得配置环境变量:保证在任何地方都能访问到Git
配置完之后,我们就可以在命令行或者其他终端访问 Git 了,包括 VScode 内置终端:
使用下面两个命令:
git -v # 查看当前 Git 版本
git # 会出现很多 Git 的提示信息
如果上述命令得不到下面的信息,说明你的 Git 安装出问题了...请自行百度解决吧!
当然,看似简单的安装不总是一番风顺。可能有小伙伴会在安装的过程中遇到各种问题,还是那句话:
活用百度,大部分问题都可以解决!
关于 VScode 常见问题:可能有同学配置完之后,在 VScode 终端还是找不到 git ,
不要慌,检查一下环境变量的路径,如果路径没问题,那一般来说,关机重启之后就有了!
(我安装的时候就遇到过,折腾了半天,结果只需要重启就OK~~😒)
二、关于 Git 的一些简介
在使用 Git 之前,我们先了解一下 Git 是啥玩意
Git ---- 开源分布式版本控制系统
对于学习编程的小伙伴来说,咱们使用 Git 就是用来管理代码的一种工具!有了这种工具,
我们可以更方便、高效地进行代码的开发与合并,也能优化多人协作开发的流程!
简单提一下:代码管理分为集中式和分布式,目前分布式比较主流,Git 就是分布式管理方式!
三、Git 常用的基本操作(可以跟着我的操作玩一玩)
1.项目初始化
1.在桌面上新建一个空文件夹 “Git演示”,以它为我们要管理的项目,开启 Git 试炼之旅吧!
2.在该文件夹下打开任意命令行工具,这里为了方便,之后的操作都是在 VScode 终端进行😊
3.VScode ==> 空文件夹 ==> 右键“在集成终端中打开”,输入以下指令:
git init # 项目初始化
成功之后如下图所示,且在空文件夹内会出现一个 .git 文件夹
这是个隐藏文件夹,可以设置开启!
注意!这个 .git 文件夹是用来跟踪管理 Git 仓库的,
没事千万别去修改里面的文件!!!不然会破坏 Git 仓库!
当然...你要是非要试一下也无妨,反正练手的项目可以随便丢...多折腾一下说不定会发现什么新大陆呢!
2.开始在本地仓库管理项目吧!
在这之前,先简单了解一下本地仓库的结构:
工作区: 就是项目的根目录(文件夹)
stage: 本地仓库的一个暂存区 暂时存放的区域 等待提交,可撤回重新编辑...防止用户误操作,给一次后悔的机会!
master: 本地仓库的 master 分支 git init 之后默认创建的分支,也可能会是 main...用来永久保存项目。
这里存放的是提交之后的项目,可上传到远程分支上...一旦提交,就不可撤回了!
2.1 把项目添加到本地的暂存区
1.我们在刚才的空目录下新建一个文件 “readme.txt”
2.在新建的文件第一行写点什么...就当我们在进行项目开发了!
3.假设此时我们写累了,不想写了,想把项目先添加到暂存区保存一下,就使用以下指令:
git add "fileName" # 把某个文件添加到暂存区
当然在此之前,最好先使用指令:
git status # 查看当前项目的更改状态 我们能看到所有发生变动的文件
如果需要添加多个文件,就使用:
git add . # 将所有变动的文件都添加到暂存区
然后再使用 git status 查看一下添加状态
注意!!!git add . “add” 后面一定要先打个空格,再打 “.” 否则会报错!
2.2 把项目从暂存区提交到本地仓库的master分支:
1.好了,我们不修改了,写完了,然后就把它提交到仓库保管吧!
使用下面指令:
git commit -m "描述信息,我这次提交新增了一个 readme.txt 文件!" # 将项目提交到本地仓库
注意!!!如果是第一次提交,可能会弹出如下信息:
这个不用着急,第一次提交,你总得告诉人家这个仓库的主人是谁吧!
按照它的提示,注册一下用户邮箱和用户名即可:
git config --global user.email "123456@qq.com"
git config --global user.name "MX扑克猫"
然后再使用:
git commit -m "描述信息..."
OK 到这 以后提交都不会再有这种问题了! 也恭喜你成为了一个正式的 “本地” 仓库管理员!
别着急,远程的在后面呢!
2.3 试着玩一下 暂存区 的后悔药吧!(刚接触几乎用不到,没兴趣可跳过…)
1.假如,我们在 readme.txt 文件第二行不小心写了某人的坏话!!😅
2.然后又不小心把文件添加到了 暂存区 !😅 但是还好还没提交到仓库...
3.怎么办?被他看到了会被捶的吧...😬
不要方!暂存区给了一次后悔的机会!
git restore "fileName" # 把指定文件从暂存区打回来
git restore --staged "fileName" # 把指定文件从暂存区打回来
注意,这操作是让该文件回到上一次提交(也就是上次commit)的状态,只能撤一次,不能连续撤回!
当然,这个指令不一定会生效,原因多种多样,可能是编辑器的问题,
也可能是指令后面 - - 修饰符的原因亦或者其他原因,目前这不重要,了解一下就OK!
但是千万注意!!!一旦用 commit 提交之后… emmm… 建议删库跑路吧!
这真不是开玩笑,因为你的每次提交都会被记录在案,一旦上传,当众社死!
就算手动改了,或者切换到之前的版本,都会留下不可磨灭的痕迹!
玩闹归玩闹!提交请三思!慎重慎重!
2.4 提交日志和版本控制(感兴趣可以玩一下,着急学习远程仓库就跳过吧😊)
1.假设我们再给 readme.txt 文件 添加几行字,每加一行就提交一次...
此时,我们已经提交了好几个版本了!那怎么查看提交的历史记录呢?
git log # 控制台打印 Git 日志
通过 git log 就可以查看我所有的历史提交记录了;
然后我们可以获取到每一个版本的版本号:比如第一次提交的:0ab5133f0ddbb3d51e44b2b7b0584e647e3a0430
这个版本号是一个哈希值,可以理解为文件的指纹,身份证,是唯一的!
得到这个版本号之后,我们可以通过:
git reset --hard 版本号 # 强行回滚到指定版本 相当于 Ctrl + Z 的撤销操作...
版本号一般只需要复制前十几位就够了,几乎不可能会重复...
但是! git log 只能查看当前版本之前的提交记录...
如果我们滚回第一版,那后面的2、3、4都看不到了...也就滚不回去了...
不要方!咱们还有招!
git reflog # 查看所有的历史记录 包括回滚记录
这样 再搭配:
git reset --hard 版本号
咱就可以实现版本切换的奥义! “反复横跳!”
2.5 查看文件具体的修改信息
1.我们现在再修改一下第三个版本的 readme.txt
2.然后使用以下指令查看修改信息
git diff # 查看文件修改的具体内容
四、远程仓库
OK,前三节我们把本地仓库玩了一下,浅显了解了一下仓库管理员的基本工作和仓库管理方式;
接下来咱们就玩点更好玩的!让我们的本地仓库跟某一个远程 Git 仓库通信,能互传文件!
当然,至于底层是怎么实现通信的,那就是计算机网络和通信原理的事了,
我们只需要知道在应用层怎么操作就 OK! 走起!
1.远程仓库简介:
远程仓库,诸如 github、Gitee(码云)之类的网站,给我们提供了一个远程代码管理的平台;
让我们可以将代码上传到远程仓库,也可以从远程仓库抓取代码....
这就能让多人协同开发同一个项目,优化代码管理,提高开发效率...
若是开源网站,那更是能让所有技术人员共同交流、相互学习、相互提升...
有句话说得好,技术最好的发展方式就是开源,一个人闭门造车的成效是很低的!
2.注册一个远程仓库的账号
这个不用写教程了吧...注册账号这种事应该都没什么问题!
可以注册一个 GitHub 账号,要是进不去就注册码云账号吧;
我接下来的操作都是以码云为例,GitHub上也是一毛一样的操作!
五、本地仓库和远程仓库的数据通信
1.创建一个自己的远程仓库
2.关联远程仓库
有了远程仓库之后,我们可以通过下面指令关联我们的远程仓库
git add .
git commit -m "首次上传前的最后一次提交"
git remote add origin 远程仓库地址 # 本地仓库关联远程仓库
git remote -v # 查看当前关联的远程仓库
3.实现本地仓库和远程仓库的通信
1.我们虽然关联了仓库,但现在还不能通信;
2.因为我们需要把远程仓库和本地仓库配对,也就是需要一个接头暗号!
3.否则你们之间的通信就是不安全的,别人随时能给你拦截了!
4.暗号:非对称加密,本地有一个秘钥加密,远程需要一个公钥解密,才能实现安全通信!
ssh-keygen -t rsa -C "邮箱账号" # 在本地生成一对秘钥 加密和解密的
一路按 Enter 键就 OK
此时,我们会在 C 盘/用户/你的用户名/ 下面看到一个 .ssh 文件 是个隐藏文件,可以设置可见!
然后,在 .ssh 文件 内会有两个文件,也可能三个!
然后,把 id_rsa.pub 文件内的全部内容复制到 远程仓库的 SSH 公钥里去!
4.拉取或者上传项目
OK,现在我们已经把本地和远程建立了安全通信通道了,可以开始数据交互了!
git push origin master # 把本地项目推送到远程 master 分支上
执行命令之后,系统会问你是不是要关联? 输入yes
然后 .ssh 文件夹里面会多一个 .hosts 的关联文件,不要乱动它!!!
但是,这时候坑就来了! 会报错!个人觉得这是个很有意思的报错,所以重点拿来分析一下!
分析一下原因:
1.报错原因:远程仓库拒绝了你的首次推送!
2.因为远程仓库有几个文件,而本地仓库没有!如果推送上去,会把远程文件覆盖!
3.所以远程仓库拒绝了!文件有冲突!
解决方法:
先把远程仓库的文件拿到本地,然后再一起传回去!
git pull origin master # 从远程分支拉取项目
然而…还是不行! 它不让你拿!原因是:你之前没来过,我没见过你,所以我不给你拿!😒
什么意思? 就好像:你第一次去找工作,人家说你没有工作经验,所以不要你!
可是我不参加工作,哪来的工作经验?🤨🤨 这个拒绝的理由蛮离谱的!
不要方,还是那句话!活用百度!
git pull origin master --allow-unrelated-histories # 用这一串魔法给它强行拿过来!
相当于开了个许可证,允许没来过的人拿东西!
OK, 到这,我们的仓库就没有文件冲突了!继续执行 git push origin master 就能把我们的项目上传到远程仓库了!
刷新页面,就能看到我们上传的文件了,甚至能看答所有的提交信息!
5.克隆项目
读书人的事,怎么能叫抄呢?😂😂 克隆这个词用的很好,我们在开源网站上看别人的代码,
感觉很不错,借鉴一下,怎么弄? 克隆!
git clone 仓库 SSH 地址
这样就能把别人的代码 copy 到你本地了! 当然,你只有拿的权限,没有上传的权限!
六、分支管理
1.什么是分支?
简单说就是,在 master 主分支上,新建几个分支 a, b, c...
然后 可以同时在这些分支上进行不同的开发,最后再合并到 主分支上;
而且各分支之间相互独立,使得开发效率大大提升!
2.关于分支,我们现在需要知道掌握什么?
分支管理也是一门学问,有很多内容,对于新手来说,只需要知道:
1.创建分支
2.查看当前分支
3.切换分支
4.删除分支
5.简单的合并
6.简单的冲突处理
3.开始尝试吧
git branch -a # 查看当前所有分支
git branch 分支名 # 新建分支
git checkout 分支名 # 切换到指定分支
git checkout -b 分支名 # 新建并切换到指定分支
到这,我们学会了查看、新建和切换分支,接下来着重讲一下分支合并以及代码冲突的问题:
git checkout a # 切换到 分支 a
git checkout -b b # 在 a 分支新建并切换到 分支 b
然后 b 分支完成了一些开发
git checkout a # 切回到 分支 a
git merge b # 把 分支 b 合并到 分支 a
业务场景:
1.我们刚才新建了一个 dev 分支 和 一个 cat 分支;
2.cat 分支是建立在 dev 上的,所以它的 readme.txt 文件 和 dev 分支一模一样;
3.现在我们切换到 cat 分支,在 readme.txt 文件内再加一行!假装我在 cat 分支上开发了新功能!
4.把 cat 合并到 dev 分支,也就会把新功能也添加到 dev 分支上的 readme.txt 里面!
这就是最基本的分支合并…接下来说说合并过程中的常见问题,代码冲突!
业务场景:
1. 军同学在 dev 上新建 一个 jun 分支
2. smiling girl 在 dev 上新建一个 smiling 分支
3. 现在 军 同学 在 jun dev 上改了 最后一行
4. smiling girl 也在 smiling 分支上 改了最后一行
5. 两人改了同一个地方,同时提交了,然后都要合并到 dev 分支上;
6. 这时候可能会出现冲突...两人都改一个地方...改的还不一样...我该用谁的呢?
现在,小规模代码冲突的解决也OK了…其实还是手动解决…
当遇到一些复杂的冲突的时候,可能就需要依赖更高级的工具了…
最后,把多余的分支删除
git branch -d 分支名 # 删除指定分支
七、远程分支同步
这个不多说,就是把本地的分支同步推送到远程分支去,
让远程和本地的仓库能保持一致!
具体操作如下,就是一个 push 操作
git push origin 本地分支名:远程分支名 # 分支同步操作
你以为就结束了?等等,小红我又出来了!😊😊
刚刚所说的分支合并,是建立在你对仓库有直接管理权限的基础之上!
换句话说,如果你加入了别人的仓库,想要把自己的分支合并到他的主分支上,
那命令行合并是没有权限的!那咋办?
我们可以先把我们的分支同步到远程仓库,然后在仓库通过 Pull Request 来发起
合并请求,等管理员审核同意之后,才可以合并!
下面就演示一下,把刚刚同步上去的 dev 分支,通过 Pull Request 请求合并:
好了,到此,相信你已经掌握了 Git 常规操作了…如果想玩的更深,更花…请参阅更多资料…
八、标签管理
前七节够用了,这一节就是几个标签管理,刚开始接触 Git 应该是用不到,了解一下即可;
1.为什么要用标签管理?
1.每一个版本都会有一个很长的 哈希值,也就是版本号;
2.如果提交、回滚的版本很多很多,我们就没法用版本号来管理版本了...这么长 ,谁记得住...
3.如果给每一个版本改个好记的小名呢?是不是方便多了...比如 v1.0版本,v1.1版本....
4.所以,标签的作用就在于给版本号起别名,优化管理!
2.怎么玩呢?
git tag v2.0 # 给当前版本加一个别名 v1.0 版
git tag v1.5 历史版本号 # 给历史任意版本加一个别名
git show v2.0 # 查看某个版本的提交信息
git tag -a v0.9 版本号 -m "版本描述信息" :给指定版本添加一些描述信息 # 甚至可以给历史版本再加点描述
git show v0.9 # 就能看到刚刚 设置的那个版本 干了些什么事了
使用 tag 是不是比版本号更清晰了...
git tag -d v1.5 # 删除指定版本的标签
先用 git log 看一下各个版本 看到一对很长的版本号
最后两个指令:
git log --graph # 将分支信息图形化 只是美化了一下 log 输出样式,除此之外似乎没啥用...就是为了好看
git remote rm origin # 清除与远程仓库的关联
九、小结:
这几节内容虽然看起来篇幅很多,很吓人,但其实内容并不算很多...
git 指令,多敲一敲,多玩一玩也就熟悉了....
目前而言:最最常用的几个指令貌似是:
git status
git add .
git commit -m "🤣"
git push origin 😎
git pull origin ✌️
git clone 😀😆🤩😛😜😝🤪😫🤤
git branch 👍
git branch -a
git checkout 🤡
git checkout -b 😱
附录:如果我们加入了某个仓库,怎么参与到其中某个分支的开发呢?(其实就是怎么交作业)
下面全是截图...实测成功!当然,方式很多,可以pull、clone、各种命令搭配都行....
亦或者,直接用VScode内置的 git 按键式操作都行...我下面演示的是我自己常用的方式,
这样我每次提交完作业我甚至可把本地文件都删了...反正随时可以新建个空文件夹跟远程仓库同步....
好了,本次的教程就到此为止了!
篇幅较大,可能存在些许错别字,或者表述不清晰的情况,
亦或者有某个点说明不正确的情况,还请批评指正!
如果能对各位有所帮助,那是十分荣幸!