文章目录
- 一、git概述
- 二、Git 与 SVN 区别
- 三、Git下载安装
- 四、Git 工作流程
- 五、Git 工作区、暂存区和版本库
- 六、Git 创建仓库
- 配置
- 1、查看配置
- 2、编辑 git 配置文件
- 3、设置提交代码时的用户信息
- 七、Git 基本操作
- 1)不同区说明
- 2)一个简单的操作步骤
- 3)创建仓库命令
- 4)提交与修改操作
- 1、git add
- 2、git status
- 3、git diff
- 4、git commit
- 5、git reset
- 6、git rm
- 7、git mv
- 5)查看提交日志
- 6)远程操作
- 1、git remote
- 2、git push
- 1)生成Token
- 2)设置token
- 3)配置github的ssh密钥--Windows(推荐)
- 3、git pull
- 4、git pull和git fetch的区别
- 7)Git 分支管理
- 1、创建分支
- 2、创建并切换分支
- 3、合并分支
- 5、撤销修改
- 6、版本回退
- 1)回退到上个版本
- 2)回退到前n次版本
- 3)回滚指定commit id版本(常用/推荐)
- 7、版本冲突解决
- 八、打标签(tag)
- 1)创建标签
- 2)删除标签
- 3)查看此版本所修改的内容
- 4)推送标签到远程仓库
- 5)删除远程标签
- 九、搭建私有仓库(gitlab)
- 1)配置yum源
- 2)更新本地yum缓存
- 3)安装GitLab社区版
- 4)启动所有 gitlab 组件
- 5)gitlab修改默认端口
- 1、修改puma端口
- 2、修改nginx端口
- 3、修改giltab-shell配置
- 6)访问验证
- 7)Gitlab各组件启动停止命令
- 1、GitLab(所有服务)
- 2、Nginx
- 3、Puma
- 4、Sidekiq
- 5、PostgreSQL
- 6、Redis
- 8)简单使用
- 1、新建项目
- 2、生成并配置秘钥ssh密钥--Windows(推荐)
- 1)打开Git Bash查看电脑上是否已经存在SSH密钥
- 2) 创建新的ssh key
- 3)gitlab配置ssh key
- 3、git配置
一、git概述
Git 是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。
- Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。
- Git 与常用的版本控制工具 CVS, Subversion 等不同,它采用了分布式版本库的方式,不必服务器端软件支持。
二、Git 与 SVN 区别
Git | SVN | |
数据分布方式 | 分布式 | 集中式 |
存储方式 | 按元数据存,所有的资源控制系统都是把文件的元信息隐藏在一个类似 .svn、.cvs 等的文件夹里 | 按文件存储 |
版本号 | Git 没有一个全局的版本号 | SVN 有全局版本号:目前为止这是跟 SVN 相比 Git 缺少的最大的一个特征。 |
内容完整性 | Git 的内容完整性要优于 SVN,Git 的内容存储使用的是 SHA-1 哈希算法。 | ~ |
三、Git下载安装
在使用Git前我们需要先安装 Git。Git 目前支持
Linux/Unix
、Mac
和Windows
平台上运行。
Git 各平台安装包下载地址为:http://git-scm.com/downloads
接下来就是傻瓜式的一步步操作,很简单,就不在这里讲了。
四、Git 工作流程
一般工作流程如下:
- 克隆 Git 资源作为工作目录。
- 在克隆的资源上添加或修改文件。
- 如果其他人修改了,你可以更新资源。
- 在提交前查看修改。
- 提交修改。
- 在修改完成后,如果发现错误,可以撤回提交并再次修改并提交。
下图展示了 Git 的工作流程:
五、Git 工作区、暂存区和版本库
我们先来理解下 Git 工作区、暂存区和版本库概念:
- 工作区:就是你在电脑里能看到的目录。
- 暂存区:英文叫 stage 或 index。一般存放在 .git 目录下的 index 文件(.git/index)中,所以我们把暂存区有时也叫作索引(index)。
- 版本库:工作区有一个隐藏目录 .git,这个不算工作区,而是 Git 的版本库。
下面这个图展示了工作区、版本库中的暂存区和版本库之间的关系:
六、Git 创建仓库
Git 使用
git init
命令来初始化一个 Git 仓库, git init 是使用 Git 的第一个命令。在执行完成 git init 命令后,Git 仓库会生成一个.git
目录,该目录包含了资源的所有元数据,其他的项目目录保持不变。
# 该命令执行完后会在当前目录生成一个 .git 目录。
$ git init
# 使用我们指定目录作为Git仓库。
$ git init test2022
配置
1、查看配置
# 查看配置
$ git config --list
2、编辑 git 配置文件
# .git目录下执行修改当前仓库
$ git config -e
# 针对系统上所有仓库
$ git config -e --global
3、设置提交代码时的用户信息
$ git config --global user.name "bigdata"
$ git config --global user.email test@bigdata.com
七、Git 基本操作
Git 常用的是以下 6 个命令:
git clone
、git push
、git add
、git commit
、git checkout
、git pull
,后面我们会详细介绍。
1)不同区说明
-
workspace
:工作区 -
staging area
:暂存区/缓存区 -
local repository
:版本库或本地仓库 -
remote repository
:远程仓库
2)一个简单的操作步骤
- git init - 初始化仓库。
- git add . - 添加文件到暂存区。
- git commit - 将暂存区内容添加到仓库中。
3)创建仓库命令
上面说过
git init
是初始化创建仓库,还有一个非常常用的,就是git clone
拷贝一份远程仓库,也就是下载一个项目。
4)提交与修改操作
命令 | 说明 |
git add | 添加文件到暂存区 |
git status | 查看仓库当前的状态,显示有变更的文件。 |
git diff | 比较文件的不同,即暂存区和工作区的差异。 |
git commit | 提交暂存区到本地仓库。 |
git reset | 回退版本。 |
git rm | 删除工作区文件。 |
git mv | 移动或重命名工作区文件。 |
1、git add
#添加当前目录下的所有文件到暂存区:
$ touch HEAD
$ vi HEAD
hello world!!!
$ git status
$ git add .
$ touch hello.java
$ git status -s
$ git add hello.java
2、git status
查看仓库当前的状态,显示有变更的文件。
git status -s
或git status --short
命令以精简的方式显示文件状态。
- 新添加的未跟踪文件前面有
??
标记, - 新添加到暂存区中的文件前面有
A
标记, - 修改过的文件前面有
M
标记。 - M 有两个可以出现的位置,出现在右边的
M
表示该文件被修改了但是还没放入暂存区,出现在靠左边的 M 表示该文件被修改了并放入了暂存区。
A: 你本地新增的文件(服务器上没有).
其它不常用的文件状态
C
: 文件的一个新拷贝.D
: 你本地删除的文件(服务器上还在).R
: 文件名被修改了。T
: 文件的类型被修改了。U
: 文件没有被合并(你需要完成合并才能进行提交)。X
: 未知状态(很可能是遇到git的bug了,你可以向git提交bug report)?
:未被git进行管理,可以使用git add file1把file1添加进git能被git所进行管理
3、git diff
workspace
:工作区staging area
:暂存区/缓存区local repository
:版本库或本地仓库remote repository
:远程仓库
git diff 有两个主要的应用场景:
- 【场景一】
git diff
命令比较文件的不同,即比较文件在暂存区和工作区的差异。 - 【场景二】
git diff
命令显示已写入暂存区和已经被修改但尚未写入暂存区文件的区别。
尚未缓存的改动:
git diff
查看已缓存的改动:git diff --cached
查看已缓存的与未缓存的所有改动:git diff HEAD
显示摘要而非整个 diff:git diff --stat
workspace
:工作区文件 与staging area
:暂存区/缓存区文件 对比
$ git status -s
# 所以文件
$ git diff
# 指定文件对比
$ git diff hello.java
git diff --cached
staging area
:暂存区/缓存区文件 与local repository
:版本库或本地仓库文件对比
$ git add HEAD
$ git diff --cached
4、git commit
git commit
命令将暂存区内容添加到本地仓库中。
# 所有文件
$ git commit -m "message"
# 指定文件
$ git commit hello.java HEAD -m "message"
# -a 参数设置修改文件后不需要执行 git add 命令,直接来提交
$ echo "test001" > test001
$ echo "test002" > test002
$ git commit -am "messages"
5、git reset
--mixed
为默认,可以不用带该参数,用于重置暂存区的文件与上一次的提交(commit)保持一致,工作区文件内容保持不变。
$ git reset HEAD^ # 回退所有内容到上一个版本
$ git reset HEAD^ hello.php # 回退 hello.php 文件的版本到上一个版本
$ git log --oneline # 查看提交的版本
$ git reset 49c5826 # 回退到指定版本
$ git status # 查看文件状态
6、git rm
将文件从暂存区和工作区中删除:git rm <file>
$ git rm hello.java
# 强行从暂存区和工作区中删除
$ git rm -f hello.java
# 例从暂存区中删除文件
$ git rm --cached hello.java
# 可以递归强制删除
$ git rm -rf --cached dir
7、git mv
git mv 命令用于移动或重命名一个文件、目录或软连接。
git mv [file] [newfile]
如果新文件名已经存在,但还是要重命名它,可以使用 -f
参数:git mv -f [file] [newfile]
$ touch t2022
$ git add t2022
$ git mv t2022 t2023
# 如果t2023存在,-f
$ git mv -f t2022 t2023
$ git status
5)查看提交日志
$ git log
# 一行显示
$ git log --oneline
# 带参数--author
$ git log --oneline --author="liugp"
# 带事件,包含--until,不包含--since,如果两个时间一样就包含
$ git log --since="2022.03.05" --until="2022.03.06"
6)远程操作
1、git remote
$ git remote -v
$ git clone git://github.com/flutter/flutter.git
$ cd flutter
$ git remote -v
显示某个远程仓库的信息:
# 下载
$ git clone git@gitee.com:apache/flink.git
# 进入到项目
$ cd flink
# 只显示名称
$ git remote show
# 显示具体信息
$ git remote -v
添加新的远程仓库
- 新建仓库(GitHub)
$ git remote add GithubTest2022 https://github.com/liugp1116/Test2022.git
$ git remote -v
2、git push
添加远程仓库的意义就是将文件推送到远程仓库保存管理【本地仓库(local repository)-》远程仓库(remote repository)】
# origin远程仓库别名,master当前仓库分支名,会出现需要输入账号密码
$ git push GithubTest2022 master
输入自己GitHub的账号(当然也可以是gitee、gitlab或者其它,下面也会讲)
输入GitHub的密码
账号密码的这种方式在GitHub上在2021年已经被废除了,必须使用`个人访问令牌(personal access token) 的方式进行访问,配置方式如下:
1)生成Token
- 在个人设置页面,找到
Setting
- 选择开发者设置
Developer setting
- 选择个人访问令牌
Personal access tokens
,然后选中生成令牌Generate new token
- 设置token的有效期,访问权限等
- 生成令牌
Generate token
【温馨提示】记得把你的token保存下来,因为你再次刷新网页的时候,你已经没有办法看到它了。
2)设置token
// <your_token>:包括<>在内的全部字符替换成你的token
// <USERNAME>:包括<>在内的全部字符替换成你的username
// <REPO>:包括<>在内的全部字符替换成你要访问的仓库名称
git remote set-url origin https://<your_token>@github.com/<USERNAME>/<REPO>.git
git push GithubTest2022 master
3)配置github的ssh密钥–Windows(推荐)
- 打开Git Bash查看电脑上是否已经存在SSH密钥
$ cd ~/.ssh/
- 创建新的ssh key
$ ssh-keygen -t rsa -C "your_email@youremail.com"
因为之前就创建过,所以我这边是覆盖
3. 复制ssh key到github
$ cat id_rsa.pub
4. 测试 ssh 链接 github
$ ssh -T git@github.com
5. 设置自己的git信息
#(此处name可修改也不是用于登录github的登录名)
$ git config --global user.name "Firstname Lastname"
$ git config --global user.email "your_email@youremail.com"
6. 测试验证
$ git remote add ssh_test2022 git@github.com:liugp1116/Test2022.git
$ git remote -v
# 如果远程仓库没有这个分支,会自动创建master分支,跟本地分支名称一致
$ git push ssh_test2022 master
### git push <远程主机名> <本地分支名>:<远程分支名>
$ git push ssh_test2022 master:dev
查看所有分支,红色代表远程分支,绿色代表本地分支
7. -u参数
# 加了参数-u后,以后即可直接用git push 代替git push origin master
$ git push -u ssh_test2022 master
# 就此关联起来了,不用再输入那么长的命令了
$ git push
8. 强制推送(–force)
$ git push --force origin master
- 删除远程分支
### 删除主机的分支可以使用 --delete 参数,以下命令表示删除 origin 主机的 master 分支:
$ git push origin --delete master
3、git pull
### git pull <远程主机名> <本地分支名>:<远程分支名>
$ git pull ssh_test2022 master:dev
# 下面三个等价
$ git pull ssh_test2022 master:master
$ git pull ssh_test2022 master
$ git pull
4、git pull和git fetch的区别
-
git fetch
是将远程主机的最新内容拉到本地,用户在检查了以后决定是否合并到工作本机分支中。 - 而
git pull
则是将远程主机的最新内容拉下来后直接合并,即:git pull = git fetch + git merge
,这样可能会产生冲突,需要手动解决。
$ git fetch ssh_test2022 master
取回更新后,会返回一个FETCH_HEAD
,指的是某个branch在服务器上的最新状态,我们可以在本地通过它查看刚取回的更新信息:
$ git log -p FETCH_HEAD
合并分支
$ git merge FETCH_HEAD
7)Git 分支管理
几乎每一种版本控制系统都以某种形式支持分支。使用分支意味着你可以从开发主线上分离开来,然后在不影响主线的同时继续工作。
1、创建分支
$ git branch dev
# 查看本地分支
$ git branch
# 查看远程分支
$ git branch -r
# 查看所有分支
$ git branch -a
2、创建并切换分支
$ git checkout -b test
### 等价于下面两句
$ git branch test
$ git checkout test
3、合并分支
一旦某分支有了独立内容,你终究会希望将它合并回到你的主分支。 你可以使用以下命令将任何分支合并到当前分支中去:
$ git checkout master
# 将dev合并到当前分支(master)
$ git merge dev
5、撤销修改
- 本地修改没add添加到暂存区
# 撤销指定文件
$ git checkout t1
# 撤销多文件,以空格分开
$ git checkout 123.txt t1
# 撤销所有,很少用,不推荐
$ git checkout .
【温馨提示】
checkout
不仅有撤销修改,还能切换分支,上面有讲过。
- 本地修改已经add添加到暂存区,但是没commit提交到本地仓库
用git status查看一下,修改只是添加到了暂存区,还没有提交,这时用命令git reset HEAD 可以把暂存区的修改撤销掉(unstage),重新放回工作区,然后再用git checkout – file 丢弃工作区的修改:
# 把修改add添加到暂存区
$ git add 123.txt
# 暂存区与本地仓库比较
$ git diff --cached
$ git status
# 指定文件
$ git reset HEAD -- 123.txt
# 指定多个文件
$ git reset HEAD -- 123.txt test.txt
# 所有文件
$ git reset HEAD -- .
6、版本回退
在实际工作中,我们会不断对文件进行修改,然后不断提交修改到版本库里,一旦你把文件改乱了,或者误删了文件,还可以从最近的一个commit恢复,然后继续工作,而不是把几个月的工作成果全部丢失。
在Git中,我们用git log命令查看修改记录:
查看版本号ID(历史提交记录)
$ git log
# 一行显示
$ git log --oneline
$ git log --pretty=oneline
我们还可以用 --graph
选项,查看历史中什么时候出现了分支、合并。以下为相同的命令,开启了拓扑图选项:
$ git log --graph
1)回退到上个版本
$ git reset --hard HEAD^
2)回退到前n次版本
$ git reset --hard HEAD~3
3)回滚指定commit id版本(常用/推荐)
# 先查找commit id
$ git log
# 一行显示
$ git log --oneline
$ git log --pretty=oneline
# 回滚,用完整ID也可以用短ID,ID只要唯一就行,可以任意
$ git reset --hard 1c544f1
7、版本冲突解决
在公司里远程仓库都是大家公用的,如果没有更新最新的版本,各自又修改同一个文件提交到远程仓库就会产生冲突。
【解决】
# 先拉取最新的代码
$ git pull
看上图提示发现合并的时候产生冲突,打开文件发现冲突的文件有两段最新代码,一段是自己本地提交的,一段是从远程拉取下来的。
修改解决冲突,修改完如下内容:
再add-》commit-》push到远程仓库,解决冲突
$ git add 123.txt
$ git commit -m "解决冲突"
$ git push
$ git status
八、打标签(tag)
1)创建标签
发布一个版本时,我们通常先在版本库中打一个标签(tag),这样就唯一确定了打标签时刻的版本。将来无论什么时候,取某个标签的版本,就是把那个打标签的时刻的历史版本取出来。
$ git tag
$ git tag v0312
$ git tag
2)删除标签
$ git tag -d v0312
3)查看此版本所修改的内容
# 查看此版本所修改的内容
$ git show v0312
4)推送标签到远程仓库
# 推送一个本地标签到远程仓库
$ git push ssh_test2022 v0312
# 推送全部未推送过的本地标签
$ git push ssh_test2022 --tags
5)删除远程标签
# 删除一个远程标签
$ git push ssh_test2022 :refs/tags/v0312
九、搭建私有仓库(gitlab)
出于安全和稳定而言,搭建私有本地仓库是在企业里最常见的,企业里基本上不可能用外网的仓库作为公司的代码仓库。Gitlab官方文档
图源:https://docs.gitlab.com/ee/development/architecture.html
- Nginx:静态web服务器。
- gitlab-shell:用于处理Git命令和修改authorized keys列表。
- gitlab-workhorse: 轻量级的反向代理服务器。
- logrotate:日志文件管理工具。
- postgresql:数据库。
- redis:缓存数据库。
- sidekiq:用于在后台执行队列任务(异步执行)。
- Puma:Puma是一个Ruby应用服务器,用于运行核心Rails应用程序,该应用程序在GitLab中提供面向用户的功能。这通常以捆绑或配置的形式显示在进程输出中。ru取决于GitLab版本。
1)配置yum源
https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/
$ cat << EOF > /etc/yum.repos.d/gitlab-ce.repo
[gitlab-ce]
name=Gitlab CE Repository
baseurl=https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el8$releasever/
gpgcheck=0
enabled=1
EOF
2)更新本地yum缓存
$ yum clean all && yum makecache
【Centos8的问题】
Error: Failed to download metadata for repo 'appstream': Cannot prepare internal mirrorlist: No URLs in mirrorlist
【解决】
cd /etc/yum.repos.d/
sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-*
sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-*
yum update -y
3)安装GitLab社区版
$ yum install gitlab-ce -y
4)启动所有 gitlab 组件
# 启动所有服务,使配置文件生效,但是会初始化除了gitlab.rb之外的所有文件
# 配置文件/etc/gitlab/gitlab.rb
$ gitlab-ctl reconfigure
$ gitlab-ctl status
# 检查gitlab
$ gitlab-rake gitlab:check SANITIZE=true --trace
其它常用命令
# 停止所有 gitlab 组件;
$ gitlab-ctl stop
# 重启所有 gitlab 组件;
$ gitlab-ctl restart
#查看日志的命令(Gitlab 默认的日志文件存放在/var/log/gitlab 目录下)
$ gitlab-ctl tail # 查看日志;
WEB UI
账号:root
密码在这个文件中:/etc/gitlab/initial_root_password
web ui默认端口:http://192.168.0.113:80
5)gitlab修改默认端口
最有可能被其它进程占用的端口就是
8080和80
端口了
1、修改puma端口
配置文件:/etc/gitlab/gitlab.rb
,修改puma['port']
8080-》8082
puma['port'] = 8083
修改域名
# external_url 'http://gitlab.bigdata.com'
$ sed -i 's/gitlab.example.com/gitlab.bigdata.com/' /etc/gitlab/gitlab.rb
#这个记得配置hosts域名映射C:\Windows\System32\drivers\etc\hosts
192.168.0.113 gitlab.bigdata.com
重启服务
$ gitlab-ctl reconfigure
2、修改nginx端口
配置文件:/var/opt/gitlab/nginx/conf/gitlab-http.conf
,修改listen
修改*80
-》*8088
重新加载配置
$ netstat -tnlp|grep :80
$ netstat -tnlp|grep :8088
# 重启服务,不能使用gitlab-ctl reconfigure,要不然会重置配置回80
$ gitlab-ctl restart
$ netstat -tnlp|grep :8088
web访问:http://192.168.0.113:8088/
3、修改giltab-shell配置
上面nginx端口改了,giltab-shell配置也必须跟着改,要不然提交会报错,配置文件:
/var/opt/gitlab/gitlab-shell/config.yml
,修改如下:
gitlab_url: "http://127.0.0.1:8088"
重启服务
$ gitlab-ctl restart
6)访问验证
7)Gitlab各组件启动停止命令
其实上面的restart都是重启所有服务,很麻烦,一般在公司都是重启指定服务。
1、GitLab(所有服务)
$ gitlab-ctl start
$ gitlab-ctl stop
$ gitlab-ctl restart
$ gitlab-ctl status
$ gitlab-ctl reconfigure
2、Nginx
$ gitlab-ctl start nginx
$ gitlab-ctl stop nginx
$ gitlab-ctl restart nginx
$ gitlab-ctl status nginx
3、Puma
$ gitlab-ctl start puma
$ gitlab-ctl stop puma
$ gitlab-ctl restart puma
$ gitlab-ctl status puma
4、Sidekiq
$ gitlab-ctl start sidekiq
$ gitlab-ctl stop sidekiq
$ gitlab-ctl restart sidekiq
$ gitlab-ctl status sidekiq
5、PostgreSQL
$ gitlab-ctl start postgresql
$ gitlab-ctl stop postgresql
$ gitlab-ctl restart postgresql
$ gitlab-ctl status postgresql
6、Redis
$ gitlab-ctl start redis
$ gitlab-ctl stop redis
$ gitlab-ctl restart redis
$ gitlab-ctl status redis
8)简单使用
1、新建项目
2、生成并配置秘钥ssh密钥–Windows(推荐)
1)打开Git Bash查看电脑上是否已经存在SSH密钥
$ cd ~/.ssh/
2) 创建新的ssh key
$ ssh-keygen -t rsa -C "your_email@youremail.com"
3)gitlab配置ssh key
先复制~/.ssh/id_rsa.pub内容
在再gitlab上添加
3、git配置
$ git remote add gitlab_test2022 git@gitlab.bigdata.com:root/test2022.git
$ git remote -v
# 将本地仓库的文件push到gitlab
$ git push gitlab_test2022 master
【温馨提示】gitlab的安装和简单操作使用就先到这了,基本上公司不会让自己亲自去搭建这玩意,所以只要会使用git基本操作就行了,不用去纠结其中的原理。