一、Git 概述
Git 是 Linus Torvalds 为了帮助管理 Linux内核开发的一个开源的版本控制软件。
Linux之父(Linus Torvalds)的代表作:Linux、Git。
1. 为什么要用Git?
Git是一个分布式版本控制工具,主要用于管理开发过程中的源代码文件(如 Java类、xml文件、html页面等),在软件开发过程中被广泛使用。(使用Git管理我们项目的版本,方便日后维护、团队协作等等)
通过Git仓库来存储和管理我们开发中的源码文件,Git仓库分为两种:
- 本地仓库:开发人员自己电脑上的Git仓库。
- 远程仓库:远程服务器上的Git仓库。
Git本地的三个工作区域
Git本地有三个工作区域:工作区(Workspace)、暂存区(Stage/Index)、版本库(Repository或Git Directory)。
如果再加上远程的git仓库(Remote Directory)就可以分为四个工作区域。文件在这四个区域之间的转换关系如下:
-
Workspace
:工作区,就是你平时存放项目代码的地方。 -
Index/Stage
:暂存区,用于临时存放你的改动,事实上它只是一个文件,保存即将提交到文件列表信息,一般存放在.git
目录下的 index 文件(.git/index)中,所以我们把暂存区有时也叫作索引(index)。 -
Repository
:仓库区(或者叫本地版本库),就是安全存放数据的位置,这里面有你提交到所有版本的数据。其中HEAD指向最新放入仓库的版本; -
Remote
:远程仓库,托管代码的服务器,可以简单的认为是你项目组中的一台电脑用于远程数据交换;
2. 版本控制工具
软件开发的过程,会不断升级版本,通过文件备份的方式管理代码版本,会成为一场灾难。因此需要版本控制工具来管理代码的版本。
版本工具的选择:
-
Git(分布式版本控制工具),Git官网地址:https://git-scm.com/
-
SVN(集中式本版控制工具),SVN官网地址:https://tortoisesvn.net/
-
VSS
区别:使用SVN在断网的时候,本地环境不能切换版本,而Git能。
3. 使用Git能做什么
- 代码回溯:Git在管理文件过程中会记录日志,方便回退到历史版本。
- 版本切换:Git存在分支的概念,一个项目可以有多个分支(版本),可以任意切换。
- 多人协作:Git支持多人协作,即一个团队共同开发一个项目,每个团队成员负责一部分代码,通过Git就可以管理和协调。
- 远程备份:Git通过仓库管理文件,在Git中存在远程仓库,如果本地文件丢失还可以从远程仓库获取。
4. Git代码托管平台
我们可以借助互联网上提供的一些代码托管平台来搭建Git远程仓库,其中比较常用的有GitHub、码云、GitLab等。
1、GitHub:https://github.com (国外的,访问有点慢)
2、coding :https://coding.net(国内腾讯云旗下的)
3、gitee(码云):https://gitee.com(国内的,常用)
4、GitLab:https://gitlab.cn/(公司可能会有,搭建一个类似于GitHub的仓库)
总结:
名称 | 网址 | 说明 |
---|---|---|
gitHub | https://github.com/ | 一个面向开源及私有软件项目的托管平台,因为只支持Git 作为唯一的版本库格式进行托管,故名gitHub |
码云 | https://gitee.com/ | 国内的一个代码托管平台,由于服务器在国内,所以相比于GitHub,码云速度会更快 |
GitLab | https://about.gitlab.com/ | 一个用于仓库管理系统的开源项目,使用Git作为代码管理工具,并在此基础上搭建起来的web服务 |
BitBucket | https://bitbucket.org/ | 一家源代码托管网站,采用Mercurial和Git作为分布式版本控制系统,同时提供商业计划和免费账户 |
5. Git的下载与安装
1、 Git官网下载
Git官网下载地址:https://git-scm.com/
2、第三方下载Git
淘宝镜像源下载:https://registry.npmmirror.com/binary.html?path=git-for-windows/
Git-2.20.1-64位下载地址:https://registry.npmmirror.com/-/binary/git-for-windows/v2.20.1.windows.1/Git-2.20.1-64-bit.exe
按步骤点击后,本地会下载Git-2.20.1-64-bit.exe
可执行文件:(安装的时候双击exe文件即可)
3、安装Git
Git的安装教程:https://blog.csdn.net/qq_46921028/article/details/114898728 (默认下一步即可)
安装成功之后,在开始菜单上有3个程序:
Git Basth : Linux风格的命令行;
Git CMD : Windows风格的命令行;
Git GUI: 图形化界面的Git;
二、Git常用命令
1.Git 全局设置
第一次安装Git,需要配置用户名称和邮箱地址,这是非常重要的,因为每次Git提交都会用到这些用户信息:
git config --global user.name "dazhangwei" #配置名称
git config --global user.email"dazhangwei@163.com" #配置邮箱
查看配置信息: git config --list
git config --list
2. 获取Git仓库
使用Git对我们的代码进行管理,首先需要获得Git仓库,获取Git仓库通常有以下两种方式:
- 在本地初始化Git仓库(不常用)
- 从远程仓库克隆(常用)
2.1 在本地初始化Git仓库
操作步骤如下:
1、在任意目录下创建一个空目录(例如repo1)作为我们的本地Git仓库。
2、进入这个目录中,点击右键打开Git bash
窗口。(Git命令行)
3、执行命令:git init
(初始化本地仓库)
如果在当前目录中看到.git
文件夹(此文件夹为隐藏文件夹)则说明Git仓库已经创建成功啦。
2.2 从远程仓库克隆
Git将远程仓库克隆到本地命令如下:(注意:在本地没有版本库的情况下执行)(版本库就是.git目录
)
git clone 远程仓库url地址
示例:将码云上的若依项目(仓库)克隆到本地
git clone git@gitee.com:y_project/RuoYi.git
2.3 Git本地的三个工作区域
Git本地的三个工作区域:工作区、暂存区、版本库。
-
版本库
:前面看到的.git
隐藏文件夹就是版本库,版本库中存储了很多配置信息、日志信息和文件版本信息等。 -
工作区
:包含.git
文件夹的目录就是工作区,也称为工作目录,主要用于存放开发的代码。 -
暂存区
:.git
文件夹中有很多文件,其中有一个index文件就是暂存区,也可以叫做stage。暂存区是一个临时保存修改文件的地方。
2.4 Git工作区中文件的状态
Git工作区中的文件存在两种状态:
-
untracked 未跟踪(未被纳入版本控制)
-
tracked 已跟踪(被纳入版本控制)
- Unmodified 未修改状态。
- Modified 已修改状态。
- Staged 已暂存状态。
注意:文件的状态会随着我们执行Git的命令发生变化。
示例1:在工作区中新建a.txt文件,然后使用命令
git status
查看文件状态。
示例2:将a.txt加到暂存区中,然后查看文件状态。
示例3:修改a.txt文件内容,然后查看文件状态。
示例4:将暂存中的a.txt文件提交。
git commit -m "a.txt" a.txt
示例5:查看日志
git log
3. 本地仓库操作
本地版本库操作操作命令如下:
git status
:查看文件状态git add 目录
:将工作区内的指定文件添加到暂存区。git add 文件
:将工作区内的指定目录(包括子目录)添加到暂存区中。git add .
:将工作区内的所有文件或目录添加到暂存区中。git reset 目录或文件
:将暂存区的指定目录或文件取消暂存。git reset --hard 版本号
:切换到指定版本。(每次commit都会产生新的版本号,通过版本号就可以回到历史版本)git commit -m "日志" 目录或文件
:将暂存区的目录或文件提交到本地版本库,并设置日志。git commit -m "日志"
:将暂存区的所有目录文件提交到本地版本库,并设置日志。git log
:查看本地版本库的所有日志。git log 目录或文件
:查看本地版本库指定目录或者文件的日志。
示例:查看本地版本库的所有日志、查看本地版本库a.txt文件的日志
版本追溯
版本追溯的作用:
- 最新版本出现了一个很严重的BUG,需要回到上一个版本重新开发。
- 找回丢失的文件
- 浏览过去的代码
1、线上可以通过浏览提交的信息查看对应的版本:(或者本地仓库通过git log 查看提交记录,进行回滚操作)
2、本地通过回溯命令切到指定版本:git reset --hard 版本号
lenovo@LAPTOP-HGGI9K40 MINGW64 /e/Test/stz (master)
$ ll
total 10
-rw-r--r-- 1 lenovo 197609 42 May 25 22:52 123.txt
-rw-r--r-- 1 lenovo 197609 5 May 25 22:50 233.txt
-rw-r--r-- 1 lenovo 197609 852 May 25 22:18 README.en.md
-rw-r--r-- 1 lenovo 197609 942 May 25 22:18 README.md
lenovo@LAPTOP-HGGI9K40 MINGW64 /e/Test/stz (master)
$ git reset --hard dd3b325
HEAD is now at dd3b325 上传123.txt
lenovo@LAPTOP-HGGI9K40 MINGW64 /e/Test/stz (master)
$ ll
total 9
-rw-r--r-- 1 lenovo 197609 14 May 25 23:20 123.txt
-rw-r--r-- 1 lenovo 197609 852 May 25 22:18 README.en.md
-rw-r--r-- 1 lenovo 197609 942 May 25 22:18 README.md
总结:
- 如果将文件提交 (commit ),此文件不管以后是否删除,都可以通过版本追溯找回,所以不会担心文件丢失。(因为它把我们所有操作都存在一个.git文件夹中)
- 如果是团队开发,commit中的备注要写清楚,方便版本追溯。
- 开发项目的过程中,每天至少提交一次。
4. 远程仓库操作
远程版本库操作命令如下:
git remote
:查看关联的远程版本库。(remote锐某特:远程,遥远的意思)git remote -v
:查看关联的远程版本库详细信息。git remote add [远程版本库简称] [远程版本库地址]
: 关联远程版本库。git push [远程版本库简称] [分支名称]
:将本地的分支推送到指定远程版本库。git pull [远程版本库简称] [分支名称]
:将远程版本库中指定分支拉取到本地版本库。(若是未关联的版本库,执行git pull命令后面需要添加参数--allow-unrelated-histories
)git clone [远程仓库地址]
:将远程仓库的文件拷贝到本地。
示例1:查看本地已关联的远程版本库,命令:
git remote
。
git remote
示例2:在本地仓库上与远程仓库进行关联。(映射关系)命令:
git remote add 远程仓库简称 远程仓库地址
。
git remote add origin git@gitee.com:aopmin/java-blog.git
本地仓库配置的远程仓库都需要一个简称(如:origin,起源的意思),后续在和远程仓库交互时会使用到这个简称
注意:一个本地仓库可以关联多个远程仓库。
示例3:将本地仓库内容推送到远程仓库的master分支上,命令格式:
git push 远程仓库简称 分支名称
。
git push origin master
示例4:从远程仓库上拉取文件。命令:
git pull 远程仓库简称 分支名称
。
git pull origin 分支名称
注意:如果当前本地仓库不是从远程仓库克隆,而是本地创建的仓库,并且仓库中存在文件,此时再从远程仓库拉取文件的时候会报错(fatal: refusing to merge unrelated histories
):
解决方案:在git pull命令后面添加参数 --allow-unrelated-histories
。(强制拉取)
git pull origin 分支名称 --allow-unrelated-histories
以后操作的时候:先pull,再push。
5. 分支管理
分支是Git 使用过程中非常重要的概念。使用分支意味着你可以把你的工作从开发主线上分离开来,以免影响开发主线。
本地仓库和远程仓库中都有分支,同一个仓库可以有多个分支,各个分支相互独立,互不干扰。
通过 git init
命令创建本地仓库时默认会创建一个 master 分支。
分支的相关命令,具体命令如下:
git branch
: 查看本地分支。git branch -r
:查看远端分支。git branch -a
:查看所有分支。(本地和远端)git branch [分支名称]
: 创建分支。git checkout [分支名称]
: 切换分支。git push [远程仓库简称] [远程仓库分支名称]
: 将本地分支推送至远程仓库分支。(如果远程没有这个分支,它会自动创建)git merge [分支名称 ]
:合并指定分支到当前分支上。git branch -d [分支名名称]
:删除本地分支。(要强制删除把-d
换成大写的-D
)git push [远程仓库简称] --delete [远程分支名称]
:删除远程仓库分支。
示例1:创建分支,分支名为dev,命令:
git branch 分支名
git branch dev
示例2:切换分支,命令:
git checkout 分支名
git checkout dev
示例3:在dev分支上进行一些操作,然后推送到远程仓库分支上。(如果远程没有dev分支,它在会自动在远程仓库创建)
lenovo@LAPTOP-NN0OFV71 MINGW64 ~/Desktop/test/repo1 (dev)
$ touch hello.txt # 创建一个空文件
lenovo@LAPTOP-NN0OFV71 MINGW64 ~/Desktop/test/repo1 (dev)
$ git status
On branch dev
Untracked files:
(use "git add <file>..." to include in what will be committed)
hello.txt
nothing added to commit but untracked files present (use "git add" to track)
lenovo@LAPTOP-NN0OFV71 MINGW64 ~/Desktop/test/repo1 (dev)
$ git add hello.txt
lenovo@LAPTOP-NN0OFV71 MINGW64 ~/Desktop/test/repo1 (dev)
$ git status
On branch dev
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
new file: hello.txt
lenovo@LAPTOP-NN0OFV71 MINGW64 ~/Desktop/test/repo1 (dev)
$ git commit -m "新增hello.txt"
[dev fc2df1f] 新增hello.txt
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 hello.txt
lenovo@LAPTOP-NN0OFV71 MINGW64 ~/Desktop/test/repo1 (dev)
$ git status
On branch dev
nothing to commit, working tree clean
lenovo@LAPTOP-NN0OFV71 MINGW64 ~/Desktop/test/repo1 (dev)
$ git push origin dev #推送到远程分支
Enumerating objects: 4, done.
Counting objects: 100% (4/4), done.
Delta compression using up to 16 threads
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 309 bytes | 309.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
remote: Powered by GITEE.COM [GNK-6.4]
remote: Create a pull request for 'dev' on Gitee by visiting:
remote: https://gitee.com/xxxxx/java-blog/pull/new/aopmin:dev...aopmin:master
To gitee.com:aopmin/java-blog.git
* [new branch] dev -> dev
lenovo@LAPTOP-NN0OFV71 MINGW64 ~/Desktop/test/repo1 (dev)
$
注意:
- 如果本地分支与远程分支同名使用命令:
git push orign 分支名
即可。 - 如果本地分支与远程分支名不一致使用命令:
git push orign 本地分支:远程分支
。 - 例如把本地分支dev推送远程分支develop:git push orign dev:develop。
示例4:切换master分支,将dev上的内容合并到master分支。(merge末哥:合并的意思)
git checkout master
git merge dev
注意:分支合并时需注意合并的方向,如上图所示,在Master分支执行操作,结果就是将dev分支合并到Master分支。
解决合并冲突问题:(多个分支上相同文件内容不一致,取舍问题,几个人商量谁的好就用谁的)
-
合并的时候若有冲突了,需要编辑文件修改冲突,然后再重新提交。
-
提交的时候会有错,建议在提交commit命令后面加上
-i
即可。
1、在master分支上修改之前创建的hello.txt。(别忘commit)
2、在dev分支上修改之前创建的hello.txt。(别忘commit)
3、在master分支去合并dev分支。vi
编辑冲突文件:
在master分支上再次提交hello.txt即可:
git add hello.txt
git commit -m "合并dev内容" hello.txt -i #解决提交错误问题
注意:虽然rebase 变基虽然好用,用不好也会导致致命问题。
示例:删除远程仓库上的dev分支。 `
git push origin --delete dev
6. 标签管理
Git 中的标签,指的是某个分支某个特定时间点的状态。通过标签,可以很方便的切换到标记时的状态。
比较有代表性的是人们会使用这个功能来标记发布结点(v1.0 、v1.·等)。以下面是MP的标签:
以下是标签处理相关的命令:
git tag # 查看标签
git tag 标签名 # 创建标签
git push 远程版本库简称 标签名 # 将标签推送到远程仓库
git checkout -b 新分支名称 标签名 # 检出标签(修复bug用的,例如windows打补丁,检出某个出问题的标签到一个新分支上,然后去修复bug)
这东东一般由运维管理。