Appearance
Git常用操作之GitLab
1、GitLab安装
1、Docker安装GitLab
https://docs.gitlab.cn/jh/install/docker.html
1、设置卷位置
在设置其他所有内容之前,请配置一个新的环境变量 $GITLAB_HOME
,指向配置、日志和数据文件所在的目录。 确保该目录存在并且已授予适当的权限。
对于 Linux 用户,将路径设置为 /usr/local/gitlab
:
sh
export GITLAB_HOME=/srv/gitlab
对于 macOS 用户,使用用户的 $HOME/gitlab
目录:
sh
export GITLAB_HOME=$HOME/gitlab
极狐GitLab 容器使用主机装载的卷来存储持久数据:
本地位置 | 容器位置 | 使用 |
---|---|---|
$GITLAB_HOME/data | /var/opt/gitlab | 用于存储应用程序数据。 |
$GITLAB_HOME/logs | /var/log/gitlab | 用于存储日志。 |
$GITLAB_HOME/config | /etc/gitlab | 用于存储极狐GitLab 配置文件。 |
2、使用 Docker Engine 安装极狐GitLab
您可以微调这些目录以满足您的要求。 一旦设置了 GITLAB_HOME
变量,您就可以运行镜像:
sh
sudo docker run --detach \
--hostname gitlab.example.com \
--publish 443:443 --publish 80:80 --publish 23:22 \
--name gitlab \
--restart always \
--volume $GITLAB_HOME/config:/etc/gitlab \
--volume $GITLAB_HOME/logs:/var/log/gitlab \
--volume $GITLAB_HOME/data:/var/opt/gitlab \
--shm-size 256m \
registry.gitlab.cn/omnibus/gitlab-jh:latest
这将下载并启动极狐GitLab 容器,并发布访问 SSH、HTTP 和 HTTPS 所需的端口。所有极狐GitLab 数据将存储在 $GITLAB_HOME
的子目录中。系统重启后,容器将自动 restart
。
如果您使用的是 SELinux,请改为运行以下命令:
sh
sudo docker run --detach \
--hostname gitlab.example.com \
--publish 443:443 --publish 80:80 --publish 22:22 \
--name gitlab \
--restart always \
--volume $GITLAB_HOME/config:/etc/gitlab:Z \
--volume $GITLAB_HOME/logs:/var/log/gitlab:Z \
--volume $GITLAB_HOME/data:/var/opt/gitlab:Z \
--shm-size 256m \
registry.gitlab.cn/omnibus/gitlab-jh:latest
这将确保 Docker 进程有足够的权限在挂载的卷中创建配置文件。
如果您使用 Kerberos 集成 ,您还必须发布您的 Kerberos 端口(例如,--publish 8443:8443
)。否则会阻止使用 Kerberos 进行 Git 操作。
初始化过程可能需要很长时间。 您可以通过以下方式跟踪此过程:
sh
sudo docker logs -f gitlab
启动容器后,您可以访问 域名
(如果您在 macOS 上使用 boot2docker,则可以访问 http://ip:端口
)。Docker 容器开始响应查询可能需要一段时间。
访问极狐GitLab URL,并使用用户名 root 和来自以下命令的密码登录:
sh
sudo docker exec -it gitlab grep 'Password:' /etc/gitlab/initial_root_password
密码文件将在 24小时
后的第一次重新配置运行中自动删除。
3、使用 Docker Compose 安装极狐GitLab
yaml
version: '3.6'
services:
web:
image: 'registry.gitlab.cn/omnibus/gitlab-jh:latest'
restart: always
hostname: 'gitlab.example.com'
environment:
GITLAB_OMNIBUS_CONFIG: |
external_url 'https://gitlab.example.com'
# Add any other gitlab.rb configuration here, each on its own line
ports:
- '80:80'
- '443:443'
- '22:22'
volumes:
- '$GITLAB_HOME/config:/etc/gitlab'
- '$GITLAB_HOME/logs:/var/log/gitlab'
- '$GITLAB_HOME/data:/var/opt/gitlab'
shm_size: '256m'
确保您在与 docker-compose.yml
相同的目录下并启动极狐GitLab:
sh
docker compose up -d
下面是另一个 docker-compose.yml
示例,其中极狐GitLab 在自定义 HTTP 和 SSH 端口上运行。注意 GITLAB_OMNIBUS_CONFIG
变量如何匹配 ports
部分:
yaml
version: '3.6'
services:
web:
image: 'registry.gitlab.cn/omnibus/gitlab-jh:latest'
restart: always
hostname: 'gitlab.example.com'
environment:
GITLAB_OMNIBUS_CONFIG: |
external_url 'http://gitlab.example.com:8929'
gitlab_rails['gitlab_shell_ssh_port'] = 2224
ports:
- '8929:8929'
- '2224:22'
volumes:
- '$GITLAB_HOME/config:/etc/gitlab'
- '$GITLAB_HOME/logs:/var/log/gitlab'
- '$GITLAB_HOME/data:/var/opt/gitlab'
shm_size: '256m'
这与使用 --publish 8929:8929 --publish 2224:22
相同。
2、Linux Centos安装GitLab
https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/
安装依赖项
sh
yum install policycoreutils-python
安装GitLab
sh
rpm -i gitlab-ce-16.7.0-ce.0.el7.x86_64.rpm
sh
# 修改配置
vim /etc/gitlab/gitlab.rb
# 修改为ip或者域名
external_url 'http://43.139.157.112:6688'
# 重新加载配置文件
gitlab-ctl reconfigure
# 重启
gitlab-ctl restart
sh
# 查看默认密码
cat /etc/gitlab/initial_root_password
2、GitLab设置中文
3、GitLab新建用户
4、Git安装
1、windows安装
https://git-scm.com/download/win
下载下来后傻瓜式安装即可,一直下一步就好。
2、Mac安装
简易安装法 打开Mac输入终端 输入git
会弹出安装
3、Git修改用户名邮箱
sh
git config user.name "xueqimiao"
git config user.email "161616@qq.com"
git config user.name
git config user.email
5、新建仓库
6、拉取、提交、撤销与推送代码
1、拉取代码
可以看到有两种方式拉取代码,我们先用http的方式,后面再使用SSH方式
1、命令拉取
sh
# 拉取代码
git clone http://43.139.157.112:6688/root/xx-test.git
# 根据提示输入用户名和密码
2、IDEA拉取
2、提交代码
新建一个文件Test01
我们先不点击add
,可以看到文件颜色为红色
,说明文件还没有添加到版本控制中
1、命令提交
sh
# 添加到暂存区
git add Test01.java
# add之后文件颜色为绿色
可以看到文件变成了正常颜色
sh
# 添加指定文件到暂存区
git add [file1] [file2] ...
# 添加指定目录到暂存区,包括子目录
git add [dir]
# 添加当前目录的所有文件到暂存区
git add .
# 添加每个变化前,都会要求确认
# 对于同一个文件的多处变化,可以实现分次提交
git add -p
sh
# 提交
git commit -m '第一次提交'
注意: 此时远程仓库中还没有,因为我们还没有推送
sh
# 提交暂存区到仓库区
$ git commit -m [message]
# 提交暂存区的指定文件到仓库区
$ git commit [file1] [file2] ... -m [message]
# 提交工作区自上次commit之后的变化,直接到仓库区
$ git commit -a
# 提交时显示所有diff信息
$ git commit -v
# 使用一次新的commit,替代上一次提交
# 如果代码没有任何新变化,则用来改写上一次commit的提交信息
$ git commit --amend -m [message]
# 重做上一次commit,并包括指定文件的新变化
$ git commit --amend [file1] [file2] ...
红色
:表示文件还没有被 Git 跟踪,尚未添加到版本控制中
红色
:表示在合并过程中遇到冲突的文件
红色
:已删除的文件
绿色
:表示文件在上次提交后已被修改
绿色
:表示文件已被添加到暂存区,准备提交到版本库
绿色
:表示文件被重命名,并且这个重命名操作已被暂存
正常颜色
:表示文件没有变化
工作区(Working Directory):
- 工作区是你当前正在操作的目录,包含项目的实际文件。
暂存区(Staging Area / Index):
- 暂存区是一个中间区域,用于存储你已经做出的更改,但还没有提交到版本库。在工作区修改文件后,你可以将这些修改暂时存储在暂存区,然后一次性提交到版本库。
版本库(Repository):
- 版本库是一个包含项目历史记录的地方。它包括了所有提交的信息、文件的状态、以及指向每个提交的指针。版本库通常分为两部分:本地版本库(Local Repository)和远程版本库(Remote Repository)。
本地版本库(Local Repository):
- 本地版本库是你计算机上的一个存储库,包含完整的项目历史记录。你可以在本地进行提交、查看历史记录等操作。
远程版本库(Remote Repository):
- 远程版本库是位于网络上的一个共享版本库,通常托管在像 GitHub、GitLab 或 Bitbucket 等平台上。它允许多个开发者协作,通过推送(push)和拉取(pull)操作同步本地和远程版本库的变更。
2、IDEA提交
新建一个文件Test02
此时点击add
此时已经提交完成
3、撤销
1、撤销add
1、命令操作
新建一个文件Test03
sh
git reset Test03.java
2、IDEA操作
新建一个文件Test04
HEAD
是一个特殊的指针,它指向当前所在的本地分支的最新提交(最新的提交记录)。HEAD
可以理解为你当前工作目录所处的位置,即当前所在分支的最新提交。Reset Type三种常用的模式:
git reset
命令有三个常用的模式:--soft
、--mixed
(默认模式)和--hard
。这些模式控制了命令的行为,特别是在重置提交时涉及到的暂存区和工作区的处理。--soft:
--soft
模式表示“软重置”,它会将HEAD
移动到目标提交,但不会修改暂存区和工作区。所有更改都保留在暂存区,你可以使用git commit
来创建一个新的提交。shgit reset --soft HEAD^
--mixed(默认模式):
--mixed
模式是默认的重置模式,它会将HEAD
移动到目标提交,并且会重置暂存区,但不会修改工作区。这意味着你的更改会被保留在工作区,但不会被包含在新的提交中。shgit reset --mixed HEAD^
--hard:
--hard
模式是最彻底的重置,它会将HEAD
移动到目标提交,并且会重置暂存区和工作区,即丢弃所有未提交的更改。慎用这个选项,因为它会永久性地删除你在工作区中的所有更改。shgit reset --hard HEAD^
同样的idea也可以直接add
2、撤销提交
1、命令操作
撤销最后一次提交(commit),可以使用 git reset
或 git revert
,具体取决于你想要的效果以及是否已经将更改推送到远程仓库。
- 使用
git reset
撤销提交并保留更改:
git reset --soft HEAD^
这将把 HEAD
移动到前一个提交,保留工作区和暂存区的更改。你可以随后选择性地将需要的更改添加到暂存区,并提交。
- 使用
git reset
撤销提交并清除所有更改:
sh
git reset --hard HEAD^
这会将 HEAD
移动到前一个提交,并丢弃工作区和暂存区的所有更改。小心使用这个选项,因为它会永久删除未提交的更改。
2、IDEA操作
如果已经推送需要撤回
sh
# 查看提交记录
git log
git revert 记录hash值
your local changes would be overwritten by revert. hint: commit your changes or stash them to proceed. revert failed
这个错误提示表明在进行
git revert
操作时,存在未提交的本地更改,而git revert
操作要求工作目录是干净的,没有未提交的更改。解决这个问题的方法有两种:
1. 提交或存储本地更改:
提交更改:
如果你希望将这些未提交的更改包含在新的撤销提交中,可以先提交这些更改:
shgit add . git commit -m "Committing local changes before revert"
然后再执行
git revert
:shgit revert <commit-to-revert>
存储更改:
如果你不想将这些未提交的更改包含在新的撤销提交中,可以使用
git stash
将它们存储起来:shgit stash
然后再执行
git revert
:shgit revert <commit-to-revert>
最后,如果需要,可以使用
git stash pop
恢复之前存储的更改:shgit stash pop
强制
git revert
:如果你确定不需要保存本地更改,也可以使用
--no-commit
选项强制git revert
:shgit revert --no-commit <commit-to-revert>
这将允许你在撤销提交之前进行其他更改。完成所有需要的更改后,手动提交:
shgit commit -m "Revert commit <commit-to-revert>"
git stash
和git stash pop
是用于暂存和恢复未提交的工作目录和暂存区更改的命令。它们的作用如下:
git stash
:
git stash
用于将当前工作目录和暂存区的未提交更改保存起来,使你的工作目录变得干净,以便进行其他操作。shgit stash
这个命令会将未提交的更改保存为一个栈中的堆栈帧(stash),并将你的工作目录和暂存区恢复到干净的状态。
git stash pop
:
git stash pop
用于从栈中恢复最近的 stash,并将其从 stash 栈中删除。它会自动应用 stash,并尝试将你的本地更改合并到 stash 之前的提交上。shgit stash pop
这个命令相当于同时运行
git stash apply
和git stash drop
。
git stash apply
用于将 stash 中的更改应用到当前工作目录和暂存区,但并不删除 stash。git stash drop
用于删除最近的 stash。通过
git stash pop
,你可以一次性完成这两个步骤。示例:
使用
git stash
:sh# 将未提交的更改保存到 stash git stash
进行其他操作:
在这一步,你可以切换分支、拉取最新的代码、合并分支等。
使用
git stash pop
:sh# 恢复最近的 stash,并应用到当前分支 git stash pop
或者,你也可以使用
git stash apply
和git stash drop
来分别应用 stash 和删除 stash:sh# 恢复最近的 stash git stash apply # 删除最近的 stash git stash drop
4、推送代码
1、命令推送
sh
# 全部推送
git push
git push origin
# 提交了多次 指定推送
## 查看提交记录 拿出hash值
git log
# 推送
git push origin 008949bb2e3cdb560e709d175832e31e8edd65da:main(分支名)
git push
:
git push
会将当前分支的本地更改推送到与之关联的远程分支。- 如果当前分支与远程分支有关联(例如,使用
git branch --set-upstream-to
或git push -u
),那么git push
将推送到关联的远程分支。例如,如果当前分支是main
,而与之关联的远程分支是origin/main
,则git push
将推送到origin/main
。- 如果当前分支没有明确与远程分支关联,
git push
将会失败并给出相应的错误信息。示例:
shgit push
git push origin
:
git push origin
是显式指定要推送到的远程仓库。你可以提供一个远程仓库的名称(例如origin
)以及一个分支名称,以明确要推送到的远程分支。- 这种方式允许你推送到非关联的远程分支,或者推送到远程仓库的不同分支。
示例:
shgit push origin main
git branch --set-upstream-to
命令用于设置当前本地分支与远程分支的关联。在 Git 中,一个本地分支可以与远程分支建立关联,以便更方便地进行推送和拉取操作。下面是该命令的基本用法:
shgit branch --set-upstream-to=remote-branch local-branch
其中:
remote-branch
是远程分支的名称。local-branch
是本地分支的名称。这个命令的目的是告诉 Git,将本地分支
local-branch
与远程分支remote-branch
关联起来。一旦关联建立,你就可以使用git push
和git pull
,而不需要每次都指定远程分支的名称。示例:
sh# 假设当前分支是 main,想要将其关联到远程分支 origin/main git branch --set-upstream-to=origin/main main
之后,你可以直接使用
git push
和git pull
,Git 将根据关联的远程分支进行操作。sh# 推送本地更改到关联的远程分支 git push # 从关联的远程分支拉取更新 git pull
注意:在较新的 Git 版本中,
--set-upstream-to
也可以用-u
替代,如下所示:shgit branch -u origin/main main
2、IDEA推送
一次推送
提交了多次选择性推送
7、SSH拉取代码
SH
# 在终端中执行 一直回车就行
ssh-keygen
将公钥复制到GitLab中
再使用SSH地址拉取代码即可
8、创建分支
1、命令操作
sh
# 新建分支
git branch dev
# 新建一个分支,并切换到该分支
git checkout -b dev1
# 推送分支
git push --set-upstream origin dev1
sh
# 列出所有本地分支
$ git branch
# 列出所有远程分支
$ git branch -r
# 列出所有本地分支和远程分支
$ git branch -a
# 新建一个分支,但依然停留在当前分支
$ git branch [branch-name]
# 新建一个分支,并切换到该分支
$ git checkout -b [branch]
# 新建一个分支,指向指定commit
$ git branch [branch] [commit]
# 新建一个分支,与指定的远程分支建立追踪关系
$ git branch --track [branch] [remote-branch]
# 切换到指定分支,并更新工作区
$ git checkout [branch-name]
# 切换到上一个分支
$ git checkout -
# 建立追踪关系,在现有分支与指定的远程分支之间
$ git branch --set-upstream [branch] [remote-branch]
# 合并指定分支到当前分支
$ git merge [branch]
# 选择一个commit,合并进当前分支
$ git cherry-pick [commit]
# 删除分支
$ git branch -d [branch-name]
# 删除远程分支
$ git push origin --delete [branch-name]
$ git branch -dr [remote/branch]
2、IDEA操作
9、合并分支
1、命令操作
sh
# 修改dev2分支内容并推送到远程
sh
# 切换为dev1分支
git checkout dev1
# 也可以
git switch dev1
# 合并dev2代码
git merge dev2
2、IDEA操作
我们将dev2
的代码合并到dev
分支,所以要先切换为dev
分支
再选择dev2
分支并点击merge
10、冲突解决
1、命令操作
同时修改dev1
和dev2
的同一个文件
切换到dev2
,修改后再合并dev1
sh
git merge dev1
Updating 0a3ec3a..024f51d
error: Your local changes to the following files would be overwritten by merge:
Test02.java
Please commit your changes or stash them before you merge.
Aborting
# 我们可以先暂存
git stash
git merge dev1
# 再恢复本地
git stash pop
再同时修改dev1
和dev2
的同一个文件
修改了dev1
分支的代码并推送
切换为dev2
分支修改了并推送
sh
git commit . -m '修改dev2'
# 推送
git push
再合并dev1
分支代码
sh
git merge dev1
sh
# 此时需要手动编辑文件
git add Test02.java
git commit -m '解决冲突'
git push
2、IDEA操作
idea在操作合并的时候会出现merge弹窗
11、回滚代码
1、命令操作
使用 git reset
或 git revert
命令。这两个命令的主要区别在于它们的影响范围和对历史记录的处理方式。
- 使用
git reset
回滚:
sh
# 回滚到指定版本(commit-hash 为目标版本的 commit 哈希值)
git reset --hard commit-hash
这将移动你的 HEAD 和当前分支指针到指定版本,并将工作目录和暂存区都恢复到目标版本的状态。请注意,--hard
参数表示丢弃工作目录和暂存区的所有更改,慎用。
- 使用
git revert
回滚:
sh
# 创建一个新的撤销提交以回滚到指定版本
git revert commit-hash
这将创建一个新的提交,该提交的变更是将目标版本的更改撤销掉。相比于 git reset
,git revert
是一种更安全的方式,因为它不会修改历史记录,而是创建一个新的提交来撤销之前的提交。
2、IDEA操作
12、.gitignore文件
如果我们有不想提交的文件可以配置到这个文件当中,放到根目录下即可
xml
# Compiled class file
*.class
# Log file
*.log
# BlueJ files
*.ctxt
# Mobile Tools for Java (J2ME)
.mtj.tmp/
# Package Files #
*.jar
*.war
*.nar
*.ear
*.zip
*.tar.gz
*.rar
*.iml
*.ipr
*.iws
# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
hs_err_pid*
#.idea
.idea/
target/
.gitlab-ci.yml
.mvn/
13、仓库备份与还原
sh
# 旧GitLab服务器备份
sudo gitlab-rake gitlab:backup:create
默认日志保存路径 /var/opt/gitlab/backups
sh
# 新GitLab服务器还原
gitlab-rake gitlab:backup:restore BACKUP= 文件名
# 注意等于号后面有一个空格