如何去使用 git 进行协同开发?+ 使用 Docker 部署 Gogs
目录

Git 是一种分布式版本控制系统,用于管理软件项目的源代码,使用 Git 可以追踪代码的历史修改记录,方便团队协作、代码共享和代码重构。
集中式和分布式版本控制系统的区别?
集中式版本控制系统的版本库是集中存放在中央服务器的,因为干活的时候用的都是自己的电脑,所以要先从中央服务器取得最新的版本,然后开始干活,干完活了,再把自己的代码推送给中央服务器,最大的毛病就是必须联网才能工作。
而分布式版本控制系统根本没有“中央服务器”,每个人的电脑上都是一个完整的版本库(也就是本地仓库),这样在工作的时候就不需要联网了,因为版本库(也就是本地仓库)就在自己的电脑上。既然每个人电脑上都有一个完整的版本库,那多个人如何协作呢?比方说你在自己电脑上改了文件A,你的同事也在他的电脑上改了文件A,这时,你们俩之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。
Git 入门
我们一般在使用git去协同开发之前,需要建议一个自己的仓库(repository),用于存储代码和版本历史记录。
参考:Git教程
https://liaoxuefeng.com/books/git/introduction/index.html
上图是gitee创建仓库代码,流程如下:
1.创建目录
mkdir smart-dbsystem
cd smart-dbsystem
2.初始化 Git
我们需要在本地搭建一个本地仓库(也就是版本库),可以简单理解成一个目录,这个目录里面的所有文件都可以被 Git 管理起来,每个文件的修改、删除,Git 都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”。
而搭建本地仓库很简单,只需要在电脑上运行 git init:
git init
瞬间 Git 就把仓库建好了,而且告诉这是一个空的仓库(empty Git repository),细心的读者可以发现当前目录下多了一个 .git 的目录,这个目录是Git来跟踪管理版本库的,没事千万不要手动修改这个目录里面的文件,不然改乱了,就把 Git 仓库给破坏了。
3.新建 README.md
touch README.md
4.提交到本地
在git有四块区域:
工作区(Working Directory)
↓ git add
暂存区(Stage / Index)
↓ git commit
本地仓库/版本库(Local Repository)
↓ git push (把本地仓库 → 远程仓库)
远程仓库(Remote Repository)
我们写代码是在工作区(就是在电脑里能看到的目录),但 Git 不会直接把我们的乱涂乱改写进历史,那样历史会变成一锅乱炖,所以就需要有暂存区(保存在 .git/index)。而 git add 命令实际上就是把要提交的所有修改放到暂存区,然后执行 git commit 就可以一次性把暂存区的所有修改提交到分支:
git add <file>
git commit -m "描述信息"
同样可以使用 git add . 命令去将所有变更添加到暂存区。
git add .
一旦提交后,如果你又没有对工作区做任何修改,那么工作区就是“干净”的:
$ git status
On branch master
nothing to commit, working tree clean

如果需要撤销某个提交,可以使用 git revert 命令来创建一个新的提交,该提交将会抵消先前的提交效果。
git revert
可以使用 git log 查看从最近到最远的提交日志:
git log --pretty=oneline
如果想回退上一个版本需使用 git reset,--hard 会回退到上个版本的已提交状态,--soft 会回退到上个版本的未提交状态,--mixed 会回退到上个版本已添加但未提交的状态:(1094a 是 commit id 也就是版本号)
git reset --hard 1094a
这里 git reflog 可以用来记录每一次命令:
$ git reflog
e475afc HEAD@{1}: reset: moving to HEAD^
1094adb (HEAD -> master) HEAD@{2}: commit: append GPL
e475afc HEAD@{3}: commit: add distributed
eaadf4e HEAD@{4}: commit (initial): wrote a readme file
但假设我们的流程如下:第一次修改 -> git add -> 第二次修改 -> git commit
当使用 git add,在工作区的第一次修改被放入暂存区准备提交,但是在工作区的第二次修改并没有放入暂存区,所以 git commit 只负责把暂存区的修改提交了,也就是第一次的修改被提交了,第二次的修改不会被提交。
所以我们需要将第二次修改在提交一遍:第一次修改 -> git add -> 第二次修改 -> git add -> git commit
但是如果我们想丢弃工作区的修改,可以使用 git checkout(例如将 readme.txt 文件在工作区的修改全部撤销),让这个文件回到最近一次 git add 或 git commit 时的状态:
git checkout -- readme.txt
如果我们发现修改只是添加到了暂存区,还没有提交,可以使用 git reset HEAD <file>:(git reset 命令既可以回退版本,也可以把暂存区的修改回退到工作区)
$ git reset HEAD readme.txt
Unstaged changes after reset:
M readme.txt
要想从本地仓库中删除该文件,可以使用 git rm 命令在工作区与暂存区删掉文件,然后使用 git commit 提交到本地仓库:
$ git rm test.txt
rm 'test.txt'
$ git commit -m "remove test.txt"
[master d46f35e] remove test.txt
1 file changed, 1 deletion(-)
delete mode 100644 test.txt
5.绑定远程仓库
我们在本地创建了一个 Git 仓库后,又想在 Gitee 创建一个Git仓库,并且让这两个仓库进行远程同步,需要使用下面命令建立连接,意思是为当前本地 Git 仓库添加一个别名为 origin 的远程仓库地址:(如果之前已经添加过 origin,再次执行会报错)
git remote add origin https://gitee.com/eleven-lxs/smart-dbsystem.git
可以使用 git remote -v 查看现有远程仓库:
git remote -v
6.推送到 Gitee
随后使用 git push 命令将本地仓库的代码推送到远程仓库:(推送本地 master 分支到 origin)
git push -u origin "master'
7.克隆项目
如果想要克隆项目,需使用 git clone 命令:
git clone https://gitee.com/eleven-lxs/smart-dbsystem.git
8.分支管理
根据上面讲到的版本回退,我们已经知道每次提交,Git 都把它们串成一条时间线,这条时间线就是一个分支。截止到目前,只有一条时间线,在 Git 里,这个分支叫主分支,即 master 分支。而 HEAD 分支严格来说不是指向提交,而是指向 master,所以 HEAD 指向的就是当前分支。
每次提交时,master 分支都会向前移动一步,这样随着我们不断提交,master 分支的线也越来越长。

当我们创建新的分支 dev:(加上 -b 参数表示创建并切换)
$ git checkout -b dev
Switched to a new branch 'dev'
可以用 git branch 命令查看当前分支:
$ git branch
* dev
master
Git 就会新建了一个指针叫 dev,指向 master 相同的提交,再把 HEAD 指向 dev 就表示当前分支在 dev 上:

于是从现在开始,对工作区的修改和提交就是针对 dev 分支了,比如新提交一次后,dev 指针往前移动一步,而 master 指针不变:
$ git add readme.txt
$ git commit -m "branch test"
[dev b17d20e] branch test
1 file changed, 1 insertion(+)

那我们在 dev 分支开发完成后想将代码合并到 master 上,我们就需要直接让 master 指向 dev 的当前提交,就完成了合并。
首先切换到 master 分支:(这里使用 git switch 切换分支,加 -c 可创建并切换分支)
$ git switch master
Switched to branch 'master'
那么这时 HEAD 指向的就是 master :

之后我们使用 git merge 命令将 dev 分支代码合并到 master 分支:(该命令用于合并指定分支到当前分支)
$ git merge dev
Updating d46f35e..b17d20e
Fast-forward
readme.txt | 1 +
1 file changed, 1 insertion(+)
合并完成后,就可以放心地删除 dev 分支了,使用 git branch -d 命令:
$ git branch -d dev
Deleted branch dev (was b17d20e).
干活分支策略:(确保 master 分支稳定且仅用来发布新版本,平时不能在上面干活,如果干活可在 dev 分支上)

而要查看代码的历史提交记录,可以使用 git log 命令来获取详细信息:
git log # 显示完整的历史记录
git log --oneline # 简洁的一行摘要形式显示每个提交
git log -p <file> # 显示特定文件的每次提交详细差异
如果想将Git存储库版本回退,请使用 git reset 命令:
git reset HEAD~1
下图展示了 git 命令的使用流程:

| 命令 | 发生位置 | 作用描述 | 从哪里 → 到哪里 | 使用时机 |
|---|---|---|---|---|
| git add | 工作区 → 暂存区(Index) | 把修改加入暂存区,准备提交 | workspace → index | 当你修改了文件,想把它纳入下一次 commit |
| git commit | 暂存区 → 本地仓库(Repository) | 将暂存区内容形成一个新的版本快照 | index → local repo | 想记录一次可回滚的版本点时 |
| git checkout | 本地仓库 → 工作区 | 切换分支 / 切回某个版本 / 恢复文件 | local repo → workspace(同步到 index) | 想切分支、回退、查看旧版本内容时 |
| git clone | 远程仓库 → 本地仓库(第一次使用) | 下载整个远程仓库,并自动建好工作区 | remote → local repo + workspace | 第一次下载某项目到本地时 |
| git fetch | 远程仓库 → 本地仓库(不更新工作区) | 获取远程最新信息但不合并 | remote → local repo | 想先查看远程改动再决定是否合并 |
| git pull | 远程仓库 → 本地仓库 → 工作区 | fetch + merge(自动更新工作区) | remote → local repo → workspace | 想同步远程最新代码时 |
| git push | 本地仓库 → 远程仓库 | 把本地提交推到远程,让别人也能看到 | local repo → remote | 你 commit 之后,想上传到远程平台时 |
.git 与 .gitignore
.git 是 Git 仓库的核心目录,当运行 git init 或者 git clone 时,Git 就会自动创建目录,它的结构如下:
| 文件/目录 | 作用 |
|---|---|
HEAD | 指向当前所在分支(如 ref: refs/heads/main) |
config | 仓库级别的配置(如 remote 地址、用户信息等) |
description | 仓库描述(通常用于 GitWeb) |
index | 暂存区(Staging Area),记录哪些文件被 git add |
objects/ | 对象数据库,存储所有 blob(文件)、tree(目录结构)、commit(提交)、tag 等 |
refs/ | 引用目录,包含分支(heads/)、标签(tags/)、远程跟踪分支(remotes/) |
hooks/ | Git 钩子脚本(如 pre-commit、post-merge) |
logs/ | 分支和 HEAD 的变更历史(用于 git reflog) |
而 .gitignore 是用于告诉 Git 哪些文件不要跟踪,它不会影响已经跟踪的文件(即已经 git add 过的文件),只对未跟踪的文件生效。

例如 IntelliJ IDEA 开发 Spring Boot 的 .gitignore:
.idea/
*.iws
*.iml
*.ipr
target/
build/
*.log
*.db
*.sqlite
.env
*.env
config/secrets.properties
config/application-local.yml
config/application-dev.yml
*.class
*.jar
*.war
*.ear
*~
*.bak
*.tmp
如果已经不小心把 application-local.yml 或 .idea/ 提交过,需要先用 git rm --cached 移除跟踪:
git rm -r --cached .idea
git rm --cached application-local.yml
git add .gitignore
git commit -m "fix: ignore IDE and local config files"
使用Docker部署Git服务器 Gogs
Gogs(Go Git Service)是一个轻量级、自托管的 Git 服务,用 Go 语言编写,功能类似于 GitHub、GitLab,但资源占用更少、部署更简单。它支持 Web 界面管理仓库、用户、组织、SSH/HTTP 克隆、Issue、Pull Request(合并请求)、Webhook 等核心功能,非常适合个人或小团队搭建私有 Git 服务器。

Gogs: A painless self-hosted Git service
https://gogs.io/getting-started/introduction
下面我们在 Linux 上使用 Docker 搭建 Gogs:
首先拉取镜像:
docker pull gogs/gogs:latest
之后创建并授权部署目录:
mkdir -p /data/gogs/{data,log} && cd /data/gogs/
chown -R 1000:1000 /data/gogs
使用 docker 部署,可参考以下命令:(--restart 参数用于配置容器的自动重启策略,即当 Docker 守护进程启动或容器意外退出时(除手动停止外,其他情况都重启),是否以及如何自动重新启动该容器。)
docker run -d \
--name gogs \
--restart unless-stopped \
--publish 3200:3000 \
--publish 4200:22 \
--volume /data/gogs/data:/data \
--volume /data/gogs/log:/app/gogs/log \
--volume /etc/localtime:/etc/localtime:ro \
--user 1000:1000 \
gogs/gogs:latest
参考:【Docker项目实战】使用Docker部署Git服务器Gogs - 知乎
https://zhuanlan.zhihu.com/p/1957079311484948913
更多推荐

所有评论(0)