Git常用操作(Gitlab)

目录

一、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/UnixMacWindows 平台上运行。

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 clonegit pushgit addgit commitgit checkoutgit 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 -sgit 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

添加新的远程仓库


$ 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
  1. 在个人设置页面,找到Setting

  2. 选择开发者设置Developer setting

  3. 选择个人访问令牌Personal access tokens,然后选中生成令牌Generate new token

  4. 设置token的有效期,访问权限等

  5. 生成令牌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(推荐)
  1. 打开Git Bash查看电脑上是否已经存在SSH密钥
$ cd ~/.ssh/
  1. 创建新的ssh key
$ ssh-keygen -t rsa -C "your_email@youremail.com" 

因为之前就创建过,所以我这边是覆盖

  1. 复制ssh key到github
$ cat id_rsa.pub


  1. 测试 ssh 链接 github
$ ssh -T git@github.com

  1. 设置自己的git信息
#(此处name可修改也不是用于登录github的登录名)
$ git config --global user.name "Firstname Lastname"
$ git config --global user.email "your_email@youremail.com"

  1. 测试验证
$ 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

查看所有分支,红色代表远程分支,绿色代表本地分支

  1. -u参数
# 加了参数-u后,以后即可直接用git push 代替git push origin master
$ git push -u ssh_test2022 master
# 就此关联起来了,不用再输入那么长的命令了
$ git push

  1. 强制推送(--force)
$ git push --force origin master
  1. 删除远程分支
### 删除主机的分支可以使用 --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)访问验证

http://192.168.0.113:8088

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基本操作就行了,不用去纠结其中的原理。如果想了解更多,请参考Gitlab官方文档

希望这篇文章对小伙伴有所帮助~

posted @ 2022-05-14 01:11  大数据老司机  阅读(889)  评论(0编辑  收藏  举报