1️⃣前言
今天学习的笔记内容是:
- Git学习手册
2️⃣概述
2.1、版本控制
在实际开发中,随着新的需求以及新的Bug不断涌现,版本控制的概念是非常重要的,而版本控制工具使得我们可以追踪多个版本的开发和维护活动,其提供了版本管理的功能,可以存储、追踪文件的修改历史,我们可以浏览文件的变动历史,因此版本控制工具是开发中的必备工具之一。
2.2、工具
版本控制工具一般可以分为两种:
- 集中式版本控制:版本库集中存放在中央服务器,用户在开发中可以从中央服务器下载代码,修改完毕后再提交到中央版本库中去。其中代表工具有:
CVS
和SVN
; - 分布式版本控制:分布式版本控制并没有“中央服务器”的概念,每个用户的电脑都是一个完整的版本库,当多人协作时只需将自己的代码修改推送给对方既可。其中代表工具有:
Git
。
2.3、Git的介绍
分布式与集中式的最大区别在于开发者可以提交到本地,用户通过克隆就可以在本地机器上拷贝一个完整的仓库,而不必不必服务器端的软件支持。
而Git
就是一个开源的,分布式的,版本控制工具。
最初Git
是由Linus Torvalds为了帮助管理Linux内核开发而开发的版本控制工具。
Git的特点在于:
- 高速且灵活
- 可离线工作
- 允许多个并行开发的分支
- 适合分布式开发
- 有能力高效管理类似Linux内核一样的超大规模项目
备注:
- Git命令手册地址:https://git-scm.com/docs
- Git下载地址:https://git-scm.com/download
2.4、Git基本配置
安装Git后,首先要做的就是设置用户名以及邮件地址,这是因为每次Git提交都会使用该用户的信息。
步骤如下:
- 打开Git Bash
- 设置用户信息:
git config --global user.name "名字"
git config --global user.email "邮箱"
- 配置后可查看信息:
git config --global user.name
和git config --global user.email
2.5、为常用指令设置别名
我们可以为一些指令设置别名,这样就不用每次使用时都得输入若干参数。
设置别名的步骤:
(1)、打开Git Bash
,执行语句:touch ~/.bashrc
,可创建.bashrc
文件。
(2)、在.bashrc
文件中,输入一下内容:
# 用于输入git提交日志
alias git-log='git log --pretty=oneline --all --graph --abbrev-commit'
# 用于输出当前目录所有文件以及基本信息
alias ll='ls -al'
(3)、最后一步,打开Git Bash,执行source ~/.bashrc
这样,当我们每次查看提交日志时,就不用在git log
后面添加一堆参数,直接输入快捷语句git-log
即可。
3️⃣Git的使用
3.1、获取本地仓库
要使用Git对我们的代码进行版本控制,则必须获取本地仓库。
步骤如下:
- 创建一个文件夹作为我们本地的Git仓库;
- 进入这个文件夹,鼠标点击右键,打开Git Bash窗口,执行命令:
git init
举个例子:
- 新建一个文件夹
git-test
- 进入新建的文件夹,打开Git Bash窗口,输入语句
git init
备注:如果本地仓库创建成功,则可以在文件夹下看见隐藏的.git
目录
3.2、基础指令
3.2.1、文件状态
在Git工作目录下,文件一般会有四种状态:未跟踪,未暂存,已暂存还有已提交。这些状态随着我们执行Git命令而发生变化。
具体看下面示意图:
3.2.2、工作区、暂存区以及仓库
- 工作区
就是你在电脑里能看到的目录,也就是某个文件夹。
- 暂存区
也就是存放在.git
目录下的index
文件中,即.git/index
。有时我们将暂存区称作索引。
- 仓库(也就是版本库)
在工作区下的隐藏目录.git
就是当前的版本库。
3.2.3、查看修改的状态
- 命令:
git status
- 作用:查看修改的状态(暂存区 / 工作区)。
3.2.4、添加单个文件到暂存区
- 命令:
git add 文件名
- 作用:将单个文件添加到暂存区。
3.2.5、将所有修改都加入暂存区
- 命令:
git add .
- 作用:将所有修改都加入暂存区去。
3.2.6、提交暂存区到本地仓库
- 命令:
git commit -m "注释内容"
- 作用:将暂存区里的内容提交到本地仓库的当前分支。
备注:
- 在Linux系统中,
commit
需要信息使用单引号'
括起来 - 而在Windows系统下,
commit
信息使用双引号"
括起来。
3.2.7、查看提交日志
- 命令:
git log
- 作用:查看提交日志内容。
需要注意,该语句可以带有可选参数:
git log [--all] [--pretty=oneline] [abbrev-commit] [--graph]
各参数的作用如下:
--all
:显示所有分支;--pretty=oneline
:将提交信息显示为一行;abbrev-commit
:使输出的内容更加简短;--graph
:以图的形式显示。
3.2.8、版本回退
- 命令:
git reset --hard commitID
- 作用:版本切换,也就是版本回退
备注:使用git log
指令可以查看到commitID
3.2.9、查看已删除的记录
- 命令:
git reflog
- 作用:查看已经删除的提交记录
3.3、分支
几乎所有版本控制系统都以某种形式支持分支。
使用意味着你可以从开发主线上分离开来进行重大Bug的修改,开发新功能等。一个分支代表一条独立的开发线,并不会影响主线的开发。
需要注意:在执行git init
时,默认情况下Git
就会为你创建master
分支。
3.3.1、查看本地分支
- 命令:
git branch
3.3.2、创建本地分支
- 命令:
git branch 分支名
3.3.3、切换分支
- 命令:
git checkout 分支名
3.3.4、创建并切换分支
- 命令:
git checkout -b 分支名
3.3.5、合并分支
- 命令:
git merge 分支名
3.3.6、删除分支(需检查)
- 命令:
git branch -d 分支名
3.3.7、删除分支(不用检查,强制删除)
- 命令:
git branch -D 分支名
3.3.8、解决合并分支的冲突
为什么需要解决冲突?
当两个分支上对文件的修改存在冲突时,比如两个分支同时修改了同一文件中的同一行代码,此时Git无法判断应该怎么合并,这时候就需要手动解决该冲突问题。
步骤如下:
- 处理文件中冲突的地方;
- 将解决完冲突的文件添加到暂存区中;
- 提交到版本库中。
3.3.9、不同分支的使用
在开发中,一般可以有以下原则:
master
分支:属于生产分支,也就是主分支,可作为线上运行的应用对应分支。develop
分支:作为开发分支,一般用于开发部的主要开发分支,该分支会不断有新的feature
分支合并进来。当阶段开发完成后develop
分支将合并到master
分支上去,准备上线;feature/xxx
分支:该分支是从develop
分支上创建而来,用于并行开发,当任务完成后可合并到develop
分支上去;hotfix/xxx
分支:一般用于线上bug修复,修复完成后需要合并到master
分支和develop
分支,合并完成后hotfix
分支可以删除;- 当然,还有其他命名的分支,比如代码测试分支
test
,预上线分支pre
等,具体应看公司规定。
3.4、小结
记录:
- HEAD用于指向当前分支,在上图中,HEAD指向了master分支。
- objects表示Git的对象库,实际位于
".git/objects"
目录下,包含了创建的各种对象及内容。 - 当对工作区中修改或新增的文件执行
git add
命令时,暂存区的目录树被更新,同时该文件的内容会被写入到对象库中的一个新的对象中,而该对象的ID
被记录在暂存区的文件索引中。 - 当执行提交操作
git commit
时,暂存区的目录树将写入到版本库中的对象库object
,此时master
分支也会做相应的更新。 - 当执行
git reset master
命令时,暂存区的目录树会被重写,被master
分支指向的目录树所替换,但是工作区不受影响。 - 当执行
git checkout -- <file>
命令时,暂存区中指定的文件将替换工作区的文件。此时工作区未添加到暂存区中的改动将被清除。 - 当执行
git checkout HEAD <file>
命令,此时HEAD
指向的master
分支中的指定文件将替换暂存区和以及工作区中的文件。需要注意,这个操作将会清除工作区中未提交的改动,同时还会清除暂存区中未提交的改动,因此得慎用。
4️⃣远程仓库的使用
4.1、什么是远程仓库?
对于Git来讲,仓库分为两种,一种是本地仓库,另一种是远程仓库。
之前讲过,Git不像SVN那样有个中央服务器,如果想通过Git来分享代码或者多人协同开发,则需要将开发文件放在一台公共服务器上,每个开发人员都能够连接得到。这也就是远程仓库。
从概念上讲,远程仓库是就是指托管在因特网或其他网络中的你的项目的版本库。 你可以有好几个远程仓库,通常有些仓库对你只读,有些则可以读写。 与他人协作涉及管理远程仓库以及根据需要推送或拉取数据。
4.2、常用的托管服务
一般我们都是借助互联网上的一些代码托管平台来搭建Git远程仓库。其中常用的有GitHub、Gitee以及GitLab等
下面简单介绍前两个网站:
- GitHub:一个基于Git的,面向开源的托管平台,因为只支持Git作为唯一的版本库格式进行托管,故名GitHub。注意,免费用户只能使用公共仓库,也就是公开代码。而付费用户可以建立私人仓库。
- GitHub网址:【https://github.com】
- Gitee:由开源中国(OSChina)推出的,基于Git的代码托管服务,其包括三个版本,分别是社区版、企业版和高校版。
- Gitee网址:【https://gitee.com】
- gitLab:一个基于Git作为代码管理工具,用于仓库管理系统的开源项目,并在此基础上搭建起来的Web服务。一般用于在企业或学校等内部搭建Git私人服务器。
- GitLab网址:(https://about.gitlab.com
4.3、配置SSH公钥
由于本地Git仓库和远程仓库一般是通过SSH加密的。
因此我们需要配置SSH公钥,将个人公钥添加到远程服务端的配置文件中去。这样远程服务端就能辨别是否为本人操作。
首先我们需要查看C盘用户主目录中的.ssh
目录下是否有id_rsa
和id_rsa.pub
文件。如果有,则证明已经有了公钥,直接打开后复制获取就行。这两个文件就是SSH Key
的秘钥对,其中id_rsa
文件存储的是私钥,不能泄露,id_rsa.pub
文件存储的是公钥,可以放心地告诉任何人。
如果没有上述两个文件,则需要创建SSH Key公钥。步骤如下:
- 打开
git bash
窗口 - 输入
ssh-keygen -t rsa
命令(用于生成公钥) - 按照默认设置,一路不断回车即可
可以注意到,如果公钥已经存在,此时执行上述语句后,新的公钥会进行自动覆盖。
创建公钥成功后,我们可以打开id_rsa.pub
文件来获取公钥,当然也可以在git bash
窗口下输入命令cat ~/.ssh/id_rsa.pub
用于打开id_rsa.pub
文件。
最后,在远程仓库里配置生成的公钥即可。
4.4、添加远程仓库
我们需要输入以下命令,用于告诉Git本地仓库,你所对应的远程仓库是哪一个?
- 命令:
git remote add origin 远程仓库地址
可以看到,在上述命令中,origin就是远程仓库的名字,一般默认下我们都会起这个名字用于代表远程库,这是一种习惯命名,当然你也可以起其他的名字。
而远程仓库地址可从远端服务器上获取。
4.5、查看远程仓库
在本地Git仓库中,我们可以查看添加的远程仓库有哪些。
- 输入命令:
git remote
如果想看到每个远程仓库的实际链接地址,我们可以加上-v
参数。
- 输入命令:
git remote -v
4.6、推送到远程仓库
当我们将本地仓库和远程仓库关联后,就可以将本地仓库的内容推送(push)到远程仓库中去。
- 输入命令:
git push origin master
上述命令用于将本地仓库中的master
分支推送到远程仓库中的master
分支。
另外,为了可以简化推送命令,我们有时会加入--set-upstream
参数用于建立本地分支和远端分支的关联关系。
- 输入命令:
git push --set-upstream origin master
当关联关系建立好后,我们再次推送本地仓库到远程仓库的命令就可以简化许多,可以省略远端名和分支名。如下所示:
- 直接输入命令:
git push
即可。
4.7、查看关联关系
我们可以输入以下命令来查看本地分支与远程分支的关联关系。
- 输入命令:
git branch -vv
4.8、从远程仓库中克隆
我们可以将远程仓库中的内容克隆到本地电脑中。
- 输入命令:
git clone <远程仓库地址> [本地目录]
可以注意到,上述命令中的[本地目录]
是可以省略的。
4.9、提取远程仓库的更新
一般来说,对于克隆我们都是操作一遍即可。后续本地仓库需要获取远端仓库的更新,可以使用以下命令。
- 输入命令:
git fetch
执行完上述命令后,将抓取远程仓库中的所有更新分支。当然,我们也可以指定远程仓库的名字以及分支名进行抓取更新。如下所示:
- 命令:
git fetch origin [分支名]
4.10、合并远程仓库的更新
需要注意到,当我们执行完抓取命令后,只是将远程仓库里的更新抓取到本地而已,不会进行合并。我们需要进行merge
操作来将分支合并到当前分支中。
- 比如输入命令:
git merge origin/master
4.11、拉取远程仓库的更新并自动合并
- 输入命令:
git pull origin [分支名]
上述拉取命令用于将远程仓库中的更新拉取到本地仓库中并进行自动合并。
效果等同于fetch + merge
。
当然,如果你直接输入命令git pull
而没有指定远程仓库名和分支名,那么默认会抓取所有的更新并且合并。
5️⃣写在最后
好了,本篇笔记就到写这,欢迎大家到评论区一起讨论!