Gitlab
1. Git简介
什么是git?
git是开源的分布式版本控制系统,可以对开发的版本进行管理。
相比较与其他版本控制器为什么选择git?
这里与SVN、CVS等版本控制器进行比较。
- SVN是集中式,即有一个中央服务器,每一次都需要先在中央服务器中进行下载,在中央(这一台电脑)进行版本的控制。
- git 是分布式,没有中央服务器,每一个电脑都有一个完整的版本库,如果A和B都同时改了,可以进行相互的推送,就可以看见互相的修改。
由此可以看出当采用SVN,主服务器发生问题,所有的电脑都将瘫痪无法工作,而采用git则可以很好的解决这个问题。
1.1 Git中一些基础概念
Git的分层
git的工作总共分四层,其中三层是在自己本地也就是说git仓库,包括了工作目录、暂存区和本地仓库。
-
工作目录(workspace)是我们执行一切文件操作的地方,也就是我们执行命令git init时所在的地方。
-
暂存区(index)在.git目录下,用于临时存放改动,事实上它只是一个文件,保存即将提交到文件列表信息,类似与word中的临时保存文件。
-
本地仓库(repository)也是在.git目录下,用来存数据的。这里面有本地所提交到所有版本的数据。其中HEAD指向最新放入仓库的版本。
-
远程仓库(remote)在中心服务器,也就是我们做好工作之后推送到远程仓库,或者从远程仓库更新下来最新代码到本地。
Git的文件状态
•未追踪(Untracked): 未跟踪, 此文件在文件夹中, 但并没有加入到git库, 不参与版本控制. 通过git add 状态变为Staged
•已暂存(Staged):暂存状态. 执行git commit则将修改同步到库中, 这时库中的文件和本地文件又变为一致, 文件为Unmodify状态. 执行git reset HEAD filename取消暂存, 文件状态为Modified
•已提交(Committed):文件已经提交
•已修改 (Modified): 文件已修改, 仅仅是修改, 并没有进行其他的操作. 这个文件也有两个去处, 通过git add可进入暂存staged状态, 使用git checkout 则丢弃修改过, 返回到unmodify状态, 这个git checkout即从库中取出文件, 覆盖当前修改
•文件已入库未修改(Unmodify):文件已经入库, 未修改, 即版本库中的文件快照内容与文件夹中完全一致. 这种类型的文件有两种去处, 如果它被修改, 而变为Modified. 如果使用git rm移出版本库, 则成为Untracked文件
1.2 Git的基本操作
Git初始化
Git - 初次运行 Git 前的配置 (git-scm.com)
初始化本地的发送姓名及邮箱
git config --global user.name "luhui"
git config --global user.email "luhui***@aaa.com"
创建命令
创建代码库
git init
运行结果如下:
可以看到文件中多了.git 文件用来存放版本库。
可以看一下.git中有什么文件
文件中状态切换
基本状态切换如下图所示:
- 当文件中新建一个test文本,内容是“我刚创建”,通过如下命令查看状态
git status
可以看到结果,文件test 是未被追踪的
$ git status
On branch master
No commits yet
Untracked files:
(use "git add <file>..." to include in what will be committed)
test.txt
nothing added to commit but untracked files present (use "git add" to track)
目录结构如下:
- 然后执行添加进暂存区的命令
git add test.txt
这个时候就会将文件上传至stage区,文件状态显示已提交,结果如下
$ git status
On branch master
No commits yet
Changes to be committed:
(use "git rm --cached <file>..." to unstage)
new file: test.txt
目录结构如下:
-
修改工作区中的内容“我被修改了”
此时的文件结构如下图
查看文件状态
$ git status
On branch master
No commits yet
Changes to be committed: ##这里是暂存区中的文件
(use "git rm --cached <file>..." to unstage)
new file: test.txt
Changes not staged for commit: ##这里是工作区中的文件
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: test.txt
也就是一个文件处于committed 状态(第一次提交的“我刚创建”,即暂存区中文件),一个处于modified状态(第二次修改的“我被修改了”,即工作区中文件)。
- 将缓存区文件上传至本地仓库
git commit -m "第一次上传本地仓库"
-
-
-m后面写的是这次提交的信息,帮助想起这次提交的内容
这时文件结构如下:
-
1.3 Git 的分支
1.3.1分支管理
使用git branch
查看当前分支
git branch
* master
*
表示当前分支。
修改下test.text文件内容为“我在master分支”。
通过如下命令直接将工作区文件上传至本地仓库。
git commit -am"修改分支内容"
master分支是开发主线,这时有个功能需要在不影响主线的情况下开发,就需要新建一个分支。比如我们要开发v1版本,就可以使用git branch beta_v1
新建一个分支,现在查看下分支情况:
$ git branch
beta_v1
* master
虽然新建了一个分支,但是现在还是处于master分支下,我们先使用git checkout beta_v1
切换到beta_v1分支。
$ git branch
* beta_v1
master
1.3.2分支合并
分支fastforward 合并方式
编辑test.txt
文件,修改内容为我在beta_v1分支被修改了
,git commit -am "修改beta_v1分支文件内容"
提交,然后再使用git checkout master
切换回master
分支。
使用git merge beta_v1
把分支beta_v1
的内容合并过来,这时文件被自动合并了,此时的文件内容是:
$ cat test.text
我在beta_v1分支被修改了
这个时候master分支和beta_v1分支指向的是同一个对象,所以就可以将beta_v1分支进行删除。
1.3.3 合并冲突
-
如果你在两个不同的分支中,对同一个文件的同一个部分进行了不同的修改,Git 就没法干净的合并它们。
-
示例:
-
当在主分支中对文件进行修改并提交,然后再另一个分支对同样的文件进行修改并提交,再请求merge的时候就会发生冲突。
-
- 发生冲突之后,冲突的两个文件会同时显示,选择要留下的文件,并重新提交就可以解决冲突。
-
1.3.4 git stash
1.4 Tortoise工具的使用/Sourcetree
Tortoise工具的使用
-
git的可视化工具。可以将上述操作变成图形界面的,方便管理代码。
-
TortoiseGit图形化工具操作详解_每天进步一点点-CSDN博客_git图形化工具解决Please make sure you have the correct access rights and the repository exists 问题._每天进步一点点-CSDN博客
Sourcetree工具的使用
-
【最全面】SourceTree使用教程详解(连接远程仓库,克隆,拉取,提交,推送,新建/切换/合并分支,冲突解决,提交PR) - 追逐时光者 - 博客园 (cnblogs.com)
-
克隆深度是指可以克隆最近几次提交的代码
- 用 git clone --depth=1 的好处是限制 clone 的深度,不会下载 Git 协作的历史记录,这样可以大大加快克隆的速度
- depth用于指定克隆深度,为1即表示只克隆最近一次commit
- 适合用 git clone --depth=1 的场景:你只是想clone最新版本来使用或学习,而不是参与整个项目的开发工作
2.Gitlab与git之间的关系
gitlab就是git的远程仓库,远程仓库可以是Gitlab也可以是github等等。
- 首先将远程仓库克隆下来。
1. 远程账号与本地帐号之间的关联
- http
- SSH
2. 变基
3. gitlab中常见的工作流程
1. 分布式工作流程
- 当A和B同时将代码拉下来并进行修改,B首先提交了修改代码,如果A仍然想提交会提示错误,必须要将B的代码下载下来并在B的代码基础上进行提交才能通过。
-
- 项目维护者推送到主仓库。
- 贡献者克隆此仓库,做出修改。
- 贡献者将数据推送到自己的公开仓库。
- 贡献者给维护者发送邮件,请求拉取自己的更新。
- 维护者在自己本地的仓库中,将贡献者的仓库加为远程仓库并合并修改。
- 维护者将合并后的修改推送到主仓库。
-
2.git
- 局域网:Gitlab
- 互联网:Github、Gitee
4. 历史版本
-
查看版本历史
- git reflog 查看提交记录(简易版)
- git log 查看提交记录(简易版)
- git reset --hard 版本号
-
分支的操作
- git branch -v 查看当前分支
- git branch 分支名 创建分支
- git checkout 切换分支
- git merg 分支名(A) 在当前分支上将A合并过来
-
fork 将别人的仓库复制一份到自己的仓库。
-
git fetch 相当于是从远程获取最新版本到本地,不会自动merge
-
本地生成SSHkey
5. git log
- 一定要记得cd 到那个文件夹才能用git log
6. unpack failed: index-pack abnormal exit
gitlab限制上传问题
Git push error: unpack failed: index-pack abnormal exit - Stack Overflow
7 .rebase /cherry -pick
关于Git的rebase操作与cherry-pick操作的建议_林中路-CSDN博客
-
author :创建这次修改的人
-
committer:真正提交的人
-
cherry-pick:重新生成新的提交
-
rebase:
-
IDEA Git操作(三)使用 cherry-pick、交互式 rebase 自由修改提交树_wanght笔记-CSDN博客
-
Git知识总览(五) Git中的merge、rebase、cherry-pick以及交互式rebase - 青玉伏案 - 博客园 (cnblogs.com)
-
rebase 会让head和当前的分支分开?
8. md5值
9.根据版本回退
https://segmentfault.com/a/1190000020863861
https://blog.csdn.net/FrontierSetter/article/details/83413889
git reset --hard head^ # 撤回当次提交
10.gitlab merge request模板
https://blog.csdn.net/ouyang_peng/article/details/105848365/
11.Git 多仓库管理
Google Git-Repo 多仓库项目管理 - 知乎 (zhihu.com)
12.gitlab 邮件配置
-
gitlab 官方文档https://docs.gitlab.com/omnibus/settings/nginx.html
-
gitlab.rb 配置文件的含义https://liushiya.blog.csdn.net/article/details/119788015
-
gitlab-ctl reconfigure不敢乱用https://blog.csdn.net/vbaspdelphi/article/details/54376421
https://www.firegod.cn/tools/jenkins/jenkins-从-git仓库拉取代码超时解决办法/)
13 分支的分类
- active branch 活跃的分支
- stale branch 过时的分支
- 但是不知道test 下面的是啥