1、Git
引言
单人开发时,可用于项目的进行版本管理,利于开发进度控制
多人开发时,可用于版本管理,和多人协同控制
介绍
Git 分布式版本控制系统,开源
安装(省略)
官方下载,安装
安装后的设置
#打开cmd,输入git,有打印日志信息则安装成功
git
#设置全局配置,设置用户名和邮箱,提交版本时会用到
git config --global user.name "用户名"
git config --global user.email "邮箱"
#查看配置信息
git config -l |
#查看当前git版本
git --version
概念图
名词概述
版本库:工作区中有一个隐藏目录
.git
用于管理git以及同级目录下的文件,.git
不属于工作区
工作区:目录中除了.git
目录不是工区,其余的都是工作区,用于存放要提交的文件
暂存区: 版本库中包含一个临时区域,保存下一步要提交的文件
分支: 版本库中包含若干分支,提交的文件存储在分支中
本地仓库
对应的就是一个目录,输入git init 该目录下会生成一个.git文件夹,该文件夹就是版本库,文件夹以外的区域就是工作区
E:\repository1>git init
Initialized empty Git repository in E:/repository1/.git/
效果如下:
创建一个空文件于仓库下:
#查看本地仓库的状态
E:\repository1>git status
On branch master
No commits yet
Untracked files:
(use "git add <file>..." to include in what will be committed)
file1.txt
nothing added to commit but untracked files present (use "git add" to track)
当前仓库没有任何提交,并且提示file1.txt这个文件没有跟踪,也就是没有对该文件加入暂存区或没有存放于分支下;
将文件存放到暂存区中
#添加到暂存区
E:\repository1>git add .
#查看状态
E:\repository1>git status
On branch master
No commits yet
Changes to be committed:
(use "git rm --cached <file>..." to unstage)
new file: file1.txt
这时已经将工作区下的所有文件存放到暂存区中,.
代表将工作区中的所有文件
将暂存区中的文件提交到分支下
E:\repository1>git commit -m "a new file"
[master (root-commit) 0fefd19] a new file
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 file1.txt
每次将暂存区中的文件提交到分支下就相当于该项目的一个版本a new file
则是对这个提交的版本进行描述,例如“新创建的项目”,“添加了校验功能”等,该描述是必填的
远程仓库
当一个项目由多人协同完成时,每个人会负责不同的模块对其进行开发,并对各自完成的部分代码进行共享,合并代码最终成为一个完整的项目,此时就需要远程仓库。
远程仓库存放在服务器上,在服务器上建立远程仓库,开发人员可以从该远程仓库上进行clone,pull,push操作,对项目的版本进行管理。
服务器有:GitHub、Gitee等,以下用Gitee举例;
Gitee操作
首先需要注册Gitee账号,然后登陆;
创建仓库
仓库名称(必填)
点击提交,一个空的远程仓库建好了,如下:
本地仓库连接远程仓库
通过远程仓库地址进行连接
#添加一个远程仓库地址
E:\repository1>git remote add origin https://gitee.com/lin/blog.git
#查看关联地址
E:\repository1>git remote -v
origin https://gitee.com/lin/blog.git (fetch)
origin https://gitee.com/lin/blog.git (push)
#将本地内容存放到远程仓库中去
E:\repository1>git push origin master
Enumerating objects: 3, done.
Counting objects: 100% (3/3), done.
Writing objects: 100% (3/3), 209 bytes | 52.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
remote: Powered by GITEE.COM [GNK-5.0]
To https://gitee.com/linzekai/blog.git
* [new branch] master -> master
初次提交需要输入远程仓库的用户名和密码
完成后,查看Gitee,文件已经上传到了远程仓库中
克隆远程仓库
当中途加入某个开发小组时,可以从远程仓库上直接将当前的项目版本克隆下来,进行开发;
新建一个文件夹,用于存放克隆下类的项目文件
点击克隆,赋值网址
#从远程仓库克隆文件
E:\repository2>git clone https://gitee.com/linzekai/blog.git
从远程仓库中拉取
#拉取远端的数据库分支
git pull origin master
多人协同开发之间的共享过程
通过两个仓库模拟多人协同开发
repository1,修改file1文件的内容,以及创建一个新的文件并提交到远程仓库
C:\Users\Administrator\Desktop\repository1>git add .
C:\Users\Administrator\Desktop\repository1>git commit -m "second edit"
[master d202a0a] second edit
2 files changed, 1 insertion(+)
create mode 100644 file2.txt
C:\Users\Administrator\Desktop\repository1>git push origin master
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Delta compression using up to 4 threads
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 280 bytes | 280.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
remote: Powered by GITEE.COM [GNK-5.0]
To https://gitee.com/linzekai/blog.git
d3b6f0d..d202a0a master -> master
repository2从远程仓库中拉取新的版本
C:\Users\Administrator\Desktop\repository2\blog>git pull origin master
remote: Enumerating objects: 5, done.
remote: Counting objects: 100% (5/5), done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (3/3), 260 bytes | 11.00 KiB/s, done.
From https://gitee.com/linzekai/blog
* branch master -> FETCH_HEAD
d3b6f0d..d202a0a master -> origin/master
Updating d3b6f0d..d202a0a
Fast-forward
file1.txt | 1 +
file2.txt | 0
2 files changed, 1 insertion(+)
create mode 100644 file2.txt
多人协同开发时,写好的代码git push
上传到远程仓库;需要代码的git pull
拉取代码即可
命令 | 作用 |
---|---|
git remote add 便是名(origin)远程地址 | 本地关联远程仓库 |
git push 标识名 master | 将本地仓库内容上传到远程仓库 |
git pull 标识名 master | 从远程仓库下载内容到本地仓库 |
git clone 远程地址 | 将远程仓库复制到本地,并自动形成一个本地仓库 |
分支
- 是每个版本的存储位置,是一条时间线,当执行
git commit
形成版本时,每个版本会依次存储在分支的提交点上; - 分支由多个提交点组成,分支上有一个指针,指向最新的提交点
git的内部优化
分支命令
查看当前仓库的分支
# 仓库默认只有master分支,执行git commit 时默认在master分支上保存版本
C:\Users\Administrator\Desktop\repository2\blog>git branch
* master
实际上,远程仓库的master分支一般不是用于版本的记录,而是用于存储正式的版本;而版本记录一般新建一个分支用于存储记录,当确认新分支的版本没有问题时,才会将该分支上的版本添加到master分支上;
分支的创建
#分支的创建
C:\Users\Administrator\Desktop\repository2\blog>git branch development
#查看分支
C:\Users\Administrator\Desktop\repository2\blog>git branch
development
* master ### 当前分支为master
### 切换分支为development
C:\Users\Administrator\Desktop\repository2\blog>git checkout development
Switched to branch 'development'
C:\Users\Administrator\Desktop\repository2\blog>git branch
* development ### 当前分支为development
master
在工作创建file3新文件(当前分支为development)
C:\Users\Administrator\Desktop\repository2\blog>git add .
### 将所有文件存入暂存区development分支下的新提交点
C:\Users\Administrator\Desktop\repository2\blog>git commit -m "insert file3"
[development f51eed6] insert file3
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 file3.txt
此时在将分支切回master分支
C:\Users\Administrator\Desktop\repository2\blog>git checkout master
Switched to branch 'master'
Your branch is up to date with 'origin/master'.
此时的工作区变成了只有两个文件
因为
每个分支都有一个指针
,创建一个分支,首先是创建一个指针
,而且新分支的指针会和当前分支指向同一个提交点。
新分支包含的提交点就是从第一个提交点到分支指针指向的提交点。
分支提交日志
通过提交日志可以看到分支中提交点的详细情况
### master分支
C:\Users\Administrator\Desktop\repository2\blog>git log --oneline
d202a0a (HEAD -> master, origin/master, origin/HEAD) second edit
d3b6f0d a new file
### 切换到development分支
C:\Users\Administrator\Desktop\repository2\blog>git checkout development
Switched to branch 'development'
### development分支
C:\Users\Administrator\Desktop\repository2\blog>git log --oneline
f51eed6 (HEAD -> development) insert file3
d202a0a (origin/master, origin/HEAD, master) second edit
d3b6f0d a new file
### git log 可以看到详细的日志信息
C:\Users\Administrator\Desktop\repository2\blog>git log
commit f51eed6d3a1e3fbc0544c225765376606fd1aa53 (HEAD -> development)
Author: lzk <lzk15217292146@163.com>
Date: Sun Aug 9 13:21:28 2020 +0800
insert file3
commit d202a0afc3bd9f1d4f67501022de848427b35213 (origin/master, origin/HEAD, master)
Author: lzk <lzk15217292146@163.com>
Date: Sun Aug 9 10:39:56 2020 +0800
second edit
commit d3b6f0d521952d8236b60d39b0415387223bcb22
Author: lzk <lzk15217292146@163.com>
Date: Sun Aug 9 10:23:37 2020 +0800
a new file
分支合并
将一个分支上的内容存放到另一个分支上
当前分支是这样的
#切换到master分支
C:\Users\Administrator\Desktop\repository2\blog>git checkout master
Switched to branch 'master'
Your branch is up to date with 'origin/master'.
### 将分支development的内容合并到master分支上
C:\Users\Administrator\Desktop\repository2\blog>git merge development
Updating d202a0a..f51eed6
Fast-forward ### 快速合并
file3.txt | 0
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 file3.txt
此时,master分支也有了file3文件
合并之后变成这样,快速合并仅仅只是将master指针移动到development指针的同一个提交点上。因为master分支最新的提交点包含在development分支中,并且没有做任何改动。
如果当master分支和development之间有了不同了提交点,此时git会将共同拥有的提交点和各自新创建的提交点进行合并;
当前两个分支都拥有相同的提交点
C:\Users\Administrator\Desktop\repository2\blog>git branch
development
* master
C:\Users\Administrator\Desktop\repository2\blog>git log --oneline
f51eed6 (HEAD -> master, development) insert file3
d202a0a (origin/master, origin/HEAD) second edit
d3b6f0d a new file
C:\Users\Administrator\Desktop\repository2\blog>git checkout development
Switched to branch 'development'
C:\Users\Administrator\Desktop\repository2\blog>git log --oneline
f51eed6 (HEAD -> development, master) insert file3
d202a0a (origin/master, origin/HEAD) second edit
d3b6f0d a new file
此时,在master分支上对文件file1进行了修改,并再次交
### 切换到mster分支
C:\Users\Administrator\Desktop\repository2\blog>git checkout master
Switched to branch 'master'
Your branch is ahead of 'origin/master' by 1 commit.
(use "git push" to publish your local commits)
### 添加到暂存区
C:\Users\Administrator\Desktop\repository2\blog>git add .
### 添加到分支
C:\Users\Administrator\Desktop\repository2\blog>git commit -m "update file1"
[master 7596808] update file1
1 file changed, 2 insertions(+), 1 deletion(-)
切换到development分支上,对file2进行编辑并提交
### 切换分支
C:\Users\Administrator\Desktop\repository2\blog>git checkout development
Switched to branch 'development'
### 添加到暂存区
C:\Users\Administrator\Desktop\repository2\blog>git add .
### 添加到分支
C:\Users\Administrator\Desktop\repository2\blog>git commit -m "update file2"
[development c4dc950] update file2
1 file changed, 1 insertion(+)
此时变成了这样
当我们想将development分支合并到master分支上,如下操作
C:\Users\Administrator\Desktop\repository2\blog>git checkout master
Switched to branch 'master'
Your branch is ahead of 'origin/master' by 2 commits.
(use "git push" to publish your local commits)
C:\Users\Administrator\Desktop\repository2\blog>git merge development
Merge made by the 'recursive' strategy.
file2.txt | 1 +
1 file changed, 1 insertion(+)
此时是这样的
由两个分支共同的节点以及两个分支各自的新节点进行合并形成一个新的master分支提交点;
合并只是将development分支和并到master分支上,但是development分支本身没有变化
通过git log --oneline --graph
命令可以简单的描述合并的过程
C:\Users\Administrator\Desktop\repository2\blog>git log --oneline --graph
* 4645eca (HEAD -> master) Merge branch 'development'
|\
| * c4dc950 (development) update file2
* | 7596808 update file1
|/
* f51eed6 insert file3
* d202a0a (origin/master, origin/HEAD) second edit
* d3b6f0d a new file
分支合并的冲突问题
当master修改的是file1文件,而development也修改的是file1文件,这事将两个分支合并会导致合并冲突问题
C:\Users\Administrator\Desktop\repository2\blog>git branch
development
* master
C:\Users\Administrator\Desktop\repository2\blog>git add .
C:\Users\Administrator\Desktop\repository2\blog>git commit -m "modify file1"
[master 35b05e8] modify file1
1 file changed, 1 insertion(+), 2 deletions(-)
C:\Users\Administrator\Desktop\repository2\blog>git checkout development
Switched to branch 'development'
C:\Users\Administrator\Desktop\repository2\blog>git add .
C:\Users\Administrator\Desktop\repository2\blog>git commit -m "modify file1 column"
[development 4f518a1] modify file1 column
1 file changed, 1 insertion(+), 1 deletion(-)
将development分支合并到master分支
C:\Users\Administrator\Desktop\repository2\blog>git checkout master
Switched to branch 'master'
Your branch is ahead of 'origin/master' by 5 commits.
(use "git push" to publish your local commits)
C:\Users\Administrator\Desktop\repository2\blog>git merge development
Auto-merging file1.txt
CONFLICT (content): Merge conflict in file1.txt ###file1.txt放生了合并冲突问题
Automatic merge failed; fix conflicts and then commit the result. ### 自动合并失败
此时,打开文件,发现git将发生冲突的内容都显示出来
此时可以考虑留下哪一方的内容,然后再次进行提交
C:\Users\Administrator\Desktop\repository2\blog>git add .
C:\Users\Administrator\Desktop\repository2\blog>git commit -m "modify file1"
[master 77f91a8] modify file1