Git
序
文章并不完全是按照强逻辑联系在一起排版的,各位根据所需按目录进行跳转。
撒花撒花,学了那么久,终于搞完啦
学计算机专业,尤其是搞软件开发的,真的建议先学Git,了解GitHub的使用,不然你真的会错过太多学习优秀项目时间,就像我一样,悔恨不已。
什么是Git
Git是目前世界上最先进的分布式版本控制系统。
Git是用C语言开发的。
分布式版本控制系统
特点:
- 基于服务器、客户端的运行模式
- 服务器保存文件的所有更新版本
- 客户端是服务器的完整备份,并不只是保留文件的最新版本
优点:
- 联网运行,支持多人协作开发
- 客户端断网后支持离线本地提交版本更新
- 服务器故障或损坏后,可使用任何一个客户端的备份进行恢复
版本库
什么是版本库
版本库,又名仓库,repository。可以简单理解为一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改、删除,Git都能跟踪,以便任何时候都可以追踪历史,或者在将来某个时刻可以“还原”。
Git的安装与配置
安装根据提示一直下一步即可。
配置用户信息,用于记录操作修改的人员信息:
git config —global user.name "您的昵称"
git config —global user.email "您的邮箱"
仓库管理命令
初始化命令
通过git init将目录文件变成可以管理的仓库。
添加文件至暂存区
通过git add 将文件添加到版本库,也就是开始跟踪该文件的修改。
作用:
- 可以用它开始跟踪新文件
- 把已跟踪的、且已修改的文件放到暂存区
- 把有冲突的文件标记为已解决状态
其他:
向暂存区一次性添加多个文件git add .
一次性将所有的新增和修改过的文件加入暂存区
提交文件至本地仓库
通过git commit 将文件提交到版本库,一定要带上-m
添加备注信息。
跳过使用暂存区域
git commit -a -m "描述信息"
直接将工作区的文件提交到Git仓库
查看文件状态
通过git status 查看当前仓库中文件状态。
以精简的方式显示文件状态:git status -s 或者 git status -- short
??表示未跟踪状态,untracked
A表示新添加到暂存区状态
M表示修改过的、没有放入暂存区的文件状态
M表示已修改且已放入暂存区的文件状态
查看文件在当前工作区与本地仓库的异同
通过git diff 查看前后文件的区别,即改动内容。
查看历史版本
通过git log 查看仓库内文件的历史版本,加上–pretty=oneline 用一行展示。
取消暂存的文件
git reset HEAD 要移除的文件名称
回退到指定的版本
通过git reset --hard commit_id 回退到版本号所处的仓库状态。
commit_id:
- 版本号,可以用HEAD表示当前版本,上一个版本就是HEAD,上上个版本就是HEAD^,往上100个版本可以表示成HEAD~100
- 也可以是十六进制表示的数字编号
移除文件
- 从Git仓库和工作区中同时移除对应的文件
git rm -f index.js
- 只从Git仓库中移除指定的文件,但保留工作区中对应的文件
git rm --cached index.css
查看提交历史
通过git reflog 查看历史提交的版本备注内容。
关于git log 和git reflog的区别是:前者是历史提交的详细信息,包括版本号、作者信息、日期、提交时的备注内容,后者是直接查看版本备注信息。
撤销工作区的修改
git restore to discard changes in working directory
git checkoutto discard changes in working directory
上述两条命令都是撤销工作区的修改。git checkout其实就是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以一键还原。
远程仓库
Gitee和GitHub都是可以提供Git仓库托管服务的。注册相关账号,你就拥有了远程仓库。
本地仓库与远程仓库之间的传输是通过SSH加密的,配置步骤如下:
-
创建SSH Key。在
C:\Users\Administrator
目录下,看是否已有.ssh目录,该目录下是否有id_rsa
和id_rsa.pub
这两个文件。如果有可直接跳过,没有就在Git Bash
中执行如下命令创建SSH Key:ssh-keygen -t rsa -C "[email protected]"
-
登录远程仓库的账号,找到设置下的SSH字样,在Key文本框中粘贴
id_rsa.pub
文件中的内容
-
添加完成
添加远程库
找到Create a new repository的页面,点击创建仓库按钮新建一个名为learngit的仓库。
关联远程库
git remote add origin [email protected]:ahcici/learngit.git
将.com
后面的ahcici替换成你自己的账户名,远程库的名字是origin,也可以更改为其他的。
推送本地库内容
git push -u origin main
加上-u
会把本地的分支和远程的分支关联起来,只在第一次推送的时候使用
可以简化以后的pull/push命令
之后的推送命令就可以是git push origin main
这个origin后的分支名,看你自己有没有改动过,以路径后面提示的内容为准。
origin是远程仓库的别名。
删除远程库
并不是真正意义上的删除远程库,只是取消本地仓库与远程仓库的连接。
通过git remote -v查看远程库信息。
通过git remote rm origin<远程仓库名称>解除本地与远程仓库的绑定关系。
克隆远程库
假若我不小心将我本地的learngit目录删除了,由于我已经推送过远程库,那么我可以从远程库复制一份到本地,也被称之为克隆。
首先,得先清楚要克隆的仓库地址,其也就是咱们之前关联的仓库地址是一样的,就是这样的格式: [email protected]:ahcici/learngit.git
按图操作,最后使用git clone [email protected]:ahcici/learngit.git<你第四步复制的地址>
命令克隆到本地。
分支管理
创建分支
git checkout -b dev(分支名)
加上-b
参数表示创建并切换相当于git branch dev
【创建分支】+git checkout dev
【切换分支】
查看分支列表
git branch
查看当前分支列表 分支名字前的*好表示当前所处的分支
查看远程仓库中的分支列表git remote show origin
合并分支
git merge dev(分支名)
合并指定分支到当前分支
合并分支时,使用--no-ff
参数表示禁用fast forward使用普通合并。
删除分支
git checkout -d dev(分支名)
删除指定分支
删除远程分支
git push 远程仓库名称 --delete 远程分支名称
切换分支
git switch -c dev
创建并切换到新的dev分支
解决冲突
在两个不同的分支中,对同一个文件进行了不同的修改, 即git无法执行“快速合并”,只能试图将各自的修改合并起来,所以会存在冲突,需要手动进行修改再添加并提交。
分支合并图
git log --graph
可以查看分支合并图。
git log --graph --pretty=oneline —abbrev-commit
一行展示合并图和提交信息简写。
相关概念
开源许可协议
BSD
Apache License 2.0
GPL: 具有传染性的一种开源协议,不允许修改后和衍生的代码作为闭源的商业软件发布和销售
具有GPL的最著名的软件项目是:Linux
LGPL
MIT: 是目前限制最少的协议,唯一的条件:在修改后的代码或者发行包中,必须包含原作者的许可信息
使用MIT的软件项目有jquery、Node.js
开源项目托管平台
专门用于免费存放开源项目源代码的网站
GitHub
Gitlab
Gitee
远程仓库的两种访问方式
- HTTPS:零配置;但是每次访问仓库时,需要重复输入GitHub的账号和密码才能访问成功
- SSH:需要进行额外配置;但是配置成功后,每次访问仓库时,不需重复输入github的账号和密码
在实际开发中,推荐使用SSH的方式访问远程仓库。
SSH Key
作用:实现本地仓库和github之间的免登录的加密数据传输。
工作区与暂存区
工作区是咱们所操作的文件目录,除了工作区外,还有一个暂存区,也就是git add 以后文件被存储的位置,而git commit 以后文件就被提交到了master主分支上。
通俗来讲,就好比在餐厅吃饭,我们几个人先点了单,但是途中我们会希望换掉某道菜或再加上几道菜,等到最后已经吃饱喝足,就得付款了,那么实际付的金额就是最后修改后所有菜单内容的价值。当然或许这个例子不太恰当,但在这里足够说明工作区、暂存区和最后的分支上的内容是有差的。
需要注意的是Git跟踪并管理的是修改,而非文件。
master主分支:用来保存和记录整个项目已完成的功能代码
功能分支:专门用来开发新的功能的分支
常见错误
Q:fatal: not a git repository (or any of the parent directories): .git
A:当前目录文件夹不是Git仓库,即没有.git
进行管理,操作无效
Q:fatal: pathspec 'readme.txt' did not match any files
A:匹配不到readme.txt
文件,即文件不存在或文件名字有误导致找不到